① x ToOne (OneToOne, ManyToOne) 관계는 모두 Fetch Join 한다.
(ToOne 관계는 row 수를 증가시키지 않음으로 페이징 쿼리에 영향을 주지 않기 때문이다.)
② 컬렉션은 지연로딩으로 조회
(Fetch Join으로 조회하지 않고 그냥 둔다.)
③ 'hibernate.default_batch_fetch_size' 와 '@BatchSize' 를 적용한다.
지연로딩 성능 최적화를 위해,
'hibernate.default_batch_fetch_size' : 글로벌 설정
'@BatchSize' : 특정 엔티티 설정
을 적용한다.
① x ToOne (OneToOne, ManyToOne) 관계는 모두 Fetch Join 한다.
'Order' - 'Member' : ManyToOne
'Order' - 'Delivery' : OneToOne
'Member' 와 'Delivery' 를 FetchJoin으로 조회한다.
② 컬렉션은 지연로딩으로 조회
row 수를 증가시켜, 페이징 쿼리에 영향을 주는 컬렉션은 페치 조인 하지 않는다.
'Order' - 'OrderItem' : OneToMany
OrderItem은 Fetch Join을 하지 않고, 그대로 지연로딩으로 조회한다.
②번까지 완료한 후에 API 요청을 하였을 때 발생하는 쿼리
Order 테이블의 2개의 데이터가 조회되고, -> Order 테이블 조회 쿼리 -> 1개
그 2개의 데이터를 각각 OrderItem이 지연 로딩 -> 데이터 2개에 대한 Order_Item 조회 쿼리 -> 2개
각각의 OrderItem에 대한 Item 2개씩 -> 2개의 Order_Item에 대한 각각 2개의 Item 데이터 조회 -> 2 * 2 = 4개
총 7개의 쿼리가 발송된다.
③ 'hibernate.default_batch_fetch_size' 와 '@BatchSize' 를 적용한다.
application.yml 에 하이버네이트 옵션을 설정
[ 결론 ]
Query 3개가 발송된다.
IN Query 로 100개를 한번에 가져올 수 있다.
이를 통해,
OrderItem query 2개 -> 1개
Item query 4개 -> 1개
로 Query의 수를 줄일 수 있고, 동시에 페이징 까지 가능하다.
'Spring' 카테고리의 다른 글
[Spring + IntelliJ] Generated source files should not be edited 경고 메시지 (0) | 2024.01.25 |
---|---|
[Querydsl] SpringBoot 3.2.x Querydsl 설정하기 (문제 / 해결) (0) | 2024.01.22 |
[Spring] ComponentScan (컴포넌트 스캔) (0) | 2023.11.18 |
[Spring] 싱글톤(Singleton) 과 스프링 컨테이너 (0) | 2023.11.12 |
[Spring] 스프링 빈 생성과정 / 스프링 빈 구성 정보 파일 지원 과정 (0) | 2023.11.10 |