[JPA] .setHint(QueryHints.READ_ONLY, true)

개요

  • JPA 에서 쿼리를 최적화하는 방법 중 하나는 읽기 전용 쿼리를 사용하는 것이다.
  • 데이터를 변경하지 않는 조회 작업에서 성능의 향상이 가능하다.

방법

  • 서비스 트랜잭션 안에서 전역적으로 설정
    • @Transactional(readOnly = true)
      • 메서드, 클래스 레벨안에서 모든 DB 작업이 읽기 전용으로 변경됨.
      • JPA 하이버네이트 프로바이더가 내부적으로 DB 에 대한 변경 사항을 추적하지 않도록 성능 최적화 수행
  • 쿼리자체에서 설정
    • .setHint(QueryHints.READ_ONLY, true)
    List<OrderEntity> orders = qf.selectFrom(orderEntity)
        .where(...)
        .setHint(QueryHints.READ_ONLY, true)
        .fetch();
    • 해당 쿼리가 데이터를 변경하지 않고 오직 읽기만 수행할 것임을 JPA 프로바이더에게 알려준다.

착안

  • Spring Data Jpa 도 조회쿼리 자체를 읽기전용으로 들고오진 않는다.
    • 앞으로 Data Jpa 같은 경우도 읽기전용 쿼리로 만들어야겠다.
  • 서비스 레벨에서의 트랜잭션이 읽기전용이 아니더라도 조회 쿼리자체에 읽기 전용으로 설정한다면 조금이라도 성능의 이점을 가져올 수 있지 않을까?

뒤늦게 생각된 문제점

  • 쿼리힌트가 조회로 설정된 경우, 쿼리힌트가 조회인지 아닌지 여부를 고려해서 개발을 해야하는 불필요한 행동이 필요할 것 같다.
  • 그냥 쿼리힌트를 다는것말고, 서비스단에서 트랜잭션으로 관리하는게 나을 것 같기도하다..
  • 읽기전용이 아닌 경우에 대량의 조회가 필요한 경우에만 별도의 메서드를 만드는게 어떨까도 싶다.


Uploaded by N2T