오봉이와 함께하는 개발 블로그

JPA - 페치 조인 한계 본문

BE/JPA

JPA - 페치 조인 한계

오봉봉이 2022. 7. 5. 23:07
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
      • 몇 단계로 페치 조인을 해야할 때는 사용할 수 있다.
    • 하지만 하이버네이트는 가능하지만, 가급적 사용하지 말자.
  • 둘 이상의 컬렉션은 페치 조인은 할 수 없다.
  • 컬렉션을 페치 조인하면 페이징 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