WEB JAVA SPRING/PROJECT

[Day-16] 간단한 주문 조회 V2: 엔티티를 DTO로 변환

sshhhh 2023. 8. 28. 10:53

"api/v2/simple-orders"

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번 실행된다.(최악의 경우)
지연로딩은 영속성 컨텍스트에서 조회하므로, 이미 조회된 경우 쿼리를 생략한다