스프링 프레임워크에서 어노테이션으로 트랜잭션을 읽기전용 모드로 설정할 수 있다.
@Transaction(readOnly=true)
예상치 못한 엔티티의 등록,변경,삭제를 예방할 수 있고, 성능을 최적화할 수 있다.
readOnly = true를 설정하게 되면 스프링 프레임워크는 JPA의 세션 플러시 모드를 MANUAL로 설정한다.
MANUAL모드에서는 강제로 플러시를 호출하지 않는 한 플러시가 일어나지 않는다.
트랜잭션 Commit 시 영속성 컨텍스트가 자동으로 flush 되지 않으므로 조회용으로 가져온 Entity의 예상치 못한 수정을 방지할 수 있다.
트랜잭션을 커밋하더라도 영속성 컨텍스트가 플러시 되지 않아서 엔티티의 등록, 수정, 삭제가 동작하지 않고, 또한 읽기 전용으로,
영속성 컨텍스트는 변경감지를 위한 스냡샷을 보관하지 않으므로 성능이 향상된다.
@Transaction(readOnly=true)을 서비스의 각 조회 메소드앞에 붙이는 것이 좋다.
조회의 경우 @Transaction을 아예 뺴면 되지 않냐고 생각할 수 있지만
OSIV가 꺼져있을 경우(해당트랜잭션이 끝나면 준영속화) @Transaction이 안붙어있을경우 영속성관련 에러가 발생한다.
그러므로 @Transaction(readOnly=true)를 명시적으로 사용해주는 것이 좋다.
'I leaned > 스프링,스프링부트' 카테고리의 다른 글
도커 명령어 (0) | 2023.09.15 |
---|---|
Spring RestDoc 적용법 (0) | 2023.07.27 |
AOP(관점지향프로그래밍) (0) | 2023.07.25 |
컨트롤러 단위 테스트 (0) | 2023.07.17 |
리포지토리 단위 테스트 (0) | 2023.07.17 |