๐ฑ๐ํ์น ์กฐ์ธ๐ฑ๐ JOIN FETCH (์ฆ์๋ก๋ฉ)
- SQL ์กฐ์ธ ์ข ๋ฅ๊ฐ ์๋๋ค.
- JPQL์์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์ ๊ณตํ๋ ๊ธฐ๋ฅ
- ์ฐ๊ด๋ ์ํฐํฐ๋ ์ปฌ๋ ์ ์ SQL ํ๋ฒ์ ํจ๊ป ์กฐํํ๋ ๊ธฐ๋ฅ
- N+1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
- ํ์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ธ์จ ํ, ๊ฐ ํ์์ด ์ํ ํ์ ์ถ๋ ฅํ๋ค.
- ๊ฐ ํ์์ด ์ํ ํ์ ํธ์ถํ ๋๋ง๋ค ์ถ๊ฐ๋ก ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๋ค.
1. ์ํฐํฐ ํ์น ์กฐ์ธ
ํ์์ ์กฐํํ๋ฉด์ ์ฐ๊ด๋ ํ๋ ํจ๊ป ์กฐํ
[SQL]
SELECT M.*, T.* FROM MEMBER M // select M.*, T.*
INNER JOIN TEAM T ON M.TEAM_ID=T.ID
์ฝ๋๋ก ์ ์ฉ
String jpql = "select m from Member m join fetch m.team";
List<Member> members = em.createQuery(jpql, Member.class)
.getResultList();
// ์ถ๋ ฅ
for (Member member : members) {
System.out.println("username = " + member.getUsername() + ", " +
"teamName = " + member.getTeam().name());
}
join fetch๊ฐ ์๋์๋ค๋ฉด? member.getTeam()๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆผ
2. ์ปฌ๋ ์ ํ์น ์กฐ์ธ
ํ์ ์กฐํํ๋ฉด์ ์ํ ํ์๋ ํจ๊ป ์กฐํ
[JPQL]
select t
from Team t join fetch t.members // t.members
where t.name = 'ํA'
[SQL]
SELECT T.*, M.* // T, M
FROM TEAM T
INNER JOIN MEMBER M ON T.ID=M.TEAM_ID
WHERE T.NAME = 'ํA'
์ฃผ์ํ ์
TEAM์ ์ค๋ณต์ด ๋ฐ์ํ๋ค. ์ปฌ๋ ์ ์ ์กฐ์ธํ๊ธฐ ๋๋ฌธ
select distinct t // distinct๋ฅผ ์ถ๊ฐํ๋ค.
from Team t join fetch t.members
where t.name = ‘ํA’
ํ์น์กฐ์ธ vs ์ผ๋ฐ์กฐ์ธ
์ผ๋ฐ์กฐ์ธ : ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ํจ๊ป ์กฐํํ์ง ์์
SELECT T.* // T๋ง ๊ฐ์ ธ์จ๋ค
FROM TEAM T
INNER JOIN MEMBER M ON T.ID=M.TEAM_ID
WHERE T.NAME = 'ํA
ํ์น์กฐ์ธ : ์ฆ์๋ก๋ฉ
ํ์น์กฐ์ธ์ ํ๊ณ
- ๋ณ์นญ์ ์ค ์ ์๋ค.
- ๋ ์ด์์ ์ปฌ๋ ์ ์ ํ์น์กฐ์ธ ํ ์ ์๋ค.
- ์ปฌ๋ ์
์ ํ์น ์กฐ์ธํ๋ฉด ํ์ด์ง API๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- 1:1, N:1์ ํ์น์กฐ์ธํด๋ ํ์ด์ง ๊ฐ๋ฅํ๋ค.
- 1:N์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค.
- ํด๊ฒฐ๋ฐฉ๋ฒ์? ํ์น์กฐ์ธ์ ์ฌ์ฉํ์ง ์๊ณ , BatchSize๋ฅผ ์ค์ ํ๋ค.
@BatchSize(size=100) @OneToMany(mappedBy="team") private List<Member> members = new ArrayList<>();
'๊ณต๋ถ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง ๋ฐ์ดํฐ JPA์์ ์ฟผ๋ฆฌ ๋ฉ์๋ ๊ธฐ๋ฅ์ ์์๋ณด์ (0) | 2022.08.25 |
---|---|
์์ JPA ๊ธฐ๋ฐ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ฐจ์ด์ ์ ํ์ธํด๋ณด์ (0) | 2022.08.25 |
[JPA] ์ฟผ๋ฆฌ ๋ฌธ๋ฒ (0) | 2022.07.18 |
[JPA] ๊ฐ ํ์ (0) | 2022.07.02 |
[JPA] ํ๋ก์์ ์ฐ๊ด๊ด๊ณ ๊ด๋ฆฌ(์ง์ฐ๋ก๋ฉ) (0) | 2022.07.02 |
๋๊ธ