Spring

[Spring Boot] @Transactional 어노테이션 속성

728x90

[JPA] 영속성 컨텍스트(Persistence Context)란? 편에서 자주 등장했던 단어 트랜잭션(Transaction)이 있습니다. Spring Boot 에서는 @Transactional 어노테이션을 통해 해당 메소드가 하나의 트랜잭션으로 묶여있다는걸 명시하는데요!

 

이 @Transactional 어노테이션에는 개발자가 커스텀할 수 있는 여러가지 옵션이 있습니다. 한번 살펴볼까요?

 

Propagation 옵션

이벤트 버블링과 캡쳐링 편에서도 등장했던 Propagation이라는 단어가 다시 등장했습니다. 바로 브랜드 E 스킬처럼 전파라는 의미를 가지고 있는데요. @Transactional을 쓸 때, 스프링은 트랜잭션의 시작과 중지를 propagation 세팅을 바탕으로 관리하는데요, 이 Propagation 옵션에는 여러가지가 있습니다

  • REQUIRED: default 옵션입니다. 만약 현재 활성화된 트랜잭션이 있다면 사용합니다. 없다면 새로 만듭니다.
  • SUPPORTS: 만약 활성화된 트랜잭션이 있다면 사용합니다. 없다면 트랜잭션 없이 로직을 수행합니다.
  • MANDATORY: 만약 활성화된 트랜잭션이 있다면 사용합니다. 없다면 예외를 발생시킵니다.
  • NEVER: 활성화된 트랜잭션이 있다면 예외를 발생시킵니다. 없다면 트랜잭션 없이 로직을 수행합니다.
  • NOT_SUPPORTED: 활성화된 트랜잭션이 있는경우 보류시킵니다. 없다면 트랜잭션 없이 로직을 수행합니다.
  • REQUIRES_NEW: 항상 새로운 트랜잭션을 시작합니다. 이미 진행중인 트랜잭션이 존재하면 해당 트랜잭션을 잠시 보류시킵니다
  • NESTED: 활성화된 트랜잭션이 있다면, 해당 트랜잭션의 세이브 포인트를 기록하고, 해당 트랜잭션 내에서 중첩 트랜잭션을 만듭니다. 만약 비즈니스 로직에서 예외가 발생하면 세이브 포인트로 롤백합니다. 활성화된 트랜잭션이 없다면 새로 만듭니다.

Isolation 옵션

isolation은 동시에 여러 트랜잭션에 의한 변경 사항이 어떻게 적용되는지를 설정합니다

  • DEFAULT: default 옵션입니다. RDBMS가 지정한 값으로 설정됩니다. 따라서 DB마다 다릅니다
  • READ_UNCOMMITTED: 커밋되지 않은(트랜잭션 처리중인) 데이터에 대한 읽기를 허용합니다. 부작용이 많아서 특정 DB에서는 허용하지 않습니다.
  • READ_COMMITTED: 트랜잭션에서 커밋된 데이터만 읽을 수 있습니다. 변경사항이 반영되지 않은 데이터를 읽을일은 없지만, 데이터가 변경중인 경우 접근할 수 없습니다. (Oracle 기본)
  • REPEATABLE_READ: 트랜잭션이 완료될 때까지 SELECT문이 사용하는 모든 데이터에 shared lock을 겁니다. 그렇기 때문에 select 쿼리를 여러 번 같은 트랜잭션 내에서 사용하더라도 같은 값을 조회하게 되고, 해당 값들에 대한 변경이나 삭제가 불가해집니다. (MySQL 기본)
  • SERIALIZABLE: 동시 호출을 순차적으로 실행하기 때문에, 동시 엑세스 속도가 가장 낮을 수 있습니다.
  • MVCC: 다중 버전 동시성 제어 (Multi-Version Concurrency Control)의 줄임말로 데이터베이스의 스냅샷을 여러 트랜잭션이 읽게 되고 이를 바탕으로 commit된 데이터들을 비교해 마지막 버전의 데이터를 만들게 됩니다.

readOnly 옵션

default는 false지만 readOnly = true로 설정하게 되면, 스프링은 해당 트랜잭션의 FlushMode를 NEVER로 설정한다. 이 경우 flush가 일어나지 않으므로 비용이 절감되며, 또한 생성/수정/삭제가 일어나지 않으므로 별도의 스냅샷을 만들 필요가 없어 성능상 이점이 생깁니다.

 

rollbackFor 옵션

옵션에서 명시한 예외 발생시 롤백을 수행합니다.

 

timeout 옵션

지정한 시간 내에 해당 트랜잭션의 수행이 완료되지 않은 경우, 롤백을 수행하게 됩니다. 값은 정수형으로 설정하게 되는데, 만약 -1로 설정할 경우 timeout 설정을 해제합니다. default는 -1입니다.

 

출처:
- @Transactional 어노테이션의 다양한 옵션 활용
728x90