엔티티를 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문제는 해결이 가능하다.
'JPA' 카테고리의 다른 글
| 2월 24일 JPA API개발 고급 , 주문조회 v1 (0) | 2023.02.24 |
|---|---|
| 2월 24일 JPA 간단한 주문조회 V4 (0) | 2023.02.24 |
| 2월 23일 JPA 간단한 주문조회 v2 (0) | 2023.02.23 |
| 2월 22일 JPA API 개발 고급 (0) | 2023.02.22 |
| 2월 22일 JPA 회원조회 V2 (0) | 2023.02.22 |