개요
- 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
'자바 > JPA' 카테고리의 다른 글
[JPA] em.persist 와 [repository.save](http://repository.save) 분석 (0) | 2024.02.24 |
---|---|
Jpa CascadeType 각 모드의 역할과 예시 코드 (0) | 2024.02.21 |
[Qdsl, JPA] @PersistenceContext 의 역할 (0) | 2024.02.21 |
Jpa 에서 `@mappedBy` ? (0) | 2024.02.19 |
[JPA] 락 사용방법 및 종류 (0) | 2023.11.21 |