๐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
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
์ฟผ๋ฆฌ ๋ฉ์๋ 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
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๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด 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
์์ฑ์ injection์ ์ฐ๋๊ฒ ์ข๋ค ์์ฑ์ injection์ ํ๋ฉด setter๋ก entity๋ฅผ ๋ฐ๊พธ๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค ์์ฑ์๊ฐ ํ๋๋ง ์๋๊ฒฝ์ฐ @Autowired๋ฅผ ์๋ตํด๋ ๋๋ค MemberRepository๋ ๋ณ๊ฒฝ๋ ์ผ์ด ์๊ธฐ ๋๋ฌธ์ final๋ก ํด์ฃผ๋๊ฒ ์ข๋ค test case๋ฅผ ์์ฑํ ๋ ์ปดํ์ผ ๋จ๊ณ์์ injection์ ๋ช
ํํ๊ฒ ์ ์ ์๋ค ( ์๋ ์ฝ๋์ ๊ฐ์ด ) @RequiredArgsConstructor final์ด ์๋ ํ๋๋ง์ ๊ฐ์ง๊ณ ์์ฑ์๋ฅผ ๋ง๋ค์ด ์ค๋ค ๊ฒฐ๊ตญ ์๋์ผ๋ก ์์ฑ์๋ฅผ ํ๋ ๋ง๋ค๊ณ injection์ ๋ฐ์ ์ ์์ @PersistenceContext -> @Autowired @PersistenceContext ๋ฅผ @Autowired๋ก ๋์ฒดํ ์ ์์ (SpringBo..
๐ORM:JPA
@Transactional JPA๋ฅผ ์ฌ์ฉํ๋ฉด ํญ์ ํธ๋์ญ์
์์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค. ํธ๋์ญ์
์์ด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์์ธ๊ฐ ๋ฐ์ @Transactional(readOnly=true) ์กฐํํ๋ ๊ณณ(์ฝ๊ธฐ ๋์)์ ์์ฑํด์ฃผ๋ฉด ์ฑ๋ฅ์ ์ต์ ํ ํ ์ ์์ ์ฐ๊ธฐ์์๋ X ํด๋์ค ์ต์๋จ์ @Transactional(readOnly=true) ๋ฅผ ์ ์ด์ฃผ๊ณ , ์ฐ๊ธฐํ๋ ๊ณณ์๋ @Transactional์ ์ ์ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ ํ์