๐พORM:JPA
์ปฌ๋ ์
ํ์
๊ฒฐ๊ณผ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ๋น ์ปฌ๋ ์
์ ๋ฐํํด์ค๋ค. (null์ ๋ฐํํ์ง ์์!) ๋ฐ๋ผ์ !=null ๊ณผ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ํด์ค ํ์๊ฐ ์๋ค. ๋จ๊ฑด ์กฐํ ๊ฒฐ๊ณผ๊ฐ์ด ์๋ ๊ฒฝ์ฐ null์ ๋ฐํํ๋ค (์์ํ jpa์ ๊ฒฝ์ฐ javax.persistence.NoResultException ์์ธ ๋ฐ์) ๊ฒฐ๊ณผ๊ฐ 2๊ฑด ์ด์์ธ ๊ฒฝ์ฐ javax.persistence.NonUniqueResultException ์์ธ ๋ฐ์
๐พORM:JPA
ToOne ๊ด๊ณ๋ ๋ชจ๋ fetch joinํ์ฌ ์ฑ๋ฅ ์ต์ ํ ( ํ์ด์ง ์ฟผ๋ฆฌ์ ์ํฅ์ ๋ฏธ์น์ง ์์์ ) ์ปฌ๋ ์
์ fetch join ํ์ง ์๊ณ ์ง์ฐ๋ก๋ฉ์ผ๋ก ์กฐํ ์ปฌ๋ ์
์ ์ง์ฐ๋ก๋ฉ ์ฑ๋ฅ ์ต์ ํ + ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ์ํด hibernate.default_batch_fetch_size ํน์ @BatchSize๋ฅผ ์ฌ์ฉ hibetnate.default_batch_fetch_size, @BatchSize ์ปฌ๋ ์
์ด๋, ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํ๊บผ๋ฒ์ ์ค์ ํ size๋งํผ IN ์ฟผ๋ฆฌ๋ก ์กฐํํ๋ค.
๐พORM:JPA
์ปฌ๋ ์
(์ผ๋๋ค) ์์ fetch join์ 1๊ฐ๋ง ์ฌ์ฉํด์ผ ํ๋ค! ๋ฐ์ดํฐ๊ฐ ๋ถ์ ํํ๊ฒ ์กฐํ๋ ์ ์๊ธฐ ๋๋ฌธ fetch join์ ์ฌ๋ฌ๊ฐ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ - Order ํด๋์ค ๋ด๋ถ์ ์ผ๋๋ค ๊ด๊ณ์ ๋ํ ํ๋๊ฐ 2๊ฐ์ธ ๊ฒฝ์ฐ - Order ํด๋์ค ๋ด๋ถ์ ์ผ๋๋ค ๊ด๊ณ์ ๋ํ ํ๋๊ฐ 1๊ฐ๊ณ , ๊ทธ ํ๋์ ๊ฐ์ฒด ๋ด๋ถ์ ์ผ๋๋ค ๊ด๊ณ์ ์๋ ํ๋๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ปฌ๋ ์
(์ผ๋๋ค) fetch join์ ์ฌ์ฉํ๋ฉด ํ์ด์ง์ด ๋ถ๊ฐ๋ฅํ๋ค Hibernate๊ฐ ๊ฒฝ๊ณ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ฉด์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ db์์ ์ฝ์ด์จ ๋ค, ๋ฉ๋ชจ๋ฆฌ(=์ดํ๋ฆฌ์ผ์ด์
๋จ)์์ ํ์ด์ง์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.(out of memory๊ฐ ๋ฐ์ํ ์ ์์) distinct๋ก ์ค๋ณต๋ฐ์ดํฐ ์ ๊ฑฐ ์ปฌ๋ ์
(์ผ๋๋ค) fetch join์ ์ค๋ณต ๋ฐ์ดํฐ๊ฐ ๋ฐ์ํ๋๋ฐ, distinct ๋ช
๋ น์ผ๋ก..
๐พORM:JPA
์คํ๋ง ๋ถํธ๋ Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ด๋ฅผ ํตํด json ๋ฐ์ดํฐ๋ค์ ์ง๋ ฌํ / ์ญ์ง๋ ฌํ ์์
์ ์งํํ๋ค. ์ด๋ฌํ ์ง๋ ฌํ๋ฅผ ์ํด getter๋ฅผ ์์ฑํด์ค์ผ ํ๋ค
๐พ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์ ๋ฐ์ด..
๐พORM:JPA
์ค์์ ์ํฐํฐ ์์์ฑ ์ปจํ
์คํธ๊ฐ ๋๋ ๊ด๋ฆฌํ์ง ์๋ ์ํฐํฐ ์์์ฑ ์ปจํ
์คํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค ๊ธฐ์กด ์๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ์์๋ก ๋ง๋ค์ด๋ธ ์ํฐํฐ ์ค์์ ์ํฐํฐ๋ฅผ ๋ง๋๋ 3๊ฐ์ง ๋ฐฉ๋ฒ em.detach(entity) : ํน์ ์ํฐํฐ๋ง ์ค์์ ์ํ๋ก ์ ํ em.clear() : ์์์ฑ ์ปจํ
์คํธ๋ฅผ ์์ ํ ์ด๊ธฐํ em.close() : ์์์ฑ ์ปจํ
์คํธ๋ฅผ ์ข
๋ฃ ์ค์์ ์ํฐํฐ๋ฅผ ์์ ํ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ ๋ณ๊ฒฝ ๊ฐ์ง ๊ธฐ๋ฅ (์ ํธ) em.find๋ก ์กฐํํ ์ํฐํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ ๋ณํฉ(merge) ์ฌ์ฉ em.merge๋ฅผ ์คํ ์์ ์ํฐํฐ์ ๊ฐ์ ์ค์์ ์ํฐํฐ์ ๊ฐ์ผ๋ก ๋ชจ๋ ๊ต์ฒดํจ (๋ณํฉ์ ๊ฐ์ด ์์ผ๋ฉด null๋ก ์
๋ฐ์ดํธ ํ ์ํ๋ ์์) ์๋ก์ด ์์ ์ํ์ ์ํฐํฐ๋ฅผ ๋ฐํํจ ( ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ์ํฐํฐ๋ ..