페치 조인
Contents
페치 조인 (Fetch Join)
페치 조인은 JPQL에서 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능을 한다.
사용 문법은 다음과 같다.
|
|
페치 조인은 SQL 한 번으로 연관된 엔티티들을 함께 조회할 수 있어서 SQL 호출 횟수를 줄여 성능을 최적화할 수 있다.
페치 조인은 엔티티에 직접 적용하는 글로벌 로딩 전략보다 우선한다. 실무에서는 글로벌 로딩 전략은 모두 지연 로딩이므로, 최적화가 필요한 곳은 페치 조인을 적용하면 효과적이다.
페치 조인과 DISTINCT
SQL의 DISTINCT는 중복된 결과를 제거하는 명령이다. 반면 JPQL의 DISTINCT는 2가지 기능 제공한다.
- SQL에 DISTINCT를 추가한다.
- 애플리케이션에서 엔티티 중복을 제거한다.
페치 조인의 한계
- 페치 조인 대상에는 별칭을 줄 수 없다. 따라서 SELECT, WHERE 절, 서브 쿼리에 페치 조인 대상을 사용할 수 없다.
- 하이버네이트는 가능하지만, 가급적 사용하지 않는 것이 좋다.
- 둘 이상의 컬렉션을 페치 할 수 없다.
- 컬렉션을 페치 조인하면 페이징 API(setFirstResult, setMaxResults)를 사용할 수 없다.
- 하이버네이트는 경고 로그를 남기고 메모리에서 페이징하지만, 매우 위험하다.
정리
- 모든 것을 페치 조인으로 해결할 수 는 없다.
- 페치 조인은 객체 그래프를 유지할 때 사용하면 효과적이다.
- 여러 테이블을 조인해서 엔티티가 가진 모양이 아닌 전혀 다른 결과를 내야 하면, 페치 조인 보다는 일반 조인을 사용하고 필요한 데이터들만 조회해서 DTO로 반환하는 것이 효과적이다.