Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

컬렉션 조회 : 최적화 본문

인프런/[인프런] Springboot와 JPA활용 2

컬렉션 조회 : 최적화

Seung__ 2021. 8. 25. 00:31

1. 최적화


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

        List<Long> orderIds = toOrderIds(result);

        Map<Long, List<OrderItemQueryDto>> orderItemMap = findOrderItemMap(orderIds);

        //메모리에 map을 올려놓고 찾아서 꽂아넣기.
        result.forEach(o -> o.setOrderItems(orderItemMap.get(o.getOrderId())));

        return result;
    }

    private List<Long> toOrderIds(List<OrderQueryDto> result) {
        List<Long> orderIds = result.stream().map(o -> o.getOrderId())
                .collect(Collectors.toList());
        return orderIds;
    }


    private Map<Long, List<OrderItemQueryDto>> findOrderItemMap(List<Long> orderIds) {
        List<OrderItemQueryDto> orderItems = em.createQuery(
                "select new springjpa2.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();

        Map<Long, List<OrderItemQueryDto>> orderItemMap = orderItems.stream().collect(Collectors.groupingBy(orderItemQueryDto -> orderItemQueryDto.getOrderId()));
        return orderItemMap;
    }

    private List<OrderQueryDto> findOrders() {
        return em.createQuery(
                "select new springjpa2.repository.order.query.OrderQueryDto(o.id, m.name, o.orderDate, o.status, d.address) " +
                        "from Order o " +
                        "join o.member m " +
                        "join o.delivery d", OrderQueryDto.class)
                .getResultList();
    }
  • 흐름
    • orderDto 조회(컬렉션 입력 안돼있음)
    • 조회한 orders의 각 orderId를 list로 만듦
    • list로 만든 orderId에 해당하는 orderItemsDtos를 조회.
    • 각 orderItemDto에서 orderId를 뽑아서 Map으로 orderId와 orderItemDto를 매핑.
    • 처음에 조회한 컬렉션 입력이 안된 orderDtos에 orderItemDto 넣어줌.
    • 이 때 Map을 활용하기 때문에 매칭성능이 향상됨!! key로 바로 찾아서 value넣어줌.
  • Query: 루트 1번, 컬렉션 1번
  • ToOne 관계들을 먼저 조회하고, 여기서 얻은 식별자 orderId로 ToMany관계인 OrderItem을 한꺼번에 조회
  • Map을 활용해서 매칭 성능 향상(O(1))

 

2. GitHub : 210824 collection, optimization


 

GitHub - bsh6463/SpringBootJPA1

Contribute to bsh6463/SpringBootJPA1 development by creating an account on GitHub.

github.com

 

Comments