Configuring Fetch- and LoadGraphs

2024. 10. 20. 19:27Spring 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