3.3.7. EntityGraph
엔티티 그래프는 엔티티매니저에게 전달하는 쿼리힌트입니다. 엔티티 그래프로 데이터 페치타입을 코드적으로 변경할 수 있습니다.
1. @NamedEntityGraph
엔티티 그래프 설정을 엔티티 클래스에 어노테이션으로 설정하는 방법을 먼저 살펴보겠습니다.
Emp.java
@NamedEntityGraphs
다수의 @NamedEntityGraph를 선언하기 위해서 사용합니다.
@NamedEntityGraph(name = "graph.Emp.dept")
엔티티매니저 또는 Querydsl을 통해 쿼리를 선언할 때 사용하는 엔티티 그래프 이름을 설정합니다.
@NamedEntityGraph(attributeNodes = @NamedAttributeNode(value = "dept"))
쿼리힌트 대상 필드변수를 지정합니다.
@ManyToOne(fetch=FetchType.LAZY)
N:1 연관관계에서 1에 해당하는 기본 페치정책은 EAGER입니다. 엔티티 그래프로 제어하기 위해서 기본 페치정책을 LAZY로 변경합니다. 필드변수 mgr, dept가 설정대상입니다.
EmpDaoEntityGraph.java
EntityGraph<?> graph = em.getEntityGraph("graph.Emp.dept")
엔티티 클래스에 설정한 @NamedEntityGraph(name = "graph.Emp.dept") 이름을 엔티티매니저에게 알려주고 엔티티 그래프 객체를 얻습니다. 이는 결국 대상 필드변수를 알려준 것입니다.
query = query.setHint("javax.persistence.fetchgraph", graph)
첫 번째 파라미터로 엔티티 그래프 페치전략을 가리키는 문자열을 설정합니다.
앞서 얻은 엔티티 그래프 객체를 두 번째 파라미터로 설정합니다.
Querydsl JPAQuery 객체에 엔티티 그래프 힌트를 설정하였습니다. 따라서 엔티티매니저는 엔티티 Emp의 데이터를 요청하는 쿼리 수행 시 dept 필드변수 정보를 얻기 위해 EAGER 로딩정책을 사용합니다.
엔티티 그래프 페치전략의 차이
2. Dynamic Enitity Graph
@NamedEntityGraph 어노테이션으로 엔티티 클래스에 엔티티 그래프를 설정해서 사용하지 않고 프로그램 코드에서 동적으로 엔티티 그래프를 생성해서 사용하는 방법입니다.
엔티티매니저를 통한 엔티티 그래프 사용법
Querydsl을 통한 엔티티 그래프 사용법
3. 테스트
EmpDaoEntityGraphTest.java
Emp 엔티티 클래스의 dpet 필드변수에 EAGER 로딩정책이 적용되었습니다. 따라서 dept 필드변수의 객체 그래프 탐색을 위하여 left outer join 쿼리가 사용되었습니다.
#3 testGetDeptUsingDynamicEntityGraph 테스트 메소드를 실행
사용쿼리
프로그램적으로 dept, mgr에 EAGER 페치 전략을 설정했기 때문에 관련된 데이터를 구하기 위한 join 쿼리가 수행되었습니다.
사용하지 않는 데이터를 매번 연속적으로 쿼리가 수행되게 나두는 것은 그리 현명한 판단이 아니므로 엔티티 클래스의 설정은 LAZY로 설정하고 엔티티 그래프를 사용하여 필요 시 EAGER 페치전략을 사용하는 방법을 살펴 보았습니다.
댓글 없음:
댓글 쓰기