✔ 엔티티 그래프

엔티티를 조회할 때 연관된 엔티티들을 함께 조회하려면 글로벌 fetch 옵션을 FetchType.EAGER로 설정한다.

@Entityclass order{    @ManyToOne(fetch=FetchType.EAGER)    Member member;    ...}

또는 JPQL에서 페치 조인을 사용하면 된다.

SELECT o FROM Order o JOIN FETCH o.member

글로벌 fetch 옵션은 애플리케이션 전체에 영향을 주고 변경할 수 없는 단점이 있다.

그래서 일반적으로 글로벌 fetch 옵션은 FetchType.LAZY를 사용하고, 엔티티를 조회할 때 연관된 엔티티를 함께 조회할 필요가 있으면 JPQL의 페치 조인을 사용한다.

그런데 페치 조인을 사용할 경우 같은 JPQL을 중복해서 작성하는 경우가 많다.

예를 들어 주문 상태를 검색조건으로 주문 엔티티를 조회하는 JPQL을 작성한다면

SELECT o FROM Order o WHERE o.status = ?--주문과 회원을 함께 조회할 필요가 있어 JPQL을 새로 추가SELECT oFROM Order o JOIN FETCH o.memberWHERE o.status = ?--주문과 주문상품을 함께 조회하는 기능이 필요해 JPQL을 새로 추가SELECT oFROM Order o JOIN FETCH o.orderItemsWHERE o.status = ?

3가지 JPQL 모두 주문을 조회하는 같은 JPQL이지만 함께 조회할 엔티티에 따라서 다른 JPQL을 사용해야 한다. JPQL이 데이터를 조회하는 기능뿐만 아니라 연관된 엔티티를 함께 조회하는 기능도 제공하기 때문인데, 결국 JPQL이 두 가지 역할을 모두 수행해서 발생하는 문제다.

JPA 2.1에 추가된 엔티티 그래프 기능을 사용하면 엔티티를 조회하는 시점에 함께 조회할 연관된 엔티티를 선택할 수 있다.

JPQL은 데이터를 조회하는 기능만 수행하면 되고 연관된 엔티티를 함께 조회하는 기능은 엔티티 그래프를 사용하면 된다.

SELECT o FROM Order o WHERE o.status = ?