members = memberRepository.findAll(); // Then for (Member member : members) { System.out.println("member = " + member.getUsername()); System.out.println("member's team = " + member.getTeam().getName()); } }"> members = memberRepository.findAll(); // Then for (Member member : members) { System.out.println("member = " + member.getUsername()); System.out.println("member's team = " + member.getTeam().getName()); } }"> members = memberRepository.findAll(); // Then for (Member member : members) { System.out.println("member = " + member.getUsername()); System.out.println("member's team = " + member.getTeam().getName()); } }">
@Test
public void findMemberLazy() {
	// Given
	Team teamA = new Team("teamA");
	Team teamB = new Team("teamB");

	teamRepository.save(teamA);
	teamRepository.save(teamB);
	memberRepository.save(new Member("member1", 10, teamA));
	memberRepository.save(new Member("member2", 20, teamB));

	em.flush();
	em.clear();

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

	// Then
	for (Member member : members) {
		System.out.println("member = " + member.getUsername());
		System.out.println("member's team = " + member.getTeam().getName());
	}
}

fetch 조인으로 해결이 가능하다.

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

그렇다면 항상 @Query를 써야 쓸 수 있나? 아니다. @EntityGraph를 사용하면 된다.

@Override
@EntityGraph(attributePaths = {"team"})
List<Member> findAll();

<aside> 💡 기본적으로 left join이 되는데? 바꿀 수 있나?

</aside>

@Override
@EntityGraph(attributePaths = {"team"})
List<Member> findAll();

@EntityGraph(attributePaths = {"team"})
@Query("select m from Member m")
List<Member> findMemberEntityGraph();

@EntityGraph(attributePaths = {"team"})
List<Member> findByUsername(@Param("username") String username);