*인프런 '실전! 스프링부트와 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로 최적화 하자
'JPA > JPA + SpringBoot' 카테고리의 다른 글
[JPA+SpringBoot] 컬렉션 조회 최적화(DTO,지연로딩,페치조인 사용했을 때)-문제발생 (0) | 2022.03.18 |
---|---|
[JPA+SpringBoot] API 성능 최적화 (엔티티->DTO, JPA에서 바로 DTO 조회) (0) | 2022.03.18 |
[JPA+SpringBoot] 엔티티를 API에 노출했을 때 발생할 수 있는 문제점과 해결방법 (0) | 2022.03.18 |
[JPA+SpringBoot] 3/2 공부 내용 기록(웹 구현, OrderController) (0) | 2022.03.07 |
[JPA +SpringBoot] 변경감지와 병합(dirty checking, merge) (0) | 2022.03.07 |