본문 바로가기

JPA

2월 23일 JPA 간단한 주문조회 V3

엔티티를 DTO로 반환 , 페치조인 최적화

 

V2와 로직은 거의 비슷하다

@GetMapping("/api/v3/simple-orders")

public List<SimpleOrderDTO> ordersV3(){

 List<order> orders = orderRepositroy.findAllWithMemberDelivery();

 List<SimpleOrderDTO> result = orders.stream()

 .map(o -> new SimpleOrderDTO(o))

 .collect(Collectors.toList());

 

return result;

}

 

V2와의 차이는 order를 v2와 다른방법으로 가져온다는것(페치조인을 적용해서 가져온다,)

 

Repository에 생성

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

}

 

find 함수로 정해진 쿼리가 아니라 쿼리를 만들어 실행

JPA에 fetch 조인을 사용한다.

join fetch는 필드에 fetchType.LAZY즉 지연로딩을 모두 무시하고 

그 필드가 Join fetch 절에 있다면 지연로딩을 무시하고 즉시가져온다.

 

이는 fetchType.LAZY 전략을 수정하지 않고

해당 건에 대해서만 즉시로딩 시키겠다는 것이다.

이것을 페치조인이라고 한다.

이걸로 JPA에서 발생하는 대부분의 n+1문제는 해결이 가능하다.