JPA

[JPA] 27. Fetch 조인 - 한계

inuma 2021. 2. 16. 22:46
프로젝트 git url github.com/rtef23/JpaStudy
필요 1. docker
2. docker-compose
프로젝트 정보 mysql : 5.7 - docker image
java : 1.8

 

한계

  • 페치 조인 대상에는 별칭을 줄 수 없다.
    (Hibernate는 가능하지만 가급적 사용하지 않는 것을 권고)
    여러 depth를 타고 Fetch Join을 하는 경우에는 별칭을 주는 경우도 있다.
//JPQL
SELECT t
  FROM Team t
  JOIN FETCH t.members m //별칭을 주지 않는 것이 좋다.
 WHERE m.age > 10

 

  • 둘 이상의 컬렉션은 페치 조인 할 수 없다.
  • 컬렉션을 페치 조인하면 페이징 API(setFirstResult, setMaxResults)를 사용할 수 없다.
    • 일대일, 다대일 같은 단일 값 연관 필드들은 페치 조인해도 페이징 가능
    • 하이버네이트의 경우, 경고 로그를 남기고 메모리에서 페이징 처리를 수행한다.(OOM 위험)
    • @BatchSize 어노테이션을 이용하여 연관된 테이블에서 관련이 있는 데이터들만 조회하도록 하여 
      N + 1 문제를 어느정도 해소가능하다.
  • 여러 테이블을 조인해서 엔티티가 가진 모양이 아닌 전혀 다른 결과를 내야 하면,
    페치 조인보다는 일반 조인을 사용하고 필요한 데이터들만 조회해서
    DTO로 반환하는 것이 효과적