2024. 10. 20. 19:27ㆍSpring Boot/Spring Data JPA
JPA 2.1 사양은 Fetch- 및 LoadGraphs를 설정하는 기능을 도입했으며, Spring Data JPA에서도 이를 지원합니다. 이 기능은 @EntityGraph
애노테이션을 통해 사용할 수 있으며, 이를 통해 엔티티의 페치 계획을 구성할 수 있습니다. 이 애노테이션은 @NamedEntityGraph
정의를 참조할 수 있습니다. 이 설명에서는 @EntityGraph
를 활용하여 엔티티 그래프를 정의하고 사용하는 방법을 자세히 설명하겠습니다.
1. Named Entity Graph 정의
Named Entity Graph는 특정 엔티티에 대해 미리 정의된 페치 계획입니다. 이를 통해 엔티티와 관련된 속성을 로드하는 방식을 제어할 수 있습니다. 기본적으로 JPA는 연관된 엔티티를 지연 로드(Lazy Loading)하는데, 이 경우 필요한 시점에만 데이터를 가져옵니다. 하지만 Named Entity Graph를 사용하면 필요한 연관 엔티티를 미리 로드할 수 있습니다.
엔티티에 Named Entity Graph 정의하기
@Entity
@NamedEntityGraph(name = "GroupInfo.detail",
attributeNodes = @NamedAttributeNode("members"))
public class GroupInfo {
// 기본 페치 모드는 지연 로드입니다.
@ManyToMany
List<GroupMember> members = new ArrayList<GroupMember>();
…
}
위 코드에서는 GroupInfo
라는 엔티티에 대해 GroupInfo.detail
이라는 이름의 Named Entity Graph를 정의하고 있습니다. 이 그래프는 members
속성을 포함하고 있어, GroupInfo
를 로드할 때 members
를 함께 가져옵니다.
2. Repository에서 Named Entity Graph 참조하기
정의한 Named Entity Graph는 리포지토리의 쿼리 메서드에서 사용할 수 있습니다. @EntityGraph
애노테이션을 사용하여 지정한 엔티티 그래프를 참조할 수 있습니다.
예제 31: 리포지토리 쿼리 메서드에서 Named Entity Graph 참조하기
public interface GroupRepository extends CrudRepository<GroupInfo, String> {
@EntityGraph(value = "GroupInfo.detail", type = EntityGraphType.LOAD)
GroupInfo getByGroupName(String name);
}
위 코드에서는 GroupRepository
인터페이스에 getByGroupName
메서드가 있으며, 이 메서드는 GroupInfo.detail
이라는 Named Entity Graph를 사용하여 GroupInfo
를 로드합니다. type
속성은 페치 방식(Fetch 또는 Load)을 지정할 수 있으며, 여기서는 EntityGraphType.LOAD
로 설정되어 있습니다.
3. Ad-Hoc Entity Graph 정의하기
Ad-hoc Entity Graph를 사용하면 @EntityGraph
애노테이션을 통해 일회성으로 정의된 엔티티 그래프를 사용할 수 있습니다. 이 경우, 별도로 @NamedEntityGraph
를 정의할 필요 없이 메서드에서 직접 속성 경로(attribute paths)를 제공하면 됩니다.
예제 32: 리포지토리 쿼리 메서드에서 Ad-Hoc Entity Graph 정의하기
public interface GroupRepository extends CrudRepository<GroupInfo, String> {
@EntityGraph(attributePaths = { "members" })
GroupInfo getByGroupName(String name);
}
위 코드에서는 GroupInfo
를 로드할 때 members
속성을 함께 가져오도록 지정했습니다. 이 방법은 간단하게 엔티티 그래프를 정의할 수 있는 장점이 있습니다.
결론
- Named Entity Graph는 미리 정의된 페치 계획을 통해 관련 엔티티를 효율적으로 로드할 수 있게 해줍니다.
- Ad-hoc Entity Graph는 리포지토리 메서드에서 직접 속성 경로를 통해 정의할 수 있어 유연성을 제공합니다.
- 이 기능을 통해 쿼리 성능을 개선하고, 필요한 데이터를 더욱 효과적으로 로드할 수 있습니다.
JPA의 @EntityGraph
기능을 활용하면 연관된 엔티티를 적절한 시점에 효과적으로 로드할 수 있어, 성능 최적화에 크게 기여할 수 있습니다.
'Spring Boot > Spring Data JPA' 카테고리의 다른 글
Projections (0) | 2024.10.22 |
---|---|
Scrolling (0) | 2024.10.20 |
Applying Query Hints (0) | 2024.10.20 |
Other Methods, Modifying Queries (0) | 2024.10.20 |
Using Sort, Scrolling Large Query Results (0) | 2024.10.20 |