본문 바로가기

JPA

[JPA] 페치 조인(fetch join)의 한계

1. 페치 조인 대상에는 별칭을 줄 수 없다.

이렇게 하면 나머지 누락 값들이 문제가 될 수 있기 때문이다.

 

2. 둘 이상의 컬렉션은 페치 조인할 수 없다.

OneToMany -> Team - Member

OneToMany -> Team - Order

이러한 상황에서 Team에서 Member와 Order를 fetch join은 할 수 없다.(fetch join 컬렉션은 하나만 할 수 있다.)

 

3. 컬렉션을 페치 조인하면 페이징 API를 사용할 수 없다.

일대다 같은 경우에는 SQL입장에서 데이터가 뻥튀기되기 때문에 페이징 할 때 사이즈에 맞춰서 잘라지면 누락되는 값이 있을 수 있기 때문이다.

 

컬렉션을 페이조인할 때 페이징을 사용해서 경고 메시지가 뜨는 걸 확인할 수 있다.

 

해결방법 1) fetch join을 제거한다.

이렇게하면 limit가 실행 함으로 페이징이 되지만 지연 로딩으로 불러오기 때문에 최적화가 되지 않는 것을 알 수 있다.

 

해결방법 2) @BatchSize를 이용한다.

' ?, ?' 안에는 Team id가 두 개 들어가 있다.

즉, 한번에 팀 1과 관련된 Member와 팀 2와 관련된 Member를 가져온 것

 

Team을 가져올때 Member는 지연 로딩 상태인데 이것을 가져올 때

Team 뿐만 아니라 리스트에 담긴 Team을 한 번에 100개씩 넘긴다.

지금은 2개지만, 만약 결과가 150개라면 물음표를 100개 날리고 그다음에 50개를 날린다.

글로벌 세팅으로도 할 수 있다.

'JPA' 카테고리의 다른 글

[Spring Boot] JPA application.yml (properties)기능  (0) 2021.11.08
[JPA] 쿼리 작성 법  (0) 2021.01.21
[JPA] 페치조인(fetch join)이란?  (0) 2021.01.21
[JPA] 지연 로딩과 즉시 로딩  (2) 2021.01.09
[JPA] 프록시란?  (0) 2020.12.23