최대 1 분 소요

이제 그럼 DTO로 담아서 리턴 해보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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(); // Lazy 초기화 → 쿼리 발생  
        orderDate = order.getOrderDate();  
        orderStatus = order.getStatus();  
        address = order.getDelivery().getAddress(); // Lazy 초기화 → 쿼리 발생  
    }  
}

다음과 같이 return 해줄 DTO를 만들어 주고

1
2
3
4
5
6
7
8
@GetMapping("/api/v2/simple-orders")  
public List<SimpleOrderDto> ordersV2() {  
    List<Order> orders = orderRepository.findAllByString(new OrderSearch());  
  
    return orders.stream()  
            .map(SimpleOrderDto::new)  
            .collect(Collectors.toList());  
}

다음과 같이 orders 를 stream 으로 dto로 바꿔서 리턴해줬다.

결과는 다음과 같이 잘 나왔다 . 하지만 문제가 있다.

order 는 2건인데 쿼리는 7번이 나갔다…

이는 fetch 타입이 Lazy 로 돼있어서 프록시 객체를 처음에 받고 dto에서 getMember.getName 한 순간에 또 다시 쿼리가 발생하는 상황이다. ( N+1 문제 )

다음 V3 에서는 Fetch Join으로 최적화를 해보자.

댓글남기기