๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ ๋ฐฑ์—”๋“œ/SpringBoot

[JPA] ๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด - ์ค‘๊ธ‰ ๋ฌธ๋ฒ•(2)

by OR15A 2023. 11. 27.

JPQL - ํŽ˜์น˜ ์กฐ์ธ(fetch join)

์‹ค๋ฌด์—์„œ ์ •๋ง์ •๋ง ์ค‘์š”ํ•จ

 

ํŽ˜์น˜ ์กฐ์ธ(fetch join)

  • SQL ์กฐ์ธ ์ข…๋ฅ˜X
  • JPQL์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ
  • ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋‚˜ ์ปฌ๋ ‰์…˜์„ SQL ํ•œ ๋ฒˆ์— ํ•จ๊ป˜ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ
  • join fetch ๋ช…๋ น์–ด ์‚ฌ์šฉ
  • ํŽ˜์น˜ ์กฐ์ธ ::= [ LEFT [OUTER] | INNER ] JOIN FETCH ์กฐ์ธ๊ฒฝ๋กœ

 

 

์—”ํ‹ฐํ‹ฐ ํŽ˜์น˜ ์กฐ์ธ

  • ํšŒ์›์„ ์กฐํšŒํ•˜๋ฉด์„œ ์—ฐ๊ด€๋œ ํŒ€๋„ ํ•จ๊ป˜ ์กฐํšŒ(SQL ํ•œ ๋ฒˆ์—)
  • SQL์„ ๋ณด๋ฉด ํšŒ์› ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒ€(T.*)๋„ ํ•จ๊ป˜ SELECT
  • [JPQL]
    • select m from Member m join fetch m.team 
      • select์ ˆ์— m๋งŒ ๋ช…์‹œํ•จ
      • join fetch ๊ตฌ๋ฌธ ์‚ฌ์šฉ
  • [SQL]
    • SELECT M.*, T.* FROM MEMBER M
      INNER JOIN TEAM T ON M.TEAM_ID=T.ID
      • select์ ˆ์— m์— t๊ฐ€ ์ถ”๊ฐ€
      • ์ฆ‰์‹œ๋กœ๋”ฉ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ์˜ ์ฟผ๋ฆฌ์™€ ๊ฐ™์Œ. ๋Œ€์‹  ์ด๊ฑด ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ
  • ํŽ˜์น˜ ์กฐ์ธ์œผ๋กœ ํšŒ์›๊ณผ ํŒ€์„ ํ•จ๊ผ ์กฐํšŒํ•˜๋ฉด ์ง€์—ฐ ๋กœ๋”ฉX

 

 

์ปฌ๋ ‰์…˜ ํŽ˜์น˜ ์กฐ์ธ -> 1:N ๋ปฅํŠ€๊ธฐ ๋  ์ˆ˜ ์žˆ

์ผ๋Œ€๋‹ค ๊ด€๊ณ„, ์ปฌ๋ ‰์…˜ ํŽ˜์น˜ ์กฐ์ธ
• [JPQL]
select t
from Team t join fetch t.members
where t.name = ‘ํŒ€A'
• [SQL]
SELECT T.*, M.*
FROM TEAM T
INNER JOIN MEMBER M ON T.ID=M.TEAM_ID
WHERE T.NAME = 'ํŒ€A' 

 

์ปฌ๋ ‰์…˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋ณต ์ถœ๋ ฅ๋จ

ํŽ˜์น˜ ์กฐ์ธ๊ณผ DISTINCT

SQL์˜ DISTINCT๋Š” ์ค‘๋ณต๋œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ช…๋ น
• JPQL์˜ DISTINCT 2๊ฐ€์ง€ ๊ธฐ๋Šฅ ์ œ๊ณต
• 1. SQL์— DISTINCT๋ฅผ ์ถ”๊ฐ€

ํŽ˜์น˜ ์กฐ์ธ๊ณผ DISTINCT

select distinct t
from Team t join fetch t.members
where t.name = ‘ํŒ€A’

SQL์— DISTINCT๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ SQL ๊ฒฐ๊ณผ
์—์„œ ์ค‘๋ณต์ œ๊ฑฐ ์‹คํŒจ


• 2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์—”ํ‹ฐํ‹ฐ ์ค‘๋ณต ์ œ๊ฑฐ

DISTINCT๊ฐ€ ์ถ”๊ฐ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ค‘๋ณต ์ œ๊ฑฐ์‹œ๋„

๊ฐ™์€ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง„ Team ์—”ํ‹ฐํ‹ฐ ์ œ๊ฑฐ

 

 

ํ•˜์ด๋ฒ„๋„ค์ดํŠธ6 ๋ณ€๊ฒฝ ์‚ฌํ•ญ

DISTINCT๊ฐ€ ์ถ”๊ฐ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ค‘๋ณต ์ œ๊ฑฐ์‹œ๋„
• -> ํ•˜์ด๋ฒ„๋„ค์ดํŠธ6 ๋ถ€ํ„ฐ๋Š” DISTINCT ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„
๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ค‘๋ณต ์ œ๊ฑฐ๊ฐ€ ์ž๋™์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. 

 

 

ํŽ˜์น˜ ์กฐ์ธ๊ณผ ์ผ๋ฐ˜ ์กฐ์ธ์˜ ์ฐจ์ด

์ผ๋ฐ˜ ์กฐ์ธ ์‹คํ–‰์‹œ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•จ๊ป˜ ์กฐํšŒํ•˜์ง€ ์•Š์Œ

[JPQL]
select t
from Team t join t.members m
where t.name = ‘ํŒ€A'
• [SQL]
SELECT T.*
FROM TEAM T
INNER JOIN MEMBER M ON T.ID=M.TEAM_ID 
WHERE T.NAME = 'ํŒ€A

JPQL์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์—ฐ๊ด€๊ด€๊ณ„ ๊ณ ๋ คX
• ๋‹จ์ง€ SELECT ์ ˆ์— ์ง€์ •ํ•œ ์—”ํ‹ฐํ‹ฐ๋งŒ ์กฐํšŒํ•  ๋ฟ
• ์—ฌ๊ธฐ์„œ๋Š” ํŒ€ ์—”ํ‹ฐํ‹ฐ๋งŒ ์กฐํšŒํ•˜๊ณ , ํšŒ์› ์—”ํ‹ฐํ‹ฐ๋Š” ์กฐํšŒX

ํŽ˜์น˜ ์กฐ์ธ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋„ ํ•จ๊ป˜ ์กฐํšŒ(์ฆ‰์‹œ ๋กœ๋”ฉ) 
• ํŽ˜์น˜ ์กฐ์ธ์€ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ SQL ํ•œ๋ฒˆ์— ์กฐํšŒํ•˜๋Š”  ๊ฐœ๋…

 

ํŽ˜์น˜ ์กฐ์ธ์˜ ํŠน์ง•๊ณผ ํ•œ๊ณ„ 

ํŽ˜์น˜ ์กฐ์ธ ๋Œ€์ƒ์—๋Š” ๋ณ„์นญ์„ ์ค„ ์ˆ˜ ์—†๋‹ค. 
• //ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋Š” ๊ฐ€๋Šฅ, ๊ฐ€๊ธ‰์  ์‚ฌ์šฉX
• ๋‘˜ ์ด์ƒ์˜ ์ปฌ๋ ‰์…˜์€ ํŽ˜์น˜ ์กฐ์ธ ํ•  ์ˆ˜ ์—†๋‹ค. 
• ์ปฌ๋ ‰์…˜์„ ํŽ˜์น˜ ์กฐ์ธํ•˜๋ฉด ํŽ˜์ด์ง• API(setFirstResult, 
setMaxResults)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. 
• //์ผ๋Œ€์ผ, ๋‹ค๋Œ€์ผ ๊ฐ™์€ ๋‹จ์ผ ๊ฐ’ ์—ฐ๊ด€ ํ•„๋“œ๋“ค์€ ํŽ˜์น˜ ์กฐ์ธํ•ด๋„ ํŽ˜์ด์ง• ๊ฐ€๋Šฅ
• //ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋Š” ๊ฒฝ๊ณ  ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํŽ˜์ด์ง•(๋งค์šฐ ์œ„ํ—˜)

์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋“ค์„ SQL ํ•œ ๋ฒˆ์œผ๋กœ ์กฐํšŒ - ์„ฑ๋Šฅ ์ตœ์ ํ™”
• ์—”ํ‹ฐํ‹ฐ์— ์ง์ ‘ ์ ์šฉํ•˜๋Š” ๊ธ€๋กœ๋ฒŒ ๋กœ๋”ฉ ์ „๋žต๋ณด๋‹ค ์šฐ์„ ํ•จ
• //@OneToMany(fetch = FetchType.LAZY) //๊ธ€๋กœ๋ฒŒ ๋กœ๋”ฉ ์ „๋žต
• ์‹ค๋ฌด์—์„œ ๊ธ€๋กœ๋ฒŒ ๋กœ๋”ฉ ์ „๋žต์€ ๋ชจ๋‘ ์ง€์—ฐ ๋กœ๋”ฉ
• ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ณณ์€ ํŽ˜์น˜ ์กฐ์ธ ์ ์šฉ

 

 

ํŽ˜์น˜ ์กฐ์ธ - ์ •๋ฆฌ

• ๋ชจ๋“  ๊ฒƒ์„ ํŽ˜์น˜ ์กฐ์ธ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ๋Š” ์—†์Œ
• ํŽ˜์น˜ ์กฐ์ธ์€ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ์œ ์ง€ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ํšจ๊ณผ์ 
• ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•ด์„œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๊ฐ€์ง„ ๋ชจ์–‘์ด ์•„๋‹Œ ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด์•ผ ํ•˜๋ฉด, ํŽ˜์น˜ ์กฐ์ธ ๋ณด๋‹ค๋Š” ์ผ๋ฐ˜ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ํ•„์š” ํ•œ ๋ฐ์ดํ„ฐ๋“ค๋งŒ ์กฐํšŒํ•ด์„œ DTO๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ 