오봉이와 함께하는 개발 블로그
JPA 2 - 간단한 주문 조회 V3 : 엔티티를 DTO로 변환 (페치 조인 최적화) 본문
728x90
간단한 주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화
OrderSimpleApiController - 추가
@GetMapping("/api/v3/simple-orders")
public List<SimpleOrderDto> ordersV3() {
List<Order> orders = orderRepository.findAllWithMemberDelivery();
List<SimpleOrderDto> result = orders.stream()
.map(o -> new SimpleOrderDto(o))
.collect(toList());
return result;
}
OrderRepository - 추가 코드
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();
}
- 엔티티를 페치 조인(fetch join)을 사용해서 쿼리 1번에 조회
- 쿼리 하나로 Order, Member, Delivery 모두 조회한다.
- 페치 조인으로 order -> member, order -> delivery는 이미 조회 된 상태 이므로 지연로딩X
결과 & 쿼리
[
{
"orderId": 4,
"name": "userA",
"orderDate": "2022-09-04T23:17:03.57945",
"orderStatus": "ORDER",
"address": {
"city": "서울",
"street": "1",
"zipcode": "1111"
}
},
{
"orderId": 11,
"name": "userB",
"orderDate": "2022-09-04T23:17:03.634244",
"orderStatus": "ORDER",
"address": {
"city": "진주",
"street": "2",
"zipcode": "2222"
}
}
]
select
order0_.order_id as order_id1_6_0_,
member1_.member_id as member_i1_4_1_,
delivery2_.delivery_id as delivery1_2_2_,
order0_.delivery_id as delivery4_6_0_,
order0_.member_id as member_i5_6_0_,
order0_.order_date as order_da2_6_0_,
order0_.status as status3_6_0_,
member1_.city as city2_4_1_,
member1_.street as street3_4_1_,
member1_.zipcode as zipcode4_4_1_,
member1_.name as name5_4_1_,
delivery2_.city as city2_2_2_,
delivery2_.street as street3_2_2_,
delivery2_.zipcode as zipcode4_2_2_,
delivery2_.status as status5_2_2_
from
orders order0_
inner join
member member1_
on order0_.member_id=member1_.member_id
inner join
delivery delivery2_
on order0_.delivery_id=delivery2_.delivery_id
같은 데이터에 기존 5개의 쿼리가 나가던 것과 다르게 쿼리 1개만으로 해결됐다.
실무에서 자주 사용하는 기법이다.
인프런 김영한 지식공유자님 강의 - 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
728x90
'BE > JPA' 카테고리의 다른 글
JPA 2 - 주문 조회 V1 : 엔티티 직접 노출 (0) | 2022.09.05 |
---|---|
JPA 2 - 간단한 주문 조회 V4 : JPA에서 DTO로 바로 조회 (0) | 2022.09.05 |
JPA 2 - 간단한 주문 조회 V2 : 엔티티를 DTO로 변환 (0) | 2022.09.04 |
JPA 2 - 간단한 주문 조회 V1 : 엔티티 직접 노출 (0) | 2022.09.04 |
JPA 2 - API 개발 고급 : 조회용 샘플 데이터 입력 (0) | 2022.09.04 |
Comments