💡API 설명을 위해 샘플 데이터 입력 후 진행
주문+배송정보+회원을 조회하는 API 만들기 = 주문API 생성
🚨문제점
지연 로딩(LAZY)을 피하기 위해 즉시 로딩(EARGR)으로 설정하면 안된다!
- 즉시 로딩 때문에 연관관계가 필요 없는 경우에도 데이터를 항상 조회해서 성능 문제가 발생할 수 있다.
- 즉시 로딩으로 설정하면 성능 튜닝이 매우 어려워 진다.
항상 지연 로딩을 기본으로 하고, 성능 최적화가 필요한 경우에는 페치 조인 사용!
🚨문제점
1. 쿼리가 총 1 + N + N번 실행됨(V1과 쿼리 수 동일)
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();
}
public List<OrderSimpleQueryDto> findOrderDtos() {
return em.createQuery(
"select new jpabook.jpashop.repository.order.simplequery.OrderSimpleQueryDto(o.id, m.name, o.orderDate, o.status, d.address)" +
" from Order o" +
" join o.member m" +
" join o.delivery d", OrderSimpleQueryDto.class)
.getResultList();
}
DTO로 직접 조회 시, SELECT절에서 원하는 데이터를 직접 선택하므로 DB 네트워크 용량 최적화!!
-> API 스펙에 맞춘 코드가 레포지토리에 들어가기 때문에 재사용성 ⬇️