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 ๊ตฌ๋ฌธ ์ฌ์ฉ
- select m from Member m join fetch m.team
- [SQL]
- SELECT M.*, T.* FROM MEMBER M
INNER JOIN TEAM T ON M.TEAM_ID=T.ID- select์ ์ m์ t๊ฐ ์ถ๊ฐ
- ์ฆ์๋ก๋ฉ์ผ๋ก ๊ฐ์ ธ์ฌ ๋์ ์ฟผ๋ฆฌ์ ๊ฐ์. ๋์ ์ด๊ฑด ๋ช ์์ ์ผ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ
- SELECT M.*, T.* FROM MEMBER M
- ํ์น ์กฐ์ธ์ผ๋ก ํ์๊ณผ ํ์ ํจ๊ผ ์กฐํํ๋ฉด ์ง์ฐ ๋ก๋ฉ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๋ก ๋ฐํํ๋ ๊ฒ์ด ํจ๊ณผ์
'๐ฅ๏ธ ๋ฐฑ์๋ > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[API] REST API ํ ์คํ ๋๊ตฌ Talend API Tester (1) | 2023.11.29 |
---|---|
[API] API ๊ณ ๊ธ ์ค๊ณ - ์ง์ฐ ๋ก๋ฉ๊ณผ ์กฐํ ์ฑ๋ฅ ์ต์ ํ (1) | 2023.11.28 |
[JPA] ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด - ์ค๊ธ ๋ฌธ๋ฒ(1) (2) | 2023.11.26 |
[JPA] ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด - ๊ธฐ๋ณธ๋ฌธ๋ฒ (2) (1) | 2023.11.26 |
[JPA] ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด - ๊ธฐ๋ณธ๋ฌธ๋ฒ (1) (1) | 2023.11.26 |