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

spacebar님의 프로필 이미지
spacebar

작성한 질문수

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

주문 조회 V5: JPA에서 DTO 직접 조회 - 컬렉션 조회 최적화

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

작성

·

270

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 문제가 발생할 수 있습니다.

감사합니다.

spacebar님의 프로필 이미지
spacebar

작성한 질문수

질문하기