자바 ORM 표준 JPA 프로그래밍(인프런)

Ch11. 객체지향 쿼리 언어2(중급 문법) - 페치 조인(한계)

webmaster 2021. 12. 18. 12:33
728x90

페치 조인의 특징과 한계

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

  • 하이버네이트는 가능, 가급적 사용 X 

fetch Join 대상에는 별칭을 줄 수 없다.

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

  • 1-다-다로 되기 때문에 데이터 적합성이 안 맞을 수가 있다.

컬렉션을 페치 조인하면 페이징 API(setFirstResult, setMaxResults)를 사용할 수 없다. 

  • 일대일, 다대일 같은 단일 값 연관 필드들은 페치 조인해도 페이징 가능 
  • 하이버네이트는 경고 로그를 남기고 메모리에서 페이징(매우 위험)

일대다 FetchJoin 시 페이징을 하게 되면???
하이버네이트 경고 에러

  • 하이버 네이트 경고 에러가 뜬다
    •  why? 일대다 페치조인같은경우 데이터가 뻥튀기되어 기준을 어디로 페이징을 해야 할지 정할 수 없다.

해결 방법

  • 방향을 뒤집어서 일대다를 다대일로 변경해서 해결
  •  BatchSize를 사용해서 in 절로 여러 개를 가지고 와서 해결

어노테이션으로 줄수 있다
in 절로 batchSize 만큼 한번에 읽어온다.
공통으로 persistance.xml에 설정해서 BatchSize를 줄 수도 있다.

  • DTO로 매핑해서 뽑는다.

페치조인 특징 

  • 연관된 엔티티들을 SQL 한 번으로 조회 - 성능 최적화
  • 엔티티에 직접 적용하는 글로벌 로딩 전략보다 우선함
    • @OneToMany(fetch = FetchType.LAZY) //글로벌 로딩 전략
  • 실무에서 글로벌 로딩 전략은 모두 지연 로딩 
  • 최적화가 필요한 곳은 페치 조인 적용

정리

  • 모든 것을 페치 조인으로 해결할 수는 없음 
  • 페치 조인은 객체 그래프를 유지할 때 사용하면 효과적 
  • 여러 테이블을 조인해서 엔티티가 가진 모양이 아닌 전혀 다른 결과를 내야 하면, 페치 조인보다는 일반 조인을 사용하고 필요 한 데이터들만 조회해서 DTO로 반환하는 것이 효과적
728x90