์ „์ฒด ๊ธ€

๐Ÿ“‚ORM:JPA

์ฟผ๋ฆฌ ๋ฐฉ์‹ ์„ ํƒ ์ˆœ์„œ

์ฟผ๋ฆฌ ๋ฐฉ์‹ ์„ ํƒ ์ˆœ์„œ 1. ์šฐ์„  ์—”ํ‹ฐํ‹ฐ๋ฅผ DTO๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒ /** * V2. ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•ด์„œ DTO๋กœ ๋ณ€ํ™˜(fetch join ์‚ฌ์šฉX) * - ๋‹จ์ : ์ง€์—ฐ๋กœ๋”ฉ์œผ๋กœ ์ฟผ๋ฆฌ N๋ฒˆ ํ˜ธ์ถœ */ @GetMapping("/api/v2/simple-orders") public List ordersV2() { List orders = orderRepository.findAll(); List result = orders.stream() .map(o -> new SimpleOrderDto(o)) .collect(toList()); return result; } 2. ํ•„์š”์‹œ fetch join์œผ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™” /** * V3. ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•ด์„œ DTO๋กœ ๋ณ€ํ™˜(fetch join ์‚ฌ์šฉO) * - fetch joi..

๐Ÿ“‚ORM:JPA

[spring-data-jpa] ํŽ˜์ด์ง•๊ณผ ์ •๋ ฌ

1. Page๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ๊ฐ€์ง€๊ณ , Pageable์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์ง€๋Š” ํ•จ์ˆ˜ ์ƒ์„ฑ 2-1. Pageable์— ๋„˜๊ฒจ์ค„ PageRequest๋ฅผ ์ƒ์„ฑ 2-2. getContent() ๋ฉ”์†Œ๋“œ๋กœ ํŽ˜์ด์ง• ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ด 2-3. getTotalElements() ๋ฉ”์†Œ๋“œ๋กœ ์ „์ฒด ๊ฒฐ๊ณผ ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ด ํŽ˜์ด์ง€ ํ•จ์ˆ˜ page.getNumber() : ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ด page.getTotalPages() : ์ „์ฒด ํŽ˜์ด์ง€ ๊ฐฏ์ˆ˜ page.isFirst() : ์ฒซ ๋ฒˆ์งธ ํŽ˜์ด์ง€์ธ์ง€ ์ฐธ/๊ฑฐ์ง“ page.hasNext() : ๋‹ค์Œ ํŽ˜์ด์ง€ ์žˆ๋Š”์ง€ ์ฐธ/๊ฑฐ์ง“ Page๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐ˜ํ™˜ํ•ด๋„ ๋œ๋‹ค(json์œผ๋กœ ๋ฐ˜ํ™˜ ๋จ) entity๋Š” dto๋กœ ๋ฐ”๊ฟ”์„œ ๋ฐ˜ํ™˜ํ•˜์ž entity๋ฅผ dto๋กœ ์‰ฝ๊ฒŒ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•

๐Ÿ“‚ORM:JPA

[spring-data-jpa] ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ 3๊ฐ€์ง€

์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ 3๊ฐ€์ง€ 1. ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์œผ๋กœ ์ฟผ๋ฆฌ ์ƒ์„ฑ 2. JPA Named Query 3. ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค์— ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ •์˜(@Query ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉ) 1๋ฒˆ์€ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์ด ๊ธธ์–ด์ง€๋ฉด ๋ฌธ์ œ๊ฐ€ ๋จ 2๋ฒˆ์€ ์‹ค๋ฌด์—์„œ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ 3๋ฒˆ์„ ์‹ค๋ฌด์—์„œ ๋งŽ์ด ์‚ฌ์šฉ 3. ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค์— ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ •์˜(@Query ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉ) ์žฅ์  : JPA Named ์ฟผ๋ฆฌ์ฒ˜๋Ÿผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ์ ์— ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Œ DTO ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ• dto์ชฝ์— ์ƒ์„ฑ์ž๊ฐ€ ์žˆ์–ด์•ผ ํ•จ new + ๋ชจ๋“  ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ + ์ƒ์„ฑ์ž ๋ฐฉ์‹์œผ๋กœ select ํ•ด์•ผ ํ•จ ์ปฌ๋ ‰์…˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค null์ด ์•„๋‹Œ result =[ ] ์ด๋‹ค. ๋‹จ, Member ํด๋ž˜์Šค ํ•˜๋‚˜์ด๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค db์— ๋ฐ์ด..

๐Ÿ“‚๋ฐฑ์—”๋“œ : BackEnd

[SpringBoot] dto์˜ ์œ„์น˜

DTO์˜ ์œ„์น˜๋Š” ํŒจํ‚ค์ง€ ์„ค๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋Š”๊ฐ€์— ๋”ฐ๋ผ ์™„์ „ํžˆ ๋‹ฌ๋ผ์ง„๋‹ค ์–ด๋–ค ๊ฒฝ์šฐ๋Š” repository ๊ณ„์ธต์— ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , service ๊ณ„์ธต์— ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€์—์„œ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ฉด ๋ณ„๋„์˜ dto ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋„ฃ์–ด๋‘ . ํŠน์ • ์„œ๋น„์Šค ๊ณ„์ธต๊นŒ์ง€๋งŒ ์‚ฌ์šฉ๋˜๋ฉด, ํ•ด๋‹น ์„œ๋น„์Šค ๊ณ„์ธต์— dtoํด๋ž˜์Šค๋ฅผ ํ•จ๊ป˜ ๋‘”๋‹ค. ํŠน์„ฑ repository ๊นŒ์ง€ ํ•ด๋‹น dto๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด ํ•ด๋‹น repository ๊ณ„์ธต์— dtoํด๋ž˜์Šค๋ฅผ ํ•จ๊ป˜ ๋‘  ๊ถ๊ทน์ ์œผ๋กœ๋Š” ํŒจํ‚ค์ง€ ์‘์ง‘๋„์™€ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ณ ๋ฏผํ•˜๋ฉด์„œ ๊ฐ€๊ธ‰์  ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์™€ ์—ฐ๊ด€์„ ์ค„์ด๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์ด ์ข‹์€ ๋ฐฉ์‹์ด๋‹ค ์ฐธ์กฐ : https://www.inflearn.com/questions/24222/dto-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC..

๐Ÿ“‚๋ฐฑ์—”๋“œ : BackEnd

[SpringBoot] 2.7.13 ์—์„œ swagger ์˜ค๋ฅ˜

SpringBoot 2.7.13์—์„œ swagger๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด dependencies๋ฅผ ์ถ”๊ฐ€ํ•œ ๋’ค ์‹คํ–‰ํ•˜์˜€์œผ๋‚˜ ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค ใ… ใ…  org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException ์ฐพ์•„๋ณด๋‹ˆ application.properties ์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค spring.mvc.pathmatch.matching-strategy=ant_path_matcher 2.6 ๋ฒ„์ „ ์ดํ›„์— spring.mvc.pathmatch.matching-str..

๐Ÿ“‚ORM:JPA

๋ณ€๊ฒฝ ๊ฐ์ง€์™€ ๋ณ‘ํ•ฉ

์ค€์˜์† ์—”ํ‹ฐํ‹ฐ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋”๋Š” ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ์—”ํ‹ฐํ‹ฐ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ–˜ ์ˆ˜ ์—†๋‹ค ๊ธฐ์กด ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ž„์˜๋กœ ๋งŒ๋“ค์–ด๋‚ธ ์—”ํ‹ฐํ‹ฐ ์ค€์˜์† ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋งŒ๋“œ๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ• em.detach(entity) : ํŠน์ • ์—”ํ‹ฐํ‹ฐ๋งŒ ์ค€์˜์† ์ƒํƒœ๋กœ ์ „ํ™˜ em.clear() : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™” em.close() : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ข…๋ฃŒ ์ค€์˜์† ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋ณ€๊ฒฝ ๊ฐ์ง€ ๊ธฐ๋Šฅ (์„ ํ˜ธ) em.find๋กœ ์กฐํšŒํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ • ๋ณ‘ํ•ฉ(merge) ์‚ฌ์šฉ em.merge๋ฅผ ์‹คํ–‰ ์˜์† ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’์„ ์ค€์˜์† ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’์œผ๋กœ ๋ชจ๋‘ ๊ต์ฒดํ•จ (๋ณ‘ํ•ฉ์‹œ ๊ฐ’์ด ์—†์œผ๋ฉด null๋กœ ์—…๋ฐ์ดํŠธ ํ•  ์œ„ํ—˜๋„ ์žˆ์Œ) ์ƒˆ๋กœ์šด ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•จ ( ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ ์—”ํ‹ฐํ‹ฐ๋Š” ..

๐Ÿ“‚๋ฐฑ์—”๋“œ : BackEnd

[SpringBoot] SpringBoot ์ •๋ฆฌ

์ƒ์„ฑ์ž injection์„ ์“ฐ๋Š”๊ฒŒ ์ข‹๋‹ค ์ƒ์„ฑ์ž injection์„ ํ•˜๋ฉด setter๋กœ entity๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š”๊ฒฝ์šฐ @Autowired๋ฅผ ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค MemberRepository๋Š” ๋ณ€๊ฒฝ๋  ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— final๋กœ ํ•ด์ฃผ๋Š”๊ฒŒ ์ข‹๋‹ค test case๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ injection์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค ( ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ) @RequiredArgsConstructor final์ด ์žˆ๋Š” ํ•„๋“œ๋งŒ์„ ๊ฐ€์ง€๊ณ  ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค ๊ฒฐ๊ตญ ์ž๋™์œผ๋กœ ์ƒ์„ฑ์ž๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  injection์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ @PersistenceContext -> @Autowired @PersistenceContext ๋ฅผ @Autowired๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Œ (SpringBo..

๐Ÿ“‚ORM:JPA

@Transactional

@Transactional JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ญ์ƒ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ @Transactional(readOnly=true) ์กฐํšŒํ•˜๋Š” ๊ณณ(์ฝ๊ธฐ ๋™์ž‘)์— ์ž‘์„ฑํ•ด์ฃผ๋ฉด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ์Œ ์“ฐ๊ธฐ์—์„œ๋Š” X ํด๋ž˜์Šค ์ตœ์ƒ๋‹จ์— @Transactional(readOnly=true) ๋ฅผ ์ ์–ด์ฃผ๊ณ , ์“ฐ๊ธฐํ•˜๋Š” ๊ณณ์—๋Š” @Transactional์„ ์ ์–ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ ํ–ˆ์Œ

mc.thd
song