JPQL - 페치 조인(fetch join) 기본
엔티티 페치 조인
[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




위의 경우 문제가 되는것이 무엇일까?
일단 코드를 살펴보자
1. 아래의 코드에서 select 쿼리가 나가고 조회결과(Member)를 영속성컨텍스트에 저장한다.
List<Member> result = em.createQuery(query, Member.class)
.getResultList();
2. for()문안에 출력문에서 member.getUsername()은 회원정보가 1차캐시(영속성컨텍스트)에
존재하기 때문에 뽑아올 수 있지만 회원이 속한 팀의 정보(member.getTeam().getName())
는 영속성컨텍스트에 없기 때문에 조회쿼리를 날리게 된다. (팀A에 대한 정보를 조회)
3. for()문 마지막에서의 회원3에 대한 팀B의 정보 또한 없기 때문에, 조회 쿼리를 또 날린다.
*** 여기서 team은 프록시 객체이다. ***
위의 설명과 같이 회원 100명에 대한 정보를 가져오기 위해 최악의 경우 쿼리가 100번 나가게된다. ( N + 1 문제)
그렇다면 이런 문제를 어떻게 해결해야할까?
바로 페치조인(fetch join)이다.


일대다 관계
[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'
이 글은 김영한님의 JPA 강의를 듣고 정리한 내용입니다.