spring-data-jpa @EntityGraph, @QueryHints, @Lock
spring-data-jpa 에서 제공하는 몇 가지 기능
- 이번 블로그에서는 몇 가지 기능을 가볍게 정리한다.
@EntityGraph
- 지연로딩을 join을 통해 xToOne 객체를 불러올 때 유용하게 사용하는 fetch join을 스프링데이터jpa 역시 지원한다.
// 엔티티매니저를 사용한 기존의 fetch join 형태이다.
public List<Member> findMemberFetchJoin(){
final String query = " " +
"select m " +
"from Member m " +
"join fetch m.team t ";
return em.createQuery(query, Member.class).getResultList();
}
@Override // 기존에 정의된 메서드에 대해서도 사용 가능하다.
@EntityGraph(attributePaths = {"team"}) // fetch join을 하고 싶은 객체를 선택한다.
List<Member> findAll();
@EntityGraph(attributePaths = {"team"})
// @Query("select m from Member m ") // jpql을 직접 짜서 사용할 수도 있다.
List<Member> findEntityGraphMemberByUsername(String username); // 사용자 메서드에도 가능하다.
@Hint
- sql hint 와 관계 없다.
- Hint는 보통 readonly를 사용하기 위해 사용한다.
- 영속 객체는 메모리를 두 배로 사용한다. 하나는 리턴 값, 하나는 원본 값이다. 두 개를 비교하여 차이를 찾는 과정을 더티체킹이라 하며, 이 과정을 통해 update의 여부를 판단할 수 있기 때문이다.
- jpa hint 기능은 readonly를 강제하여 더티체킹을 막고 메모리를 아낄 수 있다.
- 다만 대체로 잘 사용하지 않는다. 이러한 문제로 성능 상 문제가 생기면 다른 방향으로 해결하는 것이 더 좋고 빠르다.
@QueryHints(value = @QueryHint(name ="org.hibernate.readOnly", value="true"))
Member findReadOnlyMemberByUsername(String username);
@Lock
select .... for update;
쿼리를 날린다.
@Lock(LockModeType.PESSIMISTIC_WRITE)
List<Member> findLockByUsername(String username);