≣ 목차
스프링의 AOP 를 통해 @Transactional 어노테이션을 사용해서 트랜잭션을 걸 수 있다.
조회용 메서드에 @Transactional(readOnly = true) 속성을 설정하면 성능상 이점을 얻을 수 있다.
+ Lazy Loading, Replication 과 같이 트랜잭션 범위 내에서 수행해야 되는 동작이 있는 경우에 적절하게 활용하는 것이 좋으며, 무분별하게 사용할 경우 Snapshot 유지, Flush 의 필요 등 관리적/메모리적 측면에서 좋지 않을 수 있고, 커넥션을 오래 가지고 있어서 커넥션 부족 등의 문제가 발생할 수 있음을 유의한다.
readOnly = true
JPA - Session Flush Mode Setting
스프링 프레임워크가 JPA 의 세션 플러시 모드를 'MANUAL' 로 설정한다.
MANUAL 모드는 트랜잭션 내에서 사용자가 수동으로 flush 를 호출하지 않으면 flush 가 자동으로 수행되지 않는 모드이다.
-> 강제로 flush() 를 호출하지 않으면, 수정 내역에 대해 DB 에 적용되지 않는다.
트랜잭션 commit 시 영속성 컨텍스트가 자동으로 flush 되지 않으므로, 조회용으로 가져온 entity 의 예상치 못한 수정을 방지할 수 있고, JPA 가 변경 감지를 위한 Snapshot 을 별도로 보관하지 않기 때문에 메모리가 절약되는 성능적 이점을 얻을 수 있다.
가독성
직관적으로 해당 메서드가 조회용 메서드임을 파악할 수 있다.
Replication 부하 분산
Replication: 데이터베이스의 장애를 빠르게 복구하고, 트래픽을 분산시키기 위해 실시간 복제본 데이터베이스를 운용하는 방식
Master-Slave 구조로 설계되어 있고, 복제본 DB 를 운용한다.
readOnly = true 로 설정되어 있는 경우 Slave DB 에서 데이터를 가져오도록 동작해서 트래픽 분산을 적용할 수 있다.
조회용 메서드에 @Transactional 을 사용해야 하는 이유
OSIV(Open Session In View): 영속성 컨텍스트를 View Layer 까지 유지하는 속성이다.
-> 클라이언트의 요청 시점부터 영속성 컨텍스트를 생성하여 Filter / Interceptor - Controller 에서 부터 영속성 컨텍스트가 생성되어 View Layer 에서도 Entity 의 Lazy Loading 이 가능하다.
별도의 설정을 하지 않으면 OSIV 가 true 로 설정되어 있다. true 인 상태에서 Lazy Loading 을 수행하는 코드의 동작은 Exception 없이 정상적으로 동작한다.
false 로 설정한다면 영속성 컨텍스트는 트랜잭션 범위를 벗어나는 순간 Entity 가 준영속 상태(Lazy Loading 동작 불가 상태)가 되어 버린다. -> @Transactional 어노테이션이 없는 경우 LazyInitializationException 발생
'Back-End > Spring Boot' 카테고리의 다른 글
Spring Event Publisher/Listener (0) | 2024.08.09 |
---|---|
트랜잭션 전파 (0) | 2024.07.26 |
Spring Controller header 값 가져오기 (0) | 2024.07.10 |
데이터베이스 decimal 타입 JPA 에서 표현하기 (0) | 2024.07.09 |
@UniqueConstraint 와 @Colume 의 unique 속성 차이 (0) | 2024.07.09 |
댓글