본문 바로가기
공부/Spring

[Java] @Transaction(readOnly=true)을 사용하면 성능이 향상되는 이유

by JERO__ 2022. 5. 7.

결론

  • 엔티티를 읽기 전용으로 조회하면, 변경감지를 위한 스냅샷을 유지하지 않아도 되고, 영속성 컨텍스트를 플러시하지 않아도 돼 성능을 최적화 할 수 있다.

사용방법

  • 트랜잭션을 읽기 전용 모드로 설정할 수 있다
@Transaction(readOnly=true)

성능 향상 이유

1. 스칼라 타입(단일데이터)으로 조회 (엔티티로 조회하지 않음)

  • 영속성 컨텍스트가 결과를 관리하지 않는다.
  • 엔티티로 조회한다면?
    • 영속성 컨텍스트에 관리됨
    • 영속성 컨텍스트 : 엔티티를 영구 저장하는 환경. 어플리케이션과 DB 사이에서 객체를 보관하는 가상의 DB역할.
    • 영속성 컨텍스트는 변경 감지를 위해서 스냅샷 인스턴스를 보관한다. (많은 메모리 사용)

2. 읽기 전용 쿼리 힌트 사용

  • org.hibernate.readOnly 사용
    • 읽기전용이므로, 스냅샷을 보관하지 않는다 → 메모리 최적화

3. 플러시가 발생하지 않는다.

  • 플러시(Flush) : 영속성 컨텍스트의 변경내용 → DB에 반영 (영속성 컨텍스트의 변경사항을 DB상태와 맞추는 작업)
  • 플러시모드가 MANUAL로 설정된다. 따라서, 등록, 수정, 삭제가 동작하지 않는다.

댓글