김영한님의 인프런 강의와 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 |