오봉이와 함께하는 개발 블로그

JPA 2 - 간단한 주문 조회 V2 : 엔티티를 DTO로 변환 본문

BE/JPA

JPA 2 - 간단한 주문 조회 V2 : 엔티티를 DTO로 변환

오봉봉이 2022. 9. 4. 22:13
728x90

간단한 주문 조회 V2: 엔티티를 DTO로 변환

    @GetMapping("/api/v2/simple-orders")
    public List<SimpleOrderDto> ordersV2() {
        List<Order> orders = orderRepository.findAllByCriteria(new OrderSearch());
        List<SimpleOrderDto> result = orders.stream()
                .map(o -> new SimpleOrderDto(o)) // a -> b로 바꿈.
                .collect(Collectors.toList());
        return result;
    }

    @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.getStatus();
            address = order.getDelivery().getAddress();
        }
    }

    {
        "orderId": 4,
        "name": "userA",
        "orderDate": "2022-09-04T21:54:35.695742",
        "orderStatus": "ORDER",
        "address": {
            "city": "서울",
            "street": "1",
            "zipcode": "1111"
        }
    },
    {
        "orderId": 11,
        "name": "userB",
        "orderDate": "2022-09-04T21:54:35.752488",
        "orderStatus": "ORDER",
        "address": {
            "city": "진주",
            "street": "2",
            "zipcode": "2222"
        }
    }
]
  • 엔티티를 DTO로 변환하는 일반적인 방법이다.
  • 쿼리가 총 1 + N + N번 실행된다(v1과 쿼리 수 결과는 같음)
    • order 조회 1번(order 조회 결과 수가 N이 됨.)
    • order -> member 지연 로딩 조회 N 번
    • order -> delivery 지연 로딩 조회 N 번
    • 예 : order의 결과가 4개면 최악의 경우 1 + 4 + 4번 실행된다.(최악의 경우)
      • 지연로딩은 영속성 컨텍스트에서 조회하므로, 이미 조회된 경우 쿼리를 생략한다.

LAZYEAGER로 변경하면 N+1문제가 해결되지 않을까?
-> 해결되지 않는다. 오히려 예상치 못한 쿼리들이 나가서 더 안 좋은 결과가 생긴다.

인프런 김영한 지식공유자님 강의 - 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
728x90
Comments