본문 바로가기
JPA/JPQL

JPQL - 패치조인의 특징과 한계

by 킹차니 2021. 7. 24.
김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
https://www.inflearn.com/courses?s=%EA%B9%80%EC%98%81%ED%95%9C

 

 

JPQL - 패치조인의 특징과 한계

 

1. 패치 조인 대상에는 별칭을 줄 수 없습니다. ( 하이버네이트는 가능, 가급적 사용X )

아래처럼 하시면 안됩니다.

 

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

(일대다의 경우에도 데이터가 cross되어 조인된 테이블이 상당히 커지는 상황에서, 컬렉션 패치조인은 cross된 테이블에서 또 cross연산을 합니다. 하여 데이터가 잘 맞지 않게 됩니다.)

 

 

3. 컬렉션을 패치 조인하면 페이징 API(setFirstResult,  setMaxResults)를 사용할 수 없습니다.
일대일, 다대일같은 단일 값 연관 필드들은 패치조인을 해도 페이징 가능

하이버네이트는 경고 로그를 남기고 메모리에서 페이징(매우 위험)

팀A에 2명의 멤버(회원1, 회원2)가 있고, 컬렉션을 패치조인한 경우 아래와 같은 테이블이 될 수 있습니다.(이전 패치조인 포스팅참고)

그런데 페이지에 하나의 데이터를 띄우는 페이징을 한다고 가정할 때 위와 같은 경우 팀A에는 멤버가 하나만 있는 것으로 보입니다. 이러한 이유로 컬렉션을 패치조인한 경우에는 페이징API를 사용할 수 없습니다.

 

 

하여 위와같은 경우 페이징을 하기 위해서는 아래와 같이 해야합니다만 team에 대한 name등의 필드에 접근할 때마다 쿼리를 날려야하므로, N+1문제가 발생합니다. 

 

하여 아래와 같이 배치사이즈를 정할 수 있습니다.

아래와 같이 글로벌 설정으로도 지정할 수 있습니다.

이렇게 하면 쿼리가 N+1만큼 나가지 않습니다.

 

 

4. 연관된 엔티티들을 SQL 한 번으로 조회 - 성능 최적화

 

5. 엔티티에 직접 적용하는 글로벌 로딩 전략보다 우선함

( @OneToMany(fetch = FetchType.LAZY) // 글로벌 로딩 전략 )

(LAZY보다 패치조인이 우선권을 갖는다.)

 

6. 실무에서 글로벌 로딩 전략은 모두 지연 로딩

 

7. 최적화가 필요한 곳은 패치 조인 적용

 

 

 

패치 조인 - 정리

모든 것을 패치 조인으로 해결할 수 는 없음
• 패치조인은 객체 그래프를 유지할 때 사용하면 효과적

여러 테이블을 조인해서 엔티티가 가진 모양이 아닌 전혀 다른 결과를 내야 하면, 패치 조인 보다는 일반 조인을 사용하고 필요한 데이터들만 조회해서 DTO로 반환하는 것이 효과적

'JPA > JPQL' 카테고리의 다른 글

JPQL -엔티티 직접사용  (0) 2021.07.24
JPQL 다형성 쿼리  (0) 2021.07.24
JPQL - 페치 조인(fetch join)  (0) 2021.07.23
JPQL 경로 표현식  (0) 2021.07.22
JPQL 기본함수  (0) 2021.07.21