ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 페치 조인(fetch join)
    JPA 2021. 2. 23. 20:41

    페치 조인은 JPQL에서 성능 최적화를 위해 제공하는 기능이다. 

    보통 연관관계 매핑을 할 때 지연 로딩 전략을 많이 사용하게 되는데 페치 조인을 사용하게 되면 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 것이 가능하다.

     

    사용방법

    select m from Member m join fetch m.team

     

    Member와 Member에 연관된 team을 한 번에 조회하게 된다.

     

    페치 조인은 X ToOne 관계에서 사용하면 정말 유용하게 사용할 수 있다. 하지만 X ToMany 관계에서는 함부로 페치 조인을 사용하면 안 된다. 

    예를 들어 위의 예시처럼 Member와 team이 OneToMany 관계라고 생각해보자. 여기서 컬렉션 페치 조인을 사용하면 Many를 기준으로 조인이 되기 때문에 데이터양이 예측할 수 없이 증가하게 된다. 

    여기서 해결방법이 존재하긴 한다.

     

    select distinct m from Member m join fetch m.team 

     

    distinct를 사용한 이유는 OneToMany 조인을 하게 되면 데이터베이스 row 수가 증가하고 그 결과 Member 엔티티의 조회 수도 증가하게 된다. JPA의 distinct는 SQL에 distinct를 추가하고, 추가로 같은 엔티티가 조회되면, 애플리케이션에서 중복을 걸러준다. 하지만 단점은 페이징이 불가능하다.

     

    그러면 페이징을 하려면 어떻게 해야 할까?

     

    X ToOne 관계는 페치 조인을 해도 페이징이 가능하다. 하지만 X ToMany 관계는 페치 조인을 하면 distinct를 사용해야 하기 때문에 페이징이 불가능하다. 따라서 이때 사용하는 기능이 hibernate.default_batch_fetch_size (글로벌 설정)이다.

    이 옵션을 적용하면 컬렉션이나 프록시 객체를 한꺼번에 설정한 size 만큼 IN 쿼리로 조회한다.

     

    결론적으로 X ToOne 관계는 페치 조인을 사용하고 X ToMany (컬렉션)은 batch size를 통해서 최적화를 하게 되면 페이징도 할 수 있고, 간편하게 최적화도 된다.

     

    'JPA' 카테고리의 다른 글

    Querydsl로 동적쿼리 쉽게 작성하기  (0) 2021.03.01
    벌크 연산  (0) 2021.02.28
    OSIV (Open Session In View)  (0) 2021.02.22

    댓글

Designed by Tistory.