간단한 주문 조회 v2 엔티티를 DTO로 변환
이제 그럼 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으로 최적화를 해보자.
댓글남기기