본문 바로가기
TIL/Spring

JPA::@Transactional(readOnly = true)

by DandyU 2023. 4. 12.

Spring Framework에서 JPA 사용 시 @Transactional(readOnly = true) 애노테이션을 사용하면 트랜잭션을 읽기 전용 모드로 동작시킬 수 있고, 성능 향상을 볼 수 있다.

 

JPA는 기본적으로 엔터티를 영속성 컨텍스트에 관리하게 되고, 영속성 컨텍스트는 변경 감지를 위해 스냅샷 인스턴스를 보관하여 메모리를 사용하게 된다.


엔터티를 조회만 하는 경우 변경 감지와 메모리 사용은 불필요하므로 @Transactional(readOnly = true) 애노테이션을 사용하면 트랜잭션이 읽기 전용 모드로 설정되어 변경 감지할 엔터티를 줄이고 메모리 사용을 줄일 수 있다.

 

@Transactional(readOnly = true) 애노테이션을 사용하면 Spring Data JPA는 Hibernate의 Session Flush 모드를 MANUAL로 설정하여, 트랜잭션이 커밋될 때 엔터티의 등록, 수정, 삭제가 되지 않는다.

개발자가 수동으로 Flush 해야만 영속성 컨텐스트의 내용이 DB에 반영되게 되고, 영속성 컨텍스트의 변경 감지와 스냅샷 인스턴스를 보관하지 않으므로 성능 향상을 볼 수 있다.

댓글