오봉이와 함께하는 개발 블로그
JPA - 페치 조인 한계 본문
728x90
페치 조인의 한계
- 페치 조인 대상에는 별칭을 줄 수 없다.
- SELECT t FROM Team t join fetch t.members as m (as는 생략 가능)
- 객체 그래프는 기본적으로 나랑 연관되어 있는 모든 것을 조회한다.
- 성능상 몇가지 정보만 필요하면, 별칭을 사용해서 페치 조인을 사용할 것이 아니라 다른 쿼리로 조회해야 한다.
- 객체 그래프는 기본적으로 나랑 연관되어 있는 모든 것을 조회한다.
- SELECT t FROM Team t join fetch t.members m join fetch m.team
- 몇 단계로 페치 조인을 해야할 때는 사용할 수 있다.
- 하지만 하이버네이트는 가능하지만, 가급적 사용하지 말자.
- SELECT t FROM Team t join fetch t.members as m (as는 생략 가능)
- 둘 이상의 컬렉션은 페치 조인은 할 수 없다.
- 컬렉션을 페치 조인하면 페이징 API(setFirstResult, setMaxResults)를 사용할 수 없다.
- 1:N 관계에서 페이징을 하면 데이터가 뻥튀기 되어 엄청나게 많은 결과가 조회될 수도 있다.
- 페이징을 하면 조회 결과가 달라지기 때문에 JPA는 조회 결과대로만 값을 가지고 있다고 정리가 되기 때문에 사용할 수 없다.
- 단, @Betchsize를 사용하면 페이징을 사용할 수 있다.
- 1:1, N:1 같은 단일 값 연관 필드들은 페치 조인해도 페이징 가능
- 하이버네이트는 경고 로그를 남기고 메모리에서 페이징(매우 위험하다)
- DB에서는 페이징되게 조회하지 않고 메모리에서 페이징하기 때문에 실제 DB에서 조회되는 값이랑 JPA를 통해 조회되는 값이랑 다르다.
페치 조인의 특징
- 연관된 엔티티들은 SQL 한 번으로 조회하기 때문에 성능 최적화에 도움이 된다.
- 엔티티에 직접 적용하는 글로벌 로딩 전략보다 우선한다.
- @OneToMany(fetch = FetchType.LAZY) //글로벌 로딩 전략
- 실무에서 글로벌 로딩 전략은 모두 지연 로딩이고 최적화가 필요한 곳은 페치 조인을 적용한다.
정리
- 모든 것을 페치 조인으로 해결할 수는 없다.
- 페치 조인은 객체 그래프를 유지할 때 사용하면 효과적이다.
- 여러 테이블을 조인해서 엔티티가 가진 모양이 아닌 전혀 다른 결과를 내야 하면, 페치 조인보다 일반 조인을 사용하고 필요한 데이터만 조회해서 DTO로 반환하는 것이 효과적이다.
페치 조인만 잘 이용해도 대부분의 N+1 문제를 해결할 수 있다.
페치 조인을 완벽하게 이해해서 사용하도록 하자.
출처 : 인프런 김영한 지식공유자님의 스프링 부트와 JPA 실무 완전 정복 로드맵 강의
728x90
'BE > JPA' 카테고리의 다른 글
JPA - 벌크 연산 (0) | 2022.07.06 |
---|---|
JPA - 다형성 쿼리, 엔티티 직접 사용, Named 쿼리 (0) | 2022.07.06 |
JPA - 페치 조인 기본 (0) | 2022.07.04 |
JPA - 경로 표현식 (0) | 2022.07.01 |
JPA - JPQL 함수 (0) | 2022.06.30 |
Comments