JPQL - ํ์น ์กฐ์ธ(fetch join)
SQL ์กฐ์ธ ์ข ๋ฅ๊ฐ ์๋ JPQL ์์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ค.
์ฐ๊ด๋ ์ํฐํฐ๋ ์ปฌ๋ ์ ์ SQL ํ๋ฒ์ ํจ๊ป ์กฐํํ๋ ๊ธฐ๋ฅ์ด๋ค.
์์) SQL ํ๋ฒ์ ํ์์ ์กฐํํ๋ฉด์ ์ฐ๊ด๋ ํ๋ ํจ๊ป ์กฐํ

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
SQL ์ ๋ณด๋ฉด ํ์ ๋ฟ๋ง ์๋๋ผ ํ(T.*)๋ ํจ๊ป select ํ๋ค.

ํ์น ์กฐ์ธ์ด ์๋ ๊ทธ๋ฅ ์กฐํํ ๋
String query = "select m from Member m ";
List<Member> result = em.createQuery(query, Member.class)
.getResultList();
for (Member member : result) {
System.out.println("userName = " + member.getUsername() + ", teamName " + member.getTeam().getName());
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
๋ฉค๋ฒ๋ฅผ ์กฐํํ ๋ ํ์ด fetchType.LAZY ์ด๊ธฐ ๋๋ฌธ์
ํ๋ก์๋ฅผ ๊ฐ์ ธ์จ๋ค.
๊ทธ๋์ ์ฒ์์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆด๋ ๋ฉค๋ฒ๋ฅผ ๋ค ์กฐํํ๊ณ
ํ์ ๊ทธ ๊ฐ์ ์ด์ฉํ ๋ ( member.getTeam().getName() ํธ์ถ์ )
์์์ฑ ์ปจํ ์คํธ์ ์ด๊ธฐํ๋ฅผ ํ๋ค.
member.getTeam().getName() ํธ์ถ์ ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๋ค.
// ํ์1 - ํA ๋ ์์์ฑ ์ปจํ ์คํธ์ ์๊ธฐ ๋๋ฌธ์ SQL ๋ก ๊ฐ์ ธ์จ๋ค.
// ํ์2 - ํA ๋ 1์ฐจ์บ์(์์์ฑ ์ปจํ ์คํธ)์์ ๊ฐ์ ธ์จ๋ค
// ํ์3 - ํB ๋ ์์์ฑ ์ปจํ ์คํธ์ ์๊ธฐ ๋๋ฌธ์ SQL ๋ก ๊ฐ์ ธ์จ๋ค.
์ฟผ๋ฆฌ๊ฐ ๋ง์ด ๋๊ฐ๋๊ฒ์ ๋ณผ์ ์๋ค.
ํ์ 100๋ช ์ด๋ฉด ๋ด๊ฐ ๋ณด๋ธ ์ฟผ๋ฆฌ 1๊ฐ๋ก 100๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ๋ง๋ค์ด ์ง ์ ์๋ค. ( N+1 ๋ฌธ์ )
์ด๋ฐ ๋ฌธ์ ๋ค์ ํ์น ์กฐ์ธ์ผ๋ก ํ์ด์ผํ๋ค.
์ํฐํฐ ํ์น ์กฐ์ธ
select m from Member m join fetch m.team
๋ฉค๋ฒ์ ํ์ ์กฐ์ธํด์ ํ๋ฒ์ ๊ฐ์ง๊ณ ์๋ค.
ํ๋ก์๊ฐ ์๋ ์ค์ ์ํฐํฐ๋ฅผ ๊ฐ์ง๊ณ ์ด
์ปฌ๋ ์ ํ์น ์กฐ์ธ
์ผ๋๋ค ๊ด๊ณ์์์ ์ปฌ๋ ์ ํ์น ์กฐ์ธ์ ์์๋ณด์
JPQL
select t from Team t join fetch t.members
SQL
SELECT T.*, M.*
FROM TEAM T
INNER JOIN MEMBER M ON T.ID=M.TEAM_ID
์ผ๋๋ค ๊ด๊ณ์์๋ ๋ฐ์ดํฐ๊ฐ ๋ปฅํ๊ธฐ ๋ ์ ์์
select distinct t from Team t join fetch t.members
๋ฐ์ดํฐ๊ฐ ์ค๋ณต ๋๊ธฐ ๋๋ฌธ์ DISTINCT ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ณต๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ฑฐํ์
ํ์น ์กฐ์ธ์ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ SQL ํ๋ฒ์ ์กฐํํ๋ ๊ฐ๋ ์ด๋ค !
ํ์น ์กฐ์ธ์ ํ๊ณ
ํ์น ์กฐ์ธ ๋์์๋ ๋ณ์นญ์ ์ค ์ ์๋ค. ๊ฐ๊ธ์ ์ฌ์ฉํ์ง๋ง์ !
๋ ์ด์์ ์ปฌ๋ ์ ์ ํ์น ์กฐ์ธ์ ํ ์ ์๋ค.
์ปฌ๋ ์ ์ ํ์น ์กฐ์ธํ๋ฉด ํ์ด์ง API
(setFirstResult,setMaxResults)๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ ๋ฆฌ
์ฐ๊ด๋ ์ํฐํฐ๋ค์ SQL ํ ๋ฒ์ผ๋ก ์กฐํํ๋ ๊ฐ๋ ์ด๋ค. (์ฑ๋ฅ์ต์ ํ)
FetchType.LAZY ์ด์ฌ๋ ํ์น ์กฐ์ธ์ด ํญ์ ์ฐ์ ์ด๋ค.
์ค๋ฌด์์๋ ๋ชจ๋ ์ง์ฐ ๋ก๋ฉ์ผ๋ก ํ๊ณ ์ต์ ํ๊ฐ ํ์ํ ๊ณณ์ ํ์น ์กฐ์ธ์ ์ ์ฉํ๋ฉด ๋๋ค.
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ | ๊ฐ์
JPA๋ฅผ ์ฒ์ ์ ํ๊ฑฐ๋, ์ค๋ฌด์์ JPA๋ฅผ ์ฌ์ฉํ์ง๋ง ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ์กฑํ์ ๋ถ๋ค์ด JPA์ ๊ธฐ๋ณธ ์ด๋ก ์ ํํํ๊ฒ ํ์ตํด์ ์ด๋ณด์๋ ์ค๋ฌด์์ ์์ ์๊ฒ JPA๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค., - ๊ฐ์ ์๊ฐ | ์ธํ๋ฐ
www.inflearn.com