728x90
@EntityGraph
간단히 말하면 연관된 엔티티들을 SQL 한번에 조회하는 방법이다.
즉, 페치(fetch) 조인을 어노테이션으로 사용할 수 있다.
먼저 페치 조인 예제를 알아보자.
페치 조인 개념은 이전 글을 참고하자.
참고: https://un-lazy-midnight.tistory.com/114
페치 조인 예제 코드
- member -> team은 지연로딩 관계이다.
- 다음과 같이 team의 데이터를 조회할 때 마다 N+1 문제가 발생한다.
- 그러므로 페치 조인이 필요하다.
@Query("select m from Member m left join fetch m.team")
List<Member> findMemberFetchJoin();
@Test
public void findMemberLazy(){
//given
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);
em.flush();
em.clear();
//when
List<Member> members = memberRepository.findMemberFetchJoin();
//then
for (Member member : members) {
System.out.println("member = " + member.getUsername());
System.out.println("team = " + member.getTeam().getName());;
}
}
@EntityGraph
스프링 데이터 JPA가 제공하는 엔티티 그래프 기능은 JPQL없이 페치 조인을 사용할 수 있다.
예제에서는 findAll을 @Override 하여 사용한다.
@Override
@EntityGraph(attributePaths = {"team"})
List<Member> findAll();
@Test
public void findMemberLazy(){
//given
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);
em.flush();
em.clear();
//when
List<Member> members = memberRepository.findAll();
//then
for (Member member : members) {
System.out.println("member = " + member.getUsername());
System.out.println("team = " + member.getTeam().getName());;
}
}
//JPQL + 엔티티 그래프 섞어서 사용 가능하다
@EntityGraph(attributePaths = {"team"})
@Query("select m from Member m")
List<Member> findMemberEntityGraph();
//메서드 이름을 사용, 쿼리를 작성할 필요 없어 편하다.
@EntityGraph(attributePaths = {"team"})
List<Member> findEntityGraphByUsername(@Param("username") 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();
참고: 지연 로딩?
https://un-lazy-midnight.tistory.com/100
728x90
'💻dev > 🌱Java+Spring' 카테고리의 다른 글
Spring Data JPA | 사용자 정의 리포지토리 구현 (0) | 2023.05.09 |
---|---|
Spring Data JPA | JPA 힌트 @QueryHint 와 Lock (1) | 2023.05.09 |
Spring Data JPA | 벌크성 수정 쿼리 (순수 JPA와 스프링 데이터 JPA 비교) (0) | 2023.05.09 |
Spring Data JPA | 순수 JPA와 스프링 데이터 JPA의 페이징과 정렬 비교하기 (0) | 2023.05.09 |
Spring Data JPA | 파라미터 바인딩과 반환 타입 (0) | 2023.05.09 |