@EntityGraph란?
- JPA의 Entity Graph 기능을 Spring Data JPA에 적용한 어노테이션
- 지연 로딩(LAZY) 필드들을 명시적으로 fetch join 하도록 설정할 수 있다.
- JPQL의 join fetch 없이 리포지토리 메서드 수준에서 연관 엔티티를 즉시 로딩할 수 있도록 도와준다.
기본 사용법
- attributePaths: 즉시 로딩하고 싶은 연관 엔티티 경로
- 내부적으로 JPQL의 join fetch와 유사한 SQL이 실행됨
public interface MemberRepository extends JpaRepository<Member, Long> {
@EntityGraph(attributePaths = {"team"})
List<Member> findAll(); // findAll 호출 시 team도 함께 조회됨
}
예제
엔티티
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
private Team team;
}
일반적인 Repository 조회 (N + 1 문제 발생)
- 메서드 호출 시 Member는 조회되지만, Team 정보 접근 시점에 추가 쿼리가 발생함 (N+1)
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findAll();
}
JPQL 에서 fetch join 사용 예
- join fetch를 사용하면 Member와 Team을 한 번의 쿼리로 조회
- 단점: JPQL 문자열을 직접 작성해야 하므로 유지보수가 불편할 수 있음
@Query("select m from Member m join fetch m.team")
List<Member> findAllWithTeam();
@EntityGraph로 대체
- 동일한 효과의 쿼리를 JPQL 없이도 적용 가능
- 메서드 명 기반 쿼리 작성 시에도 연관 엔티티를 즉시 로딩(fetch join) 가능
@EntityGraph(attributePaths = {"team"})
List<Member> findAll();
'Spring > 문법' 카테고리의 다른 글
AOP (Aspect-Oriented Programming) (0) | 2025.06.11 |
---|---|
테스트 커버리지 - JaCoCo 설정 (3) | 2025.06.11 |
테스트 코드 개념 2 + Mock 을 이용한 테스트 코드 작성 예제 (0) | 2025.06.11 |
테스트 코드 개념 (0) | 2025.06.11 |
JSON 포맷 변경하기: Jackson 설정 커스터마이징 (1) | 2025.05.23 |