현재 v2버전의 경우에는 Dto에 담을 것은
5가지를 가져오자.
@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();
orderDate = order.getOrderDate();
orderStatus = order.getOrderStatus();
address =order.getDelivery().getAddress();
}
}
그리고 List로 반환보단 Result로 감싸서 data로 반환해야하기 때문에 result를 따로 만들어서 추가
@Data
@AllArgsConstructor
public class Result<T> {
private T data;
}
@GetMapping("/api/v2/sample-orders")
public Result ordersV2(){
List<Order> all = orderRespository.findAllByString(new OrderSearch());
List<SimpleOrderDto> collect = all.stream()
.map(o -> new SimpleOrderDto(o))
.collect(Collectors.toList());
return new Result(collect);
}
완성된 코드
이렇게 할경우 postMan으로 조회를 진행하는 경우
DTO에서 만들어준 이름으로 변경된 상태로 원하는 것을 보내주는게 가능하다.
하지만 여기서도 LazyLoding으로인한 데이터베이스 쿼리가 많이 발생하는 문제가 발생한다.
order 주문 쿼리 1개 + 각 결과에 쿼리 2번씩 추가발생 *2-> 총 5번의 쿼리가 날라가게된다.
1 + 회원(N) + 배송(N) 발생
public SimpleOrderDto(Order order){
orderId = order.getId();
name = order.getMember().getName(); //Lazy 초기화
orderDate = order.getOrderDate();
orderStatus = order.getOrderStatus();
address =order.getDelivery().getAddress(); //Lazy 초기화
}