강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

terecal님의 프로필 이미지
terecal

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

주문 조회 V3.1: 엔티티를 DTO로 변환 - 페이징과 한계 돌파

쿼리가 6번이 아니라 3번만 출력 되요

작성

·

189

0

지금 코드가 아래 같은데 sql이 총 6번 찍혀야 되는데 3번만 찍혀서여  오더 두번 아이템 4번 이렇게 총 6개여야 하는데 오더 한번 아이템 두번 총3번만 찍히는데 뭐가 잘못된 것일까여?

@GetMapping("/api/v3.1/orders")
public List<OrderDto> ordersV3_page() {
    List<Order> orders = orderRepository.findAllWithMemberDelivery();

    List<OrderDto> result = orders.stream()
            .map(o -> new OrderDto(o))
            .collect(Collectors.toList());

    return result;
}


@Data
static class OrderDto {
    private Long orderId;
    private String name;
    private LocalDateTime orderDate; //주문시간
    private OrderStatus orderStatus;
    private Address address;
    private List<OrderItemDto> orderItems;

    public OrderDto(Order order) {
        orderId = order.getId();
        name = order.getMember().getName();
        orderDate = order.getOrderDate();
        orderStatus = order.getStatus();
        address = order.getDelivery().getAddress();
        // 주문 아이템 정보에 대한 프록시 초기화 구문
        // order.getOrderItems().stream().forEach(o-> o.getItem().getName());
        // orderItems = order.getOrderItems();
        orderItems = order.getOrderItems().stream()
                .map(orderItem -> new OrderItemDto(orderItem))
                .collect(toList());
    }
}

@Getter
static class OrderItemDto {
    private String itemName;//상품 명
    private int orderPrice; //주문 가격
    private int count; //주문 수량

    public OrderItemDto(OrderItem orderItem) {
        itemName = orderItem.getItem().getName();
        orderPrice = orderItem.getOrderPrice();
        count = orderItem.getCount();
    }
}

 

ex2)

public List<Order> findAllWithMemberDelivery() {
    return em.createQuery(
            "select o from Order o" +
                    " join fetch o.member m" +
                    " join fetch o.delivery d", Order.class
    ).getResultList();
}

post 맨 요청 결과:

url:

http://127.0.0.1:8080/api/v3.1/orders/

result:

[
    {
        "orderId": 4,
        "name": "userA",
        "orderDate": "2021-01-27T03:46:24.680706",
        "orderStatus": "ORDER",
        "address": {
            "city": "서울",
            "street": "1",
            "zipcode": "1111"
        },
        "orderItems": [
            {
                "itemName": "JPA1 BOOK",
                "orderPrice": 10000,
                "count": 1
            },
            {
                "itemName": "JPA2 BOOK",
                "orderPrice": 20000,
                "count": 2
            }
        ]
    },
    {
        "orderId": 11,
        "name": "userB",
        "orderDate": "2021-01-27T03:46:24.767473",
        "orderStatus": "ORDER",
        "address": {
            "city": "진주",
            "street": "2",
            "zipcode": "2222"
        },
        "orderItems": [
            {
                "itemName": "SPRING1 BOOK",
                "orderPrice": 20000,
                "count": 3
            },
            {
                "itemName": "SPRING2 BOOK",
                "orderPrice": 40000,
                "count": 4
            }
        ]
    }
]

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. terecal님

쿼리가 총 3번 호출되는 것이 맞습니다^^

처음 쿼리는 order들을 한번에 조회합니다. -> selelct * form order -> 주문 결과 2개

1번 쿼리 -> order조회: 결과 order2개

"orderId": 4

-> 2번 쿼리 orderItem 쿼리: 결과 상세 아이템2개 

"orderId": 11

-> 3번 쿼리 orderItem 쿼리: 결과 상세 아이템2개 

감사합니다.

terecal님의 프로필 이미지
terecal

작성한 질문수

질문하기