본문 바로가기
Study/실전! 스프링 부트와 JPA 활용2

Inner Join 과 Fetch Join 의 차이

by Subi 2022. 7. 29.

💡 Fetch Join 을 사용할 때 발생하는 쿼리는 Inner Join 의 쿼리와 차이가 없는데 왜 Fetch Join의 성능이 좋을까?

 

  • Inner Join
    • 오직 JPQL에서 조회하는 주체가 되는 Entity만 조회하여 영속화
  • Fetch Join
    • 조회의 주체가 되는 Entity 이외에 Fetch Join이 걸린 연관 Entity도 함께 SELECT 하여 모두 영속화 즉, FetchType이 Lazy 인 Entity를 참조하더라도 이미 영속성 컨텍스트에 들어있기 때문에 따로 쿼리가 실행되지 않는다
  • Inner Join(일반 Join) 의 가장 큰 문제인 N + 1 의 문제가 Fetch Join 에서는 해결됨

쿼리문의 차이

Inner Join

public List<Order> findAllWithMemberDeliveryTest() {
        return em.createQuery(
                "select o from Order o"+
                        " join o.member m"+
                        " join o.delivery d",Order.class
        ).getResultList();
    }

 

  • 쿼리문 3개 실행 → N + 1
  • Order 에서 조회된 member(2명) 에 대한 데이터를 위해 쿼리문이 2번 추가 실행

Fetch Join

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

  • 출력되는 쿼리문은 Inner join을 활용한 1개의 쿼리
  • 즉, 연관관계에 있는 Entity를 select 하여 모두 영속화 하여 가지고 있기 때문에 따로 쿼리가 실행되지 않고, 조회가능

'Study > 실전! 스프링 부트와 JPA 활용2' 카테고리의 다른 글

지연로딩과 조회 성능 최적화  (0) 2022.07.29
회원 API 조회 개발  (0) 2022.07.26
API 개발 기본  (0) 2022.07.25

댓글