Fetch Join

정재현·2022년 12월 20일
0

fetch Join?

  • SQL 조인 종류 아님
  • JPQL에서 성능 최적화를 위한 기능
  • N+1 문제 해결

FetchType EAGER LAZY

EAGER : 해당 엔터티 조회 시 연관된 엔터티의 데이터를 같이 가져온다. 즉시 로딩
LAZY : 해당 엔터티 조회 후 연관 엔터티 접근 시 데이터 가져온다. 지연 로딩

List<Member> findMember = em.createQuery("select m from Member m", Member.class)
                .getResultList();

        for (Member member : findMember) {
            System.out.println("member name : "+member.getName()+" member.getTeam "+member.getTeam().getName());
}

EAGER

Hibernate: 
    select
        member0_.member_id as member_i1_4_,
        member0_.city as city2_4_,
        member0_.name as name3_4_,
        member0_.team_id as team_id4_4_ 
    from
        member member0_
Hibernate: 
    select
        team0_.team_id as team_id1_7_0_,
        team0_.name as name2_7_0_ 
    from
        team team0_ 
    where
        team0_.team_id=?
Hibernate: 
    select
        team0_.team_id as team_id1_7_0_,
        team0_.name as name2_7_0_ 
    from
        team team0_ 
    where
        team0_.team_id=?
member name : member1 member.getTeam team1
member name : member2 member.getTeam team2
member name : member3 member.getTeam team1

LAZY

Hibernate: 
    select
        member0_.member_id as member_i1_4_,
        member0_.city as city2_4_,
        member0_.name as name3_4_,
        member0_.team_id as team_id4_4_ 
    from
        member member0_
Hibernate: 
    select
        team0_.team_id as team_id1_7_0_,
        team0_.name as name2_7_0_ 
    from
        team team0_ 
    where
        team0_.team_id=?
member name : member1 member.getTeam team1
Hibernate: 
    select
        team0_.team_id as team_id1_7_0_,
        team0_.name as name2_7_0_ 
    from
        team team0_ 
    where
        team0_.team_id=?
member name : member2 member.getTeam team2
member name : member3 member.getTeam team1

N+1 문제

쿼리는 하나 실행했는데 연관관계로 인해 여러 개의 쿼리가 실행
성능 저하

  1. fetch join 사용
        List<Member> findMember = em.createQuery("select m from Member m join fetch m.team", Member.class)
                .getResultList();

        for (Member member : findMember) {
            System.out.println("member name : "+member.getName()+" member.getTeam "+member.getTeam().getName());
        }

결과
하나의 쿼리만 실행된다

Hibernate: 
    select
        member0_.member_id as member_i1_4_0_,
        team1_.team_id as team_id1_7_1_,
        member0_.city as city2_4_0_,
        member0_.name as name3_4_0_,
        member0_.team_id as team_id4_4_0_,
        team1_.name as name2_7_1_ 
    from
        member member0_ 
    inner join
        team team1_ 
            on member0_.team_id=team1_.team_id
member name : member1 member.getTeam team1
member name : member2 member.getTeam team2
member name : member3 member.getTeam team1
profile
back end개발자로 성장하기

0개의 댓글