💡 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 |
댓글