ํŽ˜์น˜ ์กฐ์ธ (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 ๊ด€๊ณ„์—์„œ์˜ ํŽ˜์น˜ ์กฐ์ธ์ด๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-08-13 แ„‹แ…ฉแ„’แ…ฎ 3 47 01

select t from Team t join fetch t.members;

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ค‘๋ณต์ด ๋œ๋‹ค. ์ด ๊ฒฝ์šฐ distinct๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค. JPQL์—์„œ distinct๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด SQL์—์„œ์˜ distinct ๊ธฐ๋Šฅ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์—”ํ‹ฐํ‹ฐ์˜ ์ค‘๋ณต๊นŒ์ง€ ์ œ๊ฑฐํ•ด์ค€๋‹ค.

ํŽ˜์น˜ ์กฐ์ธ ์ฃผ์˜์‚ฌํ•ญ

  1. ํŽ˜์น˜ ์กฐ์ธ ๋Œ€์ƒ์—๋Š” ๋ณ„์นญ์„ ์ค„ ์ˆ˜ ์—†๋‹ค. ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ๊ตฌํ˜„์ฒด์—์„œ๋Š” ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ฐ€๊ธ‰์  ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  2. ๋‘˜ ์ด์ƒ์˜ ์ปฌ๋ ‰์…˜์€ ํŽ˜์น˜ ์กฐ์ธ ํ•  ์ˆ˜ ์—†๋‹ค.
  3. ์ปฌ๋ ‰์…˜์„ ํŽ˜์น˜ ์กฐ์ธํ•˜๋ฉด ํŽ˜์ด์ง• API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์นดํ…Œ๊ณ ๋ฆฌ: