보통 연관관계를 lazy로 해두는데 이렇게 해두면
team에 접근할때마다 sql이 나가기 때문에 좋지 않다.
그렇다고 연관관계를 eager로 해버리면 굳이 team의 정보가 필요하지 않을때도 데이터를 가져오기때문에
lazy로 하되 필요한곳은 fetch 조인을 통해 데이터를 가져오는 것이 좋다,
fetch join의 예시이다.
@Query("select m from Member m left join fetch m.team")
List<Member> findMemberFetchJoin();
JPQL을 쓰기 싫고 JPA repository를 오버라이드 해서 쓰고 싶으면 아래와 같이 쓰면 된다.
@Override
@EntityGraph(attributePaths = {"team"})
List<Member> findAll();
기존 JPQL을 활용하여 fetch join만 추가하고 싶다면 아래와 같이 쓰면 된다.
@EntityGraph(attributePaths = {"team"})
@Query("select m from Member m")
List<Member> findMemberEntityGraph();
JPQL을 쓰기 싫고 메소드를 통해 쓰고 싶으면 아래와 같이 쓰면 된다.
@EntityGraph(attributePaths = ("team"))
List<Member> findEntityGraphByUsername(@Param("username") String username);
// @EntityGraph(attributePaths = ("team"))
// List<Member> findEntityGraphByUsername(String username);
@NamedEntityGraph로 하는 방법도 있다.
엔티티에 먼저 @NamedEntityGraph 어노테이션을 기입하고
@NamedEntityGraph(name="Member.all", attributeNodes = @NamedAttributeNode("team"))
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
private int age;
@EntityGraph에는 name값만 적어주면 된다.
@EntityGraph("Member.all")
List<Member> findEntityGraphByUsername(String username);