페치조인은 JPQL에서 성능 최적화를 위해 제공하는 기능이다. SQL의 join 처럼 연관된 엔티티나 컬렉션을 한번에 조회할 때 사용한다.
SELECT m FROM Member m JOIN FETCH m.team
이름은 페치 조인이지만 join fetch
로 사용해야한다.
// fetch join
em.createQuery("SELECT m FROM Member m join fetch m.team", Member.class)
.getResultList();
// 일반 조인
em.createQuery("SELECT m, t FROM Member m join Team t ON t = m.team", MemberAndTeamDTO.class)
.getResultList();
페치 조인과 일반 조인후 완성된 쿼리문을 보면 비슷해서 뭐가 다른지 헷갈리기 쉬운데 차이점은 분명하다.
페치조인을 사용하는 가장 큰 이유는 N+1문제를 거의 대부분 해결 해주기 때문에 최적화 용도로 사용한다.
지연로딩으로 설정해도 페치조인 쿼리를 보면 join을 사용해 한번에 다 가져오니 즉시로딩과 같은 기능이라고 생각할 수 있지만, 즉시로딩 역시 N+1문제를 야기하기에 페치조인을 통해 필요한 데이터를 한번에 가져오는 것이 좋다.