• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

v5의 쿼리 횟수에 대 질문이 있습니다.

23.12.16 16:36 작성 조회수 196

1

public List<OrderQueryDto> findAllByDto_optimization() {
    List<OrderQueryDto> result = findOrders();

    List<Long> orderIds = result.stream()
            .map(o -> o.getOrderId())
            .collect(Collectors.toList());

    List<OrderItemQueryDto> orderItems = em.createQuery(
                    "select new jpabook.jpashop.repository.order.query.OrderItemQueryDto(oi.order.id, i.name, oi.orderPrice, oi.count)" +
                            " from OrderItem oi" +
                            " join oi.item i" +
                            " where oi.order.id in :orderIds", OrderItemQueryDto.class)
            .setParameter("orderIds", orderIds)
            .getResultList();

    //최적화(Lambda사용)
    Map<Long, List<OrderItemQueryDto>> orderItemMap = orderItems.stream()
            .collect(Collectors.groupingBy(orderItemQueryDto -> orderItemQueryDto.getOrderId()));

    result.forEach(o -> o.setOrderItems(orderItemMap.get(o.getOrderId())));

    return result;
}

 

여기서 map을 사용하는 코드가 있는 경우에는 쿼리를 한 번 날리고 map으로 가져와서 값을 세팅하기 때문에 쿼리가 총 2번 나가는 거고 그 부분이 없으면 어떤 방식으로 쿼리가 나가는 건가요?

답변 1

답변을 작성해보세요.

0

안녕하세요. spacebar님

map을 사용하지 않으면 해당 데이터 하나하나를 DB에서 직접 조회해야 합니다.

최악의 경우 N+1 문제가 발생할 수 있습니다.

감사합니다.