오봉이와 함께하는 개발 블로그

JPA 2 - 간단한 주문 조회 V3 : 엔티티를 DTO로 변환 (페치 조인 최적화) 본문

BE/JPA

JPA 2 - 간단한 주문 조회 V3 : 엔티티를 DTO로 변환 (페치 조인 최적화)

오봉봉이 2022. 9. 4. 23:21
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
Comments