ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA] 페치조인(fetch join)이란?
    JPA 2020. 4. 3. 04:09
    반응형

    페치조인(fetch join)


    • 기존 SQL의 조인이 아님
    • JPQL의 성능 튜닝을 위해 제공되는 조인
    • 연관된 엔티티 or  컬렉션을 SQL 한번에 함께 조회하는 기능

    간단한 예제를 보자.

    @Entity
    @Getter
    public class Member {
        @Id @GeneratedValue
        private Long id;
        private String username;
        private int age;
        
        // 양방향 연관 필드
        // 연관관계 주인
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "TEAM_ID")
        private Team team;
    }
    @Entity
    @Getter
    public class Team {
    
        @Id @GeneratedValue
        private Long id;
    
        private String name;
    
        // 양방향 연관 필드
        @OneToMany(mappedBy = "team")
        private List<Member> memList = new ArrayList<Member>();
    
    }
    

     위 두개의 엔티티는 회원과 팀을 나타내고 있으면서 N : 1 양방향 매핑으로 동작하고 있다. 연관관계의 주인은 N쪽인 회원 엔티티로 선정하였고 FetchType.Lazy를 통해 조회과정에서 지연로딩 전략을 선택하였다.

     

    페치조인을 적용해보자.

    // JPQL
    select m from Memeber m join fetch m.team
    
    // 실제 데이터베이스에 전송되는 SQL
    SELECT M.*, T.* FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID = T.ID

    JPQL에서 join fetch 를 사용하면 실제 SQL에서는 두 테이블을 조인한 테이블을 조회할 수 있다. 데이터베이스로 전송되는 실제 SQL을 자세히 보면 FetchType.EAGER를 사용한 즉시로딩 전략으로 조회한 것 SQL이 같다는 것을 알 수 있다.

    (엔티티에서 지연로딩 전략으로 세팅을 해도 JPQL에서 페치조인으로 날리는 것이 우선순위)

     

    즉시로딩 전략은 묵시적인 방식이라서 원하지 않는 타이밍에도 항상 연관필드를 조인을 하고 결과를 반환한다. 물론 조인을 하고나서 데이터를 처리하는 것이 훨씬 효율적인 구성이 있을텐데 그때 바로 JPQL 페치조인을 사용하는 것이다. JPQL 페치조인은 명시적으로 동적인 타이밍에 원하는 객체그래프를 탐색할 수 있어 유용하다.

    반응형

    댓글

Designed by Tistory.