주문조회 v2

JIWOO YUN·2023년 9월 12일
0
post-custom-banner

DTO로 변환해서 전달하기

  • Dto의 경우에는 협의를 통해서 스펙을 정하는 편

현재 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에서 만들어준 이름으로 변경된 상태로 원하는 것을 보내주는게 가능하다.

  • 엔티티가 바뀐다고해도 바뀌지 않으며, 거기에 원하는 것을 추가하는 경우에도 DTO를 변경하거나 새로 추가해서 진행하면 되기 때문에 직접 노출하는 것보다 유연하게 보내는게 가능해진다.

하지만 여기서도 LazyLoding으로인한 데이터베이스 쿼리가 많이 발생하는 문제가 발생한다.

  • ORDER에 대해서 SQL이 1개 발생하여 결과가 2개 발생 (현재 데이터가 2개 존재하기 때문에)
  • 그다음 DTO로 변환할때 각 결과만큼 루프가 돌면서
  • ORDER의 멤버를 찾을때 쿼리 발생
  • delivery관련해서 쿼리 발생

order 주문 쿼리 1개 + 각 결과에 쿼리 2번씩 추가발생 *2-> 총 5번의 쿼리가 날라가게된다.

1 + 회원(N) + 배송(N) 발생

  • 만약 Eager로 할경우는 아예 예측이 불가능함으로 절대 하지 않도록하자.
        public SimpleOrderDto(Order order){
            orderId = order.getId();
            name = order.getMember().getName(); //Lazy 초기화
            orderDate = order.getOrderDate();
            orderStatus = order.getOrderStatus();
            address =order.getDelivery().getAddress(); //Lazy 초기화
        }

N+1문제란?

  • 연관관계에서 발생하는 이슈 -> 연관관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수만큼 조회쿼리가 추가로 발생하여 데이터를 읽어오는 문제 -> 쿼리가 다량으로 발생하여 성능의 저하가생긴다.
profile
열심히하자
post-custom-banner

0개의 댓글