Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
관리 메뉴

개발자되기 프로젝트

지연 로딩과 조회 성능 최적화(FETCH JOIN) 본문

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

지연 로딩과 조회 성능 최적화(FETCH JOIN)

Seung__ 2021. 8. 22. 23:41
 

FETCH JOIN

실무에서 저어어어어어어어ㅓ엉어어어엉말 중요함. 1. fetch join SQL 조인의 종류가 아님 JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능임. j

bsh-developer.tistory.com

 

Fetch Join2

1. 페치 조인의 특징과 한계 페시 조인 대상에는 별칭을 줄 수 없다. 하이버네이트는 가능, 하지만 가급적 사용하지 말자. fetch join은 나랑 연관된 엔티티를 전부 다 가져옴. 따라서 fetch join에 별

bsh-developer.tistory.com

 

 

1. Fetch Join을 활용

 public List<Order> findAllWithMemberDelivery() {

       return  em.createQuery("select o from Order o " +
                "join fetch o.member " +
                "join fetch o.delivery", Order.class).getResultList();
    }

 

  • join fetch 를 통해 order를 가져오는 쿼리 한 번에 member와 delibery도 함께 조회한다.

 

 

  @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(Collectors.toList());

      return result;
    }
  • 와! 쿼리 한번으로 끝났다.
Hibernate: 
    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

 

2. 정리


  • 엔티티를 fetch join을 사용하여 쿼리 한 번으로 모두 조회함
  • 페치 조인으로 인해 order -> member, order -> delivery 는 이미 조회된 상태로 지연로딩 적용될 필요 없음.

 

 

3. GitHiub : 210822 FETCH JOIN


 

GitHub - bsh6463/SpringBootJPA1

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

github.com

 

Comments