WEB JAVA SPRING/PROJECT
[Day-16] 간단한 주문 조회 V2: 엔티티를 DTO로 변환
sshhhh
2023. 8. 28. 10:53
api 스펙에 딱 맞춰 출력이 됐다..
OrderSimpleApiController
@GetMapping("api/v2/simple-orders")
public List<SimpleOrderDto> ordersV2(){
//Order 그대로 반환하지 않고 dto로 변환하서 반환하자
List<Order> orders = orderRepository.findByString(new OrderSearch());
List<SimpleOrderDto> result = orders.stream()
.map(o-> new SimpleOrderDto(o))
.collect(Collectors.toList());
return result;
}
@Data
static class SimpleOrderDto{
//api 스펙 명확하게 규정
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();
}
}
쿼리가 총 1 + N + N번 실행된다. (v1과 쿼리수 결과는 같다.)
- order 조회 1번(order 조회 결과 수가 N이 된다.)
- order -> member 지연 로딩 조회 N 번
- order -> delivery 지연 로딩 조회 N 번
예) order의 결과가 4개면 최악의 경우 1 + 4 + 4번 실행된다.(최악의 경우)
지연로딩은 영속성 컨텍스트에서 조회하므로, 이미 조회된 경우 쿼리를 생략한다