오늘은 코드리뷰를 받다가 조회용 서비스단에 @Transactional(readOnly = true)를 붙일 때 성능이 향상된다 하여 공부를 해보려고 한다.
엔티티를 조회할 때 영속성 컨텍스트(Persistence Context)는 초기 상태에 대한 스냅샷을 저장하여 트랜잭션 commit 될 때마다 스냅샷과 엔티티의 상태를 비교하여 update query를 생성하여 쓰기 지연 저장소에 저장한다 = dirty checking = 변경 감지
더티란, 상태의 변화가 생긴 정도..를 의미!
1. readOnly = true로 설정하면 플러시 모드가 MANUAL로 설정되고, 트랜잭션 내에서 flush()를 호출하지 않는 한 수정내역이 DB에 자동저장되지 않는다. 자동 flush가 방지되기 때문에 조회용으로 가져온 엔티티의 의도치 않은 수정을 사전에 방지할 수 있다.
2. 또한, readOnly=true 설정으로 바로 조회용이라는 것을 인식하게 되어 CUD작업이 동작하지 않고 더티체킹을 위한 스냅샷을 보관하지 않기 때문에 메모리가 절약되어 성능이 향상되는 것이다.
3. DB를 복제하여 master-slave 구조의 이중화구조를 사용하는 경우에 readOnly = true로 되어있다면 읽기 전용으로 master가 아니라 slave를 호출하여 트래픽을 분산하여 DB서버의 부하를 줄이고 최적화를 할 수 있다. (Replication)
4. @Transactional(readOnly = true) 어노테이션에 대해 직관적으로 read만 동작함을 알 수 있고, 실제로도 read만 동작하기에 신뢰성을 보장한다고 받아들여진다.
11.25.
오늘 배운 것 중 하나..
- 단일쿼리에 대해서는 @Transactional 어노테이션 붙여줄 필요 없다. (난 서비스 전체에 어노테이션을 걸지만, 복잡한 쿼리를 수행하는 함수에 대해서만 어노테이션을 적용하면 될 듯도 하다.)
https://www.baeldung.com/spring-transactions-read-only
'BackEnd > JPA' 카테고리의 다른 글
[Spring Data JPA] 테스트 코드와 비즈니스 로직 (0) | 2024.03.05 |
---|---|
[Spring Data JPA] 회원가입 기능 및 회원 조회 + 의존성 주입 (0) | 2024.03.03 |
[Spring Data JPA] 연관관계 매핑 & 테이블 설계 (0) | 2024.03.01 |
[JPA] 인텔리제이 jpa 사용시 테이블이 drop 되지 않는 오류 (0) | 2023.12.22 |