JPA JPQL - Fetch Join

목차

N+1 문제란 ?

데이터 조회를 위해 한번의 쿼리가 발생하지만 연관관계에 의해 연관된 객체 모두를 가져오기 위해 N 번의 쿼리가 발생하는 문제

필요한 데이터 조회를 위해 한번의 Select 쿼리가 발생해 객체를 가져왔지만, 연관관계가 설정된 객체는 Lazy 설정 으로 인해 실제 값이 아닌 Proxy 객체 로 대체하는데 해당 객체에 접근할 경우 실제 데이터를 가져오기 위해 처음에 조회된 데이터 만큼 쿼리가 추가적으로 발생하는 문제

Fetch Join

Lazy 설정을 무시하고 연관된 객체를 한번에 가져온다.

  • JPQL 에서는 N + 1 문제를 해결하기 위해 fetch join 을 제공한다.
  • fetch join 을 이용해 JPQL 을 작성하게 되면 Lazy 설정을 무시하고, Order 조회시 Member 객체와 Delivery 객체를 전부 다 가져온다.
public List<Order> findAllWithMemberDelivery(){
return em.createQuery(
"select o from Order o"+
" join fetch o.member m" +
" join fetch o.delivery d", Order.class
).getResultList();
}
Share