개요

N + 1 문제

@Test
void findMemberLazy() {
		//given
    //member1 -> teamA
    //member2 -> teamB
    Team teamA = new Team("teamA");
    Team teamB = new Team("teamB");

    teamRepository.save(teamA);
    teamRepository.save(teamB);

    Member member1 = new Member("member1", 10, teamA);
    Member member2 = new Member("member2", 10, teamB);

    memberRepository.save(member1);
    memberRepository.save(member2);

    entityManager.flush();
    entityManager.clear();

    //when
    //select Member
    List<Member> members = memberRepository.findAll();

    for (Member member : members) {
        System.out.println("member = " + member);
        System.out.println("team class = " + member.getTeam().getClass()); //proxy
        System.out.println("team name = " + member.getTeam().getName()); //select Team
    }
}

JPQL 페치 조인

@Query("select m from Member m left join fetch m.team")
List<Member> findMemberFetchJoin();

EntityGraph

// 공통 메서드 오버라이드
@Override
@EntityGraph(attributePaths = {"team"})
List<Member> findAll();

// JPQL + 엔티티 그래프
@EntityGraph(attributePaths = {"team"})
@Query("select m from Member m")
List<Member> findMemberEntityGraph();

// 메서드 이름으로 쿼리에서 특히 편리하다.
@EntityGraph(attributePaths = {"team"})
List<Member> findByUsername(String username)