DOing
[JPA] Fetch Join ๋ณธ๋ฌธ
๐ฑ Fetch Join
SQL ์กฐ์ธ ์ข ๋ฅ๊ฐ ์๋, JPQL์์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ค.
์ฐ๊ด๋ ์ํฐํฐ๋ ์ปฌ๋ ์ ์ SQL ํ๋ฒ์ ํจ๊ป ์กฐํํ๋ ๊ธฐ๋ฅ์ด๋ค.
[LEFT | INNER ] JOIN FETCH
[JPQL]
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
๐ฑ OneToMany + Fetch Join ์ ์ฃผ์!
String jpql = "select t from Team t join fetch t.members where t.name = 'ํA'"
List<Team> teams = em.createQuery(jpql, Team.class).getResultList();
for(Team team : teams) {
System.out.println("teamname = " + team.getName() + ", team = " + team);
for (Member member : team.getMembers()) {
System.out.println(“-> username = " + member.getUsername()+ ", member = " + member);
}
}
OneToMany + fetch join์ ๋ํ ๊ฒฐ๊ณผ๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ปฅํ๊ธฐ๊ฐ ๋ ์ ์๋ค!
teamname = ํA, team = Team@0x100
- username = ํ์1, member = Member@0x200
- username = ํ์2, member = Member@0x300
teamname = ํA, team = Team@0x100
- username = ํ์1, member = Member@0x200
- username = ํ์2, member = Member@0x300
๐ฑ ์ ์ด๋ฐ ๋ปฅํ๊ธฐ ํ์์ด ๋์ฌ๊น?
ํA์ ๋ํด ์ฐ๊ด๋ member๊ฐ ๋๋ช ์ด๋ผ๊ณ ํ์. join์ ํตํด ๋์จ ๊ฒฐ๊ณผ ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ด ๊ฒฐ๊ณผ๊ฐ JPA๋ก ๋์ด์ค๊ฒ ๋๋ฉด, ์ผ๋จ JPA๋ ๊ฒฐ๊ณผ row ์๋งํผ ๋๋ ค์ผํ๋ค. PK๊ฐ์ด ๋๊ฐ๋๋ผ๋ ์ผ๋จ row ๊ฐฏ์๋งํผ ๋งํผ ๋ง๋ค์ด์ผํ๋ค. ์ค๋ณต์ ์ ๊ฑฐํ ์ง ๋ง์ง๋ ์ถํ์ ์ฌ์ฉ์๊ฐ ์ ํํ๊ฒ๋ ํ๋ค. JPA ์ ์ฅ์์๋ ์ผ๋จ ๋๊ฐ์ ํA๊ฐ ๋๊ฐ๋ค. ์ด ํA๋ ํ์1, ํ์2๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง๋ค.
๐ฑ ๊ทธ๋ผ ์ด๋ป๊ฒ ํด์ผํ๋๊ฐ?
๊ฐ์ ์๋ณ์๋ฅผ ๊ฐ์ง๋ ์๋ฒฝํ ๋์ผํ TeamA๊ฐ ๋๋ฒ ๋ง๋ค์ด์ง๋ ๊ฒ์ด ๋ฌธ์ ์๋ค. ๊ทธ๋ฌ๋ ์ค๋ณต๋ TeamA๋ฅผ ์ญ์ ํ๋ฉด ๋๋ค.
์ด๋ฅผ ์ํด JPQL์ DISTINCT๋ ๋๊ฐ์ง ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
1. SQL์ DISTINCT๋ฅผ ์ถ๊ฐ
2. ์ ํ๋ฆฌ์ผ์ด์
์์ ์ํฐํฐ ์ค๋ณต ์ ๊ฑฐ
-> ์ด๋ ๊ฐ์ ์๋ณ์๋ฅผ ๊ฐ์ง Team ์ํฐํฐ ์ ๊ฑฐ
String jpql = "select distinct t from Team t join fetch t.members where t.name = 'ํA'"
List<Team> teams = em.createQuery(jpql, Team.class).getResultList();
for(Team team : teams) {
System.out.println("teamname = " + team.getName() + ", team = " + team);
for (Member member : team.getMembers()) {
System.out.println(“-> username = " + member.getUsername()+ ", member = " + member);
}
}
๐ฑ Fetch Join ํ๊ณ
1. Fetch Join ๋์์๋ ๋ณ์นญ์ ์ฃผ๋ฉด ์๋๋ค.
String jpql = "select distinct t from Team t join fetch t.members as m" // ์๋จ
String jpql = "select distinct t from Team t join fetch t.members as m where m.age > 10" // ์๋จ
fetch join์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๋ ์ฐ๊ด๋ ๊ฒ๋ค์ ์ ๋ถ ๋ค๊ณ ์ค๋ ์ผ์ด๋ค. ๋ง์ฝ ๋์ ์ฐ๊ด๋ ์ ๋ค์ ๊ฑธ๋ฌ์ ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋ฉด fetch join์ ์ฐ๋ฉด ์๋๋ค. ๊ทธ๋ฐ๊ฑธ ์ํ๋ค๋ฉด team.getMember()๋ก ๊ฐ์ ธ์ค๋ฉด ์๋๊ณ member์์ ๋ฐ๋ก ์กฐํํ๋ ๊ฒ์ด ๋ง๋ค. ๋ฐ์ดํฐ์ ์ ํฉ์ฑ, JPA์ ๊ฐ์ฒด ๊ทธ๋ํ ์ฌ์์ ๋ง์ง ์๋ ํ์์ด๋ค.
์์์ฑ ์ปจํ ์คํธ ์ ์ฅ์์ ์๊ฐํด๋ณด์. ๋๊ฐ์ teamA์ธ๋ฐ ์ด๋ค ์ ๋ member 100๊ฐ ์ค์ 100๊ฐ๋ฅผ ๋ค๊ฐ์ ธ์ค๊ณ ๋ค๋ฅธ ์ ๋ member 100๊ฐ ์ค 5๊ฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํด๋ณด์. ์์์ฑ ์ปจํ ์คํธ ์ ์ฅ์์๋ ๊ต์ฅํ ๋๊ฐํ ์ํฉ์ผ ๊ฒ์ด๋ค. ๋ณ์นญ์ join fetch๋ฅผ ์ฌ๋ฌ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ๊ฐ๋ ๋ฑ์ ๋ณต์กํ ํ์์์๋ง ์ฌ์ฉํ๊ณ ๊ฐ๊ธ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
2. ๋ ์ด์์ ์ปฌ๋ ์ ์ ํจ์น์กฐ์ธํ๋ฉด ์๋๋ค.
: ๋ฐ์ดํฐ๊ฐ ๋ช๋ฐฐ๋ก ๋์ด๋ ์ ์์ด ์ํํ๋ค. ํจ์น์กฐ์ธ์ ์ปฌ๋ ์ ์ ํ๋๋ง ์ง์ ํ๋๋ก ํ์.
3. ์ปฌ๋ ์ ์ ํจ์น์กฐ์ธํ๋ฉด ํ์ด์ง API()๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- OneToOne, ManyToOne์ ํ์น์กฐ์ธํด๋ ํ์ด์ง์ด ๊ฐ๋ฅํ๋ค.
- ํ์ง๋ง OneToMany๋ ๋ฐ์ดํฐ ๋ปฅํ๊ธฐ๊ฐ ๋๊ธฐ๋๋ฌธ์ fetch join์ด ๋ถ๊ฐ๋ฅํ๋ค.
: DB ์กฐํ ๊ฒฐ๊ณผ ๊ฐ์ด ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ผ๋ฉด์ ํ์ด์ง์ด 1์ด๋ผ๋ฉด ํA๋ ํ์1๋ฐ์ ๊ฐ์ง ๋ชปํ๋ค. ์ค์ ๋ก๋ ํA๊ฐ ํ์1, ํ์2๋ฅผ ๊ฐ์ง๊ณ ์์์๋ ๋ถ๊ตฌํ๊ณ ! ์ด๋ฐ ๋ฐ์ดํฐ ์ ํฉ์ฑ ์ค๋ฅ๊ฐ ์๊ธธ ์ ์๋ค. ๋ฒ์ ๋ง๋ค ๋ค๋ฅผ ์ ์์ง๋ง ์ด๋ ํ์ด๋ฒ๋ค์ดํธ๋ ๊ฒฝ๊ณ ๋ก๊ทธ๋ฅผ ๋ ๋ฆฌ๊ณ ํ์ด์ง์ฟผ๋ฆฌ๊ฐ ์๋ ์ ์ฒด ๋ฐ์ดํฐ ์กฐํ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฆฌ์์ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ๋ค.(๋งค์ฐ ์ํ!)
๐ฑ ํจ์น์กฐ์ธ ์ ๋ฆฌ
- ์ฐ๊ด๋ ์ํฐํฐ๋ ์ปฌ๋ ์ ์ SQL ํ๋ฒ์ ํจ๊ป ์กฐํํ๋ ๊ธฐ๋ฅ์ด๋ค.
- ์ํฐํฐ์ ์ง์ ์ ์ฉํ๋ ๊ธ๋ก๋ฒ ๋ก๋ฉ ์ ๋ต๋ณด๋ค ์ฐ์ ๋๋ค.
- FetchType.LAZY์ธ์ง EAGER์ธ์ง ์๊ด์์ด ๋ฌด์กฐ๊ฑด fetch join์ด ๋จนํ๋ค.
- ์ค๋ฌด์์๋ ๊ธ๋ก๋ฒ ๋ก๋ฉ ์ ๋ต์ ๋ชจ๋ ์ง์ฐ๋ก๋ฉ์ผ๋ก ํ๊ณ ์ต์ ํ๊ฐ ํ์ํ ๊ณณ์ fetch join์ ์ด์ฉํ๋ค.
- Fetch join์ด ๋ชจ๋ ๊ฒ์ ํด๊ฒฐํด์ฃผ๋ ๊ฒ์ ์๋๊ณ , ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์ ์งํ ๋ ์ฌ์ฉํ๋ฉด ํจ๊ณผ์ ์ด๋ค!
- ๋ง์ฝ ์ฌ๋ฌ ํ ์ด๋ธ์ ์กฐํํด์ ์ํฐํฐ๊ฐ ์๋ ๊ฐ์ง ๋ชจ์์ด ์๋ ์ ํ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ผํ๋ค๋ฉด, ํจ์น์กฐ์ธ์ด ์๋ ์ผ๋ฐ์กฐ์ธ+DTO๋ก ๋ฐํํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ด๋ค!
'JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] JPQL์ด๋? (0) | 2021.08.08 |
---|---|
[Querydsl] ํํ์ด๋ DTO๋ก ๊ฒฐ๊ณผ ๋ฐํํ๊ธฐ (0) | 2021.08.05 |
[Querydsl] ์๋ธ์ฟผ๋ฆฌ (0) | 2021.08.04 |
[Querydsl] Join (0) | 2021.08.04 |
[Querydsl] ์ ๋ ฌ, ํ์ด์ง, ์ง๊ณ ํจ์, ๊ทธ๋ฃน ํจ์ (0) | 2021.08.04 |