ํ์น ์กฐ์ธ (fetch join)
์์ฑ์ผ
ํ์น ์กฐ์ธ
ํ์น ์กฐ์ธ
์ด๋ JPQL์์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ฉฐ ์ฐ๊ด๋ ์ํฐํฐ๋ ์ปฌ๋ ์
์ SQL ํ ๋ฒ์ ํจ๊ป ์กฐํํ๋ ๊ธฐ๋ฅ์ด๋ค. SQL ์กฐ์ธ ์ข
๋ฅ ์๋๋ฉฐ JPA์์๋ง ์ฌ์ฉํ๋ค. join fetch ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ฌ์ฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
[ LEFT [OUTER] | INNER ] JOIN FETCH ์กฐ์ธ๊ฒฝ๋ก
์ํฐํฐ ํ์น ์กฐ์ธ ์์
# ๊ธฐ์กด SQL
select m.*, t.* from Member m inner join Team t on m.team_id = t.id
# JPQL
select m from Member m **join fetch** m.team
ํ์น ์กฐ์ธ์ ์ฌ์ฉํ๋ฉด ์ฐ๊ด๋ ํ ์ด๋ธ์ ํ๋ฒ์ ์กฐํ ํ ์ ์๋ค.
์ํฉ๋ง ๋ณด๋ฉด ์ฆ์๋ก๋ฉ๊ณผ ๋น์ทํ๋ค. ๊ทธ๋ฌ๋, ํ์น์กฐ์ธ์ ์ฟผ๋ฆฌ๋ฅผ ๋ด๊ฐ ์ํ๋ ๋ฐ์ดํฐ๋ง์ ํ๋ฒ์ ์กฐํํ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋ช ์์ ์ผ๋ก ๋์ ์ธ ํ์ด๋ฐ์ ์ ํ ์ ์๋ค.
๋ํ, ์ฐ๊ด๊ด๊ณ ์ค์ ์ด LAZY๋ก ๋์ด์๋ค๊ณ ํด๋ ํ์น ์กฐ์ธ์ ์ฐ์ ์ ํ๋ค.
ํ์น ์กฐ์ธ์ ์ฌ์ฉํ์ฌ 1 + N ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์ปฌ๋ ์ ํ์น ์กฐ์ธ
1:N ๊ด๊ณ์์์ ํ์น ์กฐ์ธ์ด๋ค.
select t from Team t join fetch t.members;
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ค๋ณต์ด ๋๋ค. ์ด ๊ฒฝ์ฐ distinct๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ณต์ ์ ๊ฑฐํ ์ ์๋ค. JPQL์์ distinct๋ฅผ ์ฌ์ฉํ๋ฉด SQL์์์ distinct ๊ธฐ๋ฅ ๋ฟ๋ง ์๋๋ผ, ์ํฐํฐ์ ์ค๋ณต๊น์ง ์ ๊ฑฐํด์ค๋ค.
ํ์น ์กฐ์ธ ์ฃผ์์ฌํญ
- ํ์น ์กฐ์ธ ๋์์๋ ๋ณ์นญ์ ์ค ์ ์๋ค. ํ์ด๋ฒ๋ค์ดํธ ๊ตฌํ์ฒด์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง๋ง ๊ฐ๊ธ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
- ๋ ์ด์์ ์ปฌ๋ ์ ์ ํ์น ์กฐ์ธ ํ ์ ์๋ค.
- ์ปฌ๋ ์ ์ ํ์น ์กฐ์ธํ๋ฉด ํ์ด์ง API๋ฅผ ์ฌ์ฉํ ์ ์๋ค.