쿼리메소드 - @EntityGraph

박찬우·2024년 1월 11일

스프링 데이터 JPA

목록 보기
8/18

N+1 문제

Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
teamRepository.save(teamA);
teamRepository.save(teamB);

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

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

// Member만 조회
// 1번 조회
List<Member> members = memberRepository.findAll();

// 지연로딩으로 Team 조회
// teamA, teamB 총 2번 조회
// N+1 발생
for (Member member : members) {
	System.out.println(member.getTeam().getName());
}

JPQL 패치 조인

@Query("select m from Member m join fetch m.team")
public List<Member> findMemberFetchJoin();
// Member 조회하면서 Team까지 같이 가져옴
// 쿼리 1번
List<Member> members2 = memberRepository.findMemberFetchJoin();

for (Member member : members2) {
	System.out.println(member.getTeam().getName());
}

@EntityGraph

  • 사실상 페치 조인(FETCH JOIN)의 간편 버전
  • LEFT OUTER JOIN 사용
//공통 메서드 오버라이드 
@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)

NamedEntityGraph

@NamedEntityGraph(name = "Member.all", attributeNodes = @NamedAttributeNode("team")) 
@Entity public class Member {}
@EntityGraph("Member.all") 
@Query("select m from Member m") 
List<Member> findMemberEntityGraph();
profile
진짜 개발자가 되어보자

0개의 댓글