*인프런 '실전! 스프링부트와 JPA 활용2' 강의 내용에서 배운 내용을 정리한 것입니다*

 

-대부분의 페이징+컬렉션 엔티티 조회문제는 다음과 같은 방법으로 해결할 수 있다 

1. ToOne관계는 모두 페치조인한다. ToOne관계는 row수를 증가시키지 않으므로 페이징 쿼리에 영향을 주지 않는다

 

2. 컬렉션은 지연로딩으로 조회한다 

 

3. 지연로딩 성능 최적화를 위해 hibernate.default_bath_fetch_size, @BatchSize를 적용한다.

-hibernate.defqult_bath_fetch_size: 글로벌 설정(applications.yml에서 설정)

-@BatchSize: 개별 최적화 (컬렉션은 컬렉션 필드에, 엔티티는 엔티티 클래스에 적용한다)

이 옵션을 사용하면 컬렉션이나, 프록시 객체를 한꺼번에 설정한 sizea만큼 IN 쿼리로 조회한다 

 

spring: jpa:
        properties:
          hibernate:
            default_batch_fetch_size: 1000

-장점

쿼리 호출 수가 1+N에서 1+1로 최적화 된다

조인보다 DB데이터 전송량이 최적화된다

DB데이터 전송량이 감소한다

컬렉션 페치 조인은 페이징이 불가능하지만, 이 방법은 페이징이 가능하다

-결론

ToOne관계는 페치 조인을 해도 페이징에 영향을 주지 않기 때문에 그냥 페치조인을 사용해서 쿼리 수를 줄이고, 나머지는 hibernate.default_batch_fetch_size로 최적화 하자

+ Recent posts