Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Proxy
- QueryDSL
- 김영한
- Servlet
- jpa
- Android
- JPQL
- spring
- 알고리즘
- springdatajpa
- 스프링 핵심 원리
- AOP
- Spring Boot
- 그리디
- http
- kotlin
- db
- 스프링
- Exception
- 스프링 핵심 기능
- transaction
- java
- 백준
- Thymeleaf
- pointcut
- 자바
- Greedy
- JDBC
- 인프런
- SpringBoot
Archives
- Today
- Total
개발자되기 프로젝트
컬렉션 조회 : 최적화 본문
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
'인프런 > [인프런] Springboot와 JPA활용 2' 카테고리의 다른 글
API 개발 정리 (0) | 2021.08.25 |
---|---|
컬렉션 조회 최적화 : 플랫 데이터 최적화 (0) | 2021.08.25 |
컬렉션 조회: DTO 직접 조회 (0) | 2021.08.24 |
컬렉션 조회 최적화 :페이징 & batch_fetch (0) | 2021.08.24 |
컬렉션 조회 최적화 : fetch join 적용 (0) | 2021.08.24 |
Comments