[강의]스프링 부트와 JPA 활용2 - 컬렉션 조회 최적화

컬렉션 조회 최적화

XToOne 관계에서는 fetch join으로 쿼리수를 최적화한다.

컬렉션은 fetch join 시 페이징이 불가능하다.

컬렉션은 fetch join 대신에 지연로딩을 유지하면서

hibernate.default_batch_fetch_size , @BatchSize 로 최적화한다.

권장 순서

1. 엔터티 조회 방식으로 우선 접근한다.
    
    1. fetch join으로 쿼리 수를 최적화한다.
    2. 컬렉션 최적화
       1. 페이징 필요 : hibernate.default_batch_fetch_size , @BatchSize  최적화한다.
       2. 페이징 필요X : fetch join을 사용한다.
    
2. 엔티티 조회방식으로 해결이 안되면 DTO조회방식으로 JPA에서 DTO를 직접 조회한다.
3. SQL 


hibernate.default_batch_fetch_size는 글로벌 설정이다.
spring:
    jpa:
        properties:
            hibernate:
                default_batch_fetch_size: 1000

개별로 설정하려면 @BatchSize 적용

대부분의 페이징 + 컬렉션 엔티티 조회 문제 해결법

페이징 + 컬렉션 엔티티를 함께 조회?

먼저 XToOne(OneToOne, ManyToOne) 관계를 모두 페치조인 한다.
ToOne 관계는 row수를  증가시키지 않으므로 페이징 쿼리에 영향을 주지 않는다.
컬렉션은 지연 로딩으로 조회한다.
지연 로딩 성능 최적화를 위해 hibernate.default_batch_fetch_size , @BatchSize 를 적용한다.

정리

XToOne 관계는 페치 조인해도 페이징에 영향이 없다.

따라서 XToOne 관계는 페치조인해서 쿼리 수를 줄이고

나머지는 hibernate.default_batch_fetch_size 로 최적화한다.