JPA.페치조인(fetch join)

무지성개발자·2024년 2월 29일
0

JPA

목록 보기
12/12

fetch join

페치조인은 JPQL에서 성능 최적화를 위해 제공하는 기능이다. SQL의 join 처럼 연관된 엔티티나 컬렉션을 한번에 조회할 때 사용한다.

사용법

SELECT m FROM Member m JOIN FETCH m.team

이름은 페치 조인이지만 join fetch로 사용해야한다.

특징

  • 연관된 엔티티도 한번에 조회할 수 있음.
    • 일반 조인과는 다름.
  • 지연로딩 보다 우선적으로 적용됨.
  • 일대다 관계로 패치 조인 사용시 페이징api 사용하기 힒듬.
  • 페치조인 대상에 별칭(as)사용 X
  • 두개 이상 컬렉션 페치조인 불가

일반 조인과 페치조인의 차이점

// 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();

페치 조인과 일반 조인후 완성된 쿼리문을 보면 비슷해서 뭐가 다른지 헷갈리기 쉬운데 차이점은 분명하다.

  1. 리턴 타입
  • 페치조인의 경우 리턴타입을 엔티티로 사용하여 페치조인한 엔티티로 그래프 탐색이 가능한 반면, 일반 조인은 DTO클래스를 만들어 맵핑 시켜줘야하며 엔티티 그래프 탐색을 못 한다.
  1. 조회 컬럼 차이
  • JPQL은 연관관계를 고려하지 않음. 때문에 일반 join으로 값을 가져오면 조회할 컬럼을 다 입력해줘야함.

왜 사용할까?

페치조인을 사용하는 가장 큰 이유는 N+1문제를 거의 대부분 해결 해주기 때문에 최적화 용도로 사용한다.

지연로딩으로 설정해도 페치조인 쿼리를 보면 join을 사용해 한번에 다 가져오니 즉시로딩과 같은 기능이라고 생각할 수 있지만, 즉시로딩 역시 N+1문제를 야기하기에 페치조인을 통해 필요한 데이터를 한번에 가져오는 것이 좋다.

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글