728x90
- (JPA) 페치 조인(fetch join) 의 활용
- JPQL에서 성능 최적화를 위해 제공하는기능입니다.
- 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능입니다.
- join fetch 명령어를 사용합니다.
- 페치 조인 예(v1(안쓴 버전), v2(쓴 버전) 비교)
/**
* V1. 엔티티를 조회해서 DTO로 변환(fetch join 사용X)
* - 단점: 지연로딩으로 쿼리 N번 호출
*/
@GetMapping("/api/v1/simple-orders")
public List<SimpleOrderDto> ordersV1() {
List<Order> orders = orderRepository.findAll();
List<SimpleOrderDto> result = orders.stream()
.map(o -> new SimpleOrderDto(o))
.collect(toList());
return result;
}
@Data
static class SimpleOrderDto {
private Long orderId;
private String name;
private LocalDateTime orderDate; //주문시간
private OrderStatus orderStatus;
private Address address;
public SimpleOrderDto(Order order) {
orderId = order.getId();
name = order.getMember().getName();
orderDate = order.getOrderDate();
orderStatus = order.getStatus();
address = order.getDelivery().getAddress();
}
}
- 엔티티를 DTO로 변환하는 일반적인 방법
- 쿼리가 총 1 + N + N번 실행됩니다.
- order 조회 1번(order 조회 결과 수가 N이 됩니다.)
- order -> member 지연 로딩 조회 N 번 order -> delivery 지연 로딩 조회 N 번
- 예) order의 결과가 4개면 최악의 경우 1 + 4 + 4번 실행됩니다.(최악의 경우)
- 페치 조인 최적화 예
@GetMapping("/api/v2/simple-orders")
public List<SimpleOrderDto> ordersV2() {
List<Order> orders = orderRepository.findAllWithMemberDelivery();
List<SimpleOrderDto> result = orders.stream()
.map(o -> new SimpleOrderDto(o))
.collect(toList());
return result;
}
//OrderRepository 추가 코드
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();
}
- 엔티티를 페치 조인(fetch join)을 사용해서 쿼리 1번에 조회
- 페치 조인으로 order -> member , order -> delivery 는 이미 조회 된 상태 이므로 지연로딩X
728x90
'JPA' 카테고리의 다른 글
스프링 데이터 JPA 란? (0) | 2022.02.15 |
---|---|
QueryDSL 소개 (0) | 2022.02.15 |
회원등록 API v1, v2 차이 (0) | 2022.02.14 |
변경 감지(dirty check)와 병합(merge) (0) | 2022.02.14 |
(Querydsl) ON 절을 활용한 조인 (0) | 2022.02.14 |