๐ Fetch Join์ ํ๊ณ
ํ์น ์กฐ์ธ์ ์ฐ๋ฉด ์ฐ๊ด๋ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ค ๊ฐ์ ธ์์ผ ํ๋ค!
๋ง์ฝ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ฌ ๊ฒฝ์ฐ Collection์ ์ ์ฒด ๋ฐ์ดํฐ๊ฐ ๋ด๊ธฐ์ง ์๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ง ๋ด๊ธด ๋ค์ ์์ํ ๋์ด๋ฒ๋ฆฐ๋ค. ์ด ๋ ๋ค๋ฅธ ๊ณณ์์ ํด๋น Collection์ ํธ์ถ ํ ๊ฒฝ์ฐ ์ ์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ์ง ๋ชปํ๊ฒ ๋๋ค. JPA์ Fetch Join ๋ชฉ์ ์์ฒด๋ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ์ค๊ณ ๋ ๊ฒ์์ ์ ์ํ์.
๋ ์ด์์ Collection์ Fetch Join ํ๋ฉด ์๋๋ค!
๋ฐ์ดํฐ๊ฐ ๋ปฅํ๊ธฐ ๋๋ค. ๊ณฑํ๊ธฐ ๊ณฑํ๊ธฐ๊ฐ ๋์ด์ ๋ฐ์ดํฐ๊ฐ ์์์น ๋ชปํ๊ฒ ๋์ด๋ ์ ์๋ค.
Collection์ Fetch Joinํ๋ฉด ํ์ด์ง ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
์ผ๋์ผ, ๋ค๋์ผ์ ํ์ด์ง์ ์ธ ์ ์๋ค. (๋ฐ์ดํฐ ๋ปฅํ๊ธฐ๊ฐ ์๋๊ธฐ ๋๋ฌธ์) ๊ทธ๋ฐ๋ฐ ์ผ๋๋ค๋ ํ์ด์ง ๊ธฐ๋ฅ์ ์ธ ์ ์๋ค.

์์ ๊ฐ์ ๊ฒฝ์ฐ TeamId๊ฐ 1์ธ๋ฐ์ดํฐ๊ฐ 2๊ฑด์ด ๋์ค๋๋ฐ ๋ง์ฝ ํ์ด์ง ์ฌ์ด์ฆ๊ฐ 1์ด๋ฉด 2๊ฐ๊ฐ ์๋ 1๊ฐ์ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๊ฒ ๋๋ค. ๊ทธ๋ผ Team1 ์ ํ์์ด 1๋ช ๋ฐ์ ์๋ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค. ๋๋ฌธ์ ์ผ๋๋ค์์ ํ์ด์ง์ ์ฐ๋ฉด ์๋๋ค.

๋ง์ ํ์ด์ง์ ์งํํ๊ฒ ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํ์ด์ง์ ์ฒ๋ฆฌํ๊ฒ ๋๋๋ฐ, ์ด๋ฅผ ๋ค์ ๋งํ์๋ฉด DB์์ ํ์ด์ง ๋จ์๋ก ์๋ผ ๊ฐ์ ธ์ค๋๊ฒ ์๋ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๋ ๊ฒ์ด๋ค. (์ฅ์ ๋๊ธฐ ๋ฑ ์ฌ์ด ์ ํ)
ํ์ด์ง์ ์ฌ์ฉํ๋ ค๋ฉด
- ๋ฐฉํฅ์ ๋ค์ง์ด์ ํ์ด ์๋ ๋ฉค๋ฒ๋ฅผ ๊ธฐ์ค์ผ๋ก ์กฐํ
- ๋ฐฐ์น ์ฌ์ด์ฆ ํ์ฉ! (๊ธ๋ก๋ฒ ์ ํ ์ผ๋ก ํ์ฉ๋ ๊ฐ๋ฅ)

๐ Fetch Join์ ํน์ง
์ํฐํฐ์ ์ง์ ์ ์ฉํ๋ (Lazy Loading ๊ฐ์ ์ค์ ๋ณด๋ค ์ฐ์ ์ ๋๋๊ฒ ํ์น ์กฐ์ธ!
JPA์ ์ฑ๋ฅ ๋ฌธ์ ๋ N+1์์ ๋น๋กฏ๋๋๋ฐ ๊ฑฐ์ ๋ชจ๋ ๊ฒฝ์ฐ Fetch Join์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅ
ํ์น ์กฐ์ธ์ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์ ์งํ ๋ ์ฌ์ฉํ๋ฉด ํจ๊ณผ์ ์ด๋ค.
๋ง์ฝ! ์ฌ๋ฌ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ ์ํฐํฐ๊ฐ ๊ฐ์ง ๋ชจ์์ด ์๋ ์ ํ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ผ ํ๋ค๋ฉด ํ์น ์กฐ์ธ ๋ณด๋ค๋ ์ผ๋ฐ ์กฐ์ธ
์ ์ฌ์ฉํ๊ณ ํ์ํ ๋ฐ์ดํฐ๋ค๋ง ์กฐํํด์ DTO๋ก ๋ฐํํ๋๊ฒ ํจ๊ณผ์ ์ด๋ค.
๐ Named ์ฟผ๋ฆฌ์ ์ฅ์ (์ค๋ฌด์์๋ Spring Data JPA๋ฅผ ์ด๋ค)

๋ฌด์จ ์ฅ์ ์ด ์์๊น?
์ดํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์์ ์ ์ด๊ธฐํ ํ๋ค์ ์ฌ์ฌ์ฉํ๋ค.
์ด๊ฒ ๋ฌด์จ ์๊ธฐ๋๋ฉด ์ดํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์์ ์ JPA ๋๋ ํ์ด๋ฒ๋ค์ดํธ๊ฐ SQL๋ก ํ์ฑ์ ํด์ ์บ์ํ๊ณ ์๋๋ค. JPQL๋ SQL๋ก ํ์ฑ์ด ๋์ด์ผ ๋๋๋ฐ ๋ณํํ๋ Cost๊ฐ ์๋ค. ํ์ง๋ง Named ์ฟผ๋ฆฌ๋ ๋ก๋ฉ ์์ ์ ํ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ํด๋น Cost๊ฐ ์๋ค!
์ดํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์์ ์ ์ฟผ๋ฆฌ๋ฅผ ๊ฒ์ฆํ ์ ์๋ค.
Querydsl๊ณผ ๋ค๋ฅด๊ฒ JPQL์ ์ปดํ์ผ ์์ ์ ์์ฑํ JPQL์ ์ค๋ฅ๋ฅผ ๊ฒ์ฆํ ์ ์๋ค. ํ์ง๋ง Named์ฟผ๋ฆฌ๋ ์ดํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์์ ์ ์ด๊ฒ์ ์ก์ ์ค ์ ์๋ค.
โ ์ปดํ์ผ๊ณผ ์ดํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์์ ์ ์ฐจ์ด๋?
์ปดํ์ผ์ ์์ค ์ฝ๋๋ฅผ ์คํ ๊ฐ๋ฅํ ํํ๋ก ๋ณํํ๋ ๊ฒ์ ์๋ฏธ
์ดํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ์ ์คํ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๊ณ ์ด๊ธฐํ ํ๋ ์์ ์ ์๋ฏธ
์ฆ ์ ๋ฆฌํ์๋ฉด ์ปดํ์ผ โ ์ดํ๋ฆฌ์ผ์ด์
๋ก๋ฉ โ ๋ฐํ์
์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
๐ ๋ฒํฌ์ฑ ์์ ์ฟผ๋ฆฌ

์์ JPA์์ ExecuteUpdate()๋ฅผ ํ์ฉํ ๋ฒํฌ ์์ (๋ณ๊ฒฝ ๊ฐ์ง ๊ธฐ๋ฅ ์ฌ์ฉ ์ ์ฟผ๋ฆฌ ๋ฌด์ง๋ง์ง ํ๊ฒ ๋๊ฐ๋ ํ์ ๋ฐฉ์ง)
Spring Data JPA์์๋ ์ด๋ป๊ฒ ํ ๊น?

์ด๋ฐ์์ผ๋ก Query์ Modifying ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ฃผ๋ฉด ExecuteUpdate() ๊ฐ ์ ์ฉ๋๋ค!
๊ทธ๋ฐ๋ฐ ๋ง์ฝ Modifying์ ๋นผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?

์๋ฐ ์๋ฌ ๋ฉ์ธ์ง๊ฐ ๋จ๊ฒ ๋๋ค.
๊ทธ๋ฐ๋ฐ JPA์์๋ ๋ฒํฌ์ฑ ์ฐ์ฐ์ ์กฐ์ฌํด์ผ ํ๋ค. ์?
๋ฒํฌ ์ฐ์ฐ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ฌด์ํ๊ณ ๋ฐ๋ก DB์ SQL์ ๋๋ ค๋ฒ๋ฆฌ๋ ๋ก์ง์ด๋ค. ์ด๋ฅผ ๋ค์ ๋งํ์๋ฉด, ๋ฒํฌ ์ฐ์ฐ์ ๋๋ฆฌ๊ณ ๋ ๋ค์ ์์์ฑ ์ปจํ ์คํธ์ ์๋ ์์๋ฅผ ํ๋ ์กฐํํ๋ค๋ฉด? ์ ๋ฐ์ดํธ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ์ ์๋ค๋ ๋ง์ด๋ค.

member ๋์ด๋ 1์ด ์ถ๊ฐํ๊ณ ์กฐํํ๋ค๋ฉด? ์ด๋ป๊ฒ ๋ ๊น? ์๋ณด๋ฉด ์ค๊ฐ์ ๋ฒํฌ ์ฐ์ฐ์ ๋ ๋ฆฌ๋ ๊ฒ์ ์ ์ ์๋ค. ์ ๊ฑฐ ์กฐํํด๋ณด๋ฉด 40์ด ๊ทธ๋๋ก ๋์จ๋ค. ์? db์๋ ๋์ด๊ฐ ์ ๋ฐ์ดํธ ๋์์ง๋ง, ์์์ฑ ์ปจํ ์คํธ๋ ์์ง ๋ฐ์์ด ์๋์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ํด์ผํด?

๋ฒํฌ ์ฐ์ฐ์ ๋ ๋ฆฐ ๋ค ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ ๋ ค์ค์ผ ํ๋ค. ๊ทธ๋ฌ๋ฉด ์์์ฑ ์ปจํ ์คํธ์ ์ํฐํฐ๊ฐ ๋ค ๋น์์ง๊ฒ ๋๊ฒ ์ง? ๊ทธ๋ผ ๋ค์ member๋ฅผ ์กฐํํ๊ฒ ๋๋ฉด db์ ์ ๊ทผํ์ฌ ์ ๋ฐ์ดํธ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค!
๋ฒํฌ ์ฐ์ฐ์ em.flush / em.clear ๊ผญ ํด์ฃผ์!
๊ทผ๋ฐ Spring Data Jpa๋ ์ด ์ฒ๋ฆฌ๋ฅผ ๋์ ํด์ ํ ์ ์๋ค! Modifying์ ์ต์ ์ ์ฃผ๋ฉด ๋๋ค.

ClearAutomatically = true ์ต์ ์ ์ฃผ๋ฉด em.flush์ ๊ฐ์ ์์ ์ ์ํด์ค๋ ๋๋ค!
๐ ํ์ด์ง ํ๊ณ ๋ํ
์ผ ๋ ๋ค ๊ด๊ณ๋ Fetch Join ์ ํ ๊ฒฝ์ฐ ํ์ด์ง ์ฒ๋ฆฌ๊ฐ ๋์ง ์๋๋ค. ์ด๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐ ํ ๊น?
ํด๊ฒฐ ๋ฐฉ๋ฒ
- ๋จผ์ ToOne ๊ด๊ณ๋ฅผ ๋ชจ๋ ํ์น์กฐ์ธ ํ๋ค. (row์๊ฐ ๋๊ฐ โ ํ์ด์ง ์ฟผ๋ฆฌ์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฏ๋ก)
- ์ปฌ๋ ์ ์ ์ง์ฐ ๋ก๋ฉ์ผ๋ก ์กฐํํ๋ค.
- ์ง์ฐ ๋ก๋ฉ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด BatchSize๋ฅผ ์ ์ฉํ๋ค
BathSize๋ 100 ~ 1000 ์ฌ์ด๋ฅผ ์ถ์ฒ
๐ ์ํฐํฐ ์กฐํ๊ฐ ๊ถ์ฅ ๋๋ ์ด์
ํ์น ์กฐ์ธ์ ์ธ ์ ์๋ค. ์ฝ๋๋ฅผ ๊ฑฐ์ ์์ ํ์ง ์๊ณ ์ต์ ๋ง ๋ณ๊ฒฝํ์ฌ ๋ค์ํ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์๋ํ ์ ์๋ค. DTO ์กฐํ ๋ฐฉ์์ ์ฟผ๋ฆฌ ๊ฐ์ ์ฐ์ด์ ๊ฐ์ ธ์ค๋ ๋ฐฉ์ (์ํฐํฐ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋) ์ฑ๋ฅ ๋ณ๊ฒฝํ ์ ๋ง์ ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ค.
'DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ง์ดํ์ด์ง ์ฟผ๋ฆฌ ์ฑ๋ฅ ์ ๊ฒ (1) | 2023.08.28 |
---|---|
DB ์ธ๋ฑ์ค ์ค์ต (0) | 2023.05.31 |
์ตํฐ๋ง์ด์ ๋? (0) | 2023.05.19 |
DB ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ๊ฐ์ ํด๋ณด์ (0) | 2023.04.05 |
์๋ณ๊ด๊ณ์ ๋น์๋ณ๊ด๊ณ (0) | 2023.03.28 |