스프링 프레임워크에서 어노테이션을 통해 트랜잭션을 읽기 전용 모드로 설정할 수 있다.
이는 예상치 못한 엔티티의 등록, 변경, 삭제를 예방할 수 있고 성능을 최적화할 수 있다.
🧐 성능이 왜 최적화되지?
JPA, Hibernate, Spring Data JPA에 대한 이런저런.. 정리
해당 글을 읽기 전에 위의 글부터 읽는 것이 도움이 될 것 같다
🌱 JPA의 Persistence Context
JPA는 엔티티를 영속성 컨텍스트에서 관리한다.
영속성 컨텍스트의 변경 내용은 보통 트랜잭션이 커밋될 때 DB에 자동으로 반영된다.
엔티티가 영속성 컨텍스트에 관리될 경우 1차 캐시와 변경 감지 등 얻을 수 있는 혜택이 많다.
하지만 영속성 컨텍스트는 변경 감지(Dirty Checking)를 위해 스냅샷 인스턴스를 보관하기 때문에 더 많은 메모리는 사용해야 하는 단점이 있다.
이 때 Transaction에 readOnly = true 옵션을 주면 스프링 프레임워크가 Hibernate의 세션 flush 모드를 MANUAL로 설정한다.
flush가 MANUAL로 설정될 경우 강제로 flush를 호출하지 않는 한 flush가 일어나지 않는다.
🦠 flush가 뭐지?
JPA에서 영속성 컨텍스트의 변경 내용을 DB에 동기화하는 작업을 수행하는 메서드이다.
flush 메서드 호출 시 영속성 컨텍스트에 쌓여있는 변경된 엔티티를 DB에 적용한다.
따라서 트랜잭션을 commit 하더라도 영속성 컨텍스트가 flush 되지 않아 엔티티의 등록, 수정, 삭제가 동작하지 않는다.
또한 읽기 전용이기 때문에 변경 감지를 위한 스냅샷을 보관하지 않아 성능이 향상되는 이점이 있다.
https://joyykim.tistory.com/25
https://cheese10yun.github.io/jpa-flush/
https://willseungh0.tistory.com/75
'Back-end' 카테고리의 다른 글
[JPA] OSIV(Open Session In View)란? (0) | 2023.09.21 |
---|---|
[JPA] Hibernate Cache란? (0) | 2023.09.03 |
[JPA] JPA, Hibernate, Spring Data JPA에 대한 이런저런.. 정리 (0) | 2023.08.29 |
[CI/CD] GitHub Actions를 이용한 빌드 및 배포 자동화 (0) | 2023.08.10 |
[Java] 가비지 컬렉션(Garbage Collection: GC) (0) | 2023.06.04 |