본문 바로가기
IT/Java

@Transactional annotation

by 성준하이 2023. 7. 10.
반응형

spring에서 사용하는 annotation 중 하나인 이 Transactional annotation에 대해 소개하려고 한다.

 

사용은 메서드 상단에 설정을 해준다.

 

예제는 아래와 같다.

@Transactional
public void interal() {
    serviceA.transactionalTest();
    serviceA.transactionalTest();
    serviceA.transactionalTest();
    throw new ExceptionEx("errr");
}

이미 검색을 하고 들어온 순간부터 Transactional 이라는 애가 뭘 하는 애인지는 알거라 생각하지만 간단히 설명하면


스프링 내에서 AOP 원리로 동작을 하며 Transactional 로 묶어둔 메서드가 시작부터 종료할때까지 모든 메서드가 정상적으로 종료시 commit / 그렇지 못할시 rollback을 해주는 똑똑한 annotation이다.

 

예제의 경우엔 serviceA에 transactionalTest라는 함수를 호출하고 해당 함수에는 db에 값을 insert 하는 코드가 있다고 하면

3번 값이 입력 되었다가 Exception이 생겨서 rollback이 이루어진다.

 

참고로 Transactional 은 unchecked Exception 을 default로 받아서 rollback을 한다.

이 내용은 아래 참고 포스팅을 참고 바란다.

 

그리고 사실 별 설정을 안해줘도 자동으로 rollback이 되지만 이 annotation은 많은 속성을 갖고 있다.

아래 표를 참고 바란다.

속성명 특징 옵션
isolation 일관성없는 데이터 허용 수준을 설정 DEFAULT, READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE
noRollbackFor, rollbackFor 특정 예외발생시 rollback하지않음 or rollback함으로 설정  
noRollbackForClassName, rollbackForClassName 특정 클래스이름인 경우 rollback하지않음 or rollback함으로 설정 (e.g)rollbackForClassName=”Exception”
propagation(전파속성) 트랜잭션 동작 도중 다른 트랜잭션을 호출할 때, 어떻게 할 것인지 설정 REQUIRED(Defualt), REQUIRES_NEW, SUPPORT, NOT_SUPPORT, MANDATORY, NEVER, NESTED
readOnly 트랜잭션을 읽기 전용으로 설정. true면 insert, update, delete 실행 시 예외 발생 true, false(Defualt)
timeout, timeoutString 지정한 시간내에 메서드수행이 완료되지 않으면 rollback함으로설정(단위 : 초,seconds)  
transactionManager 특정 Transaction의 qualifier value를 설정  
value transactionManager의 alias(별칭)을 설정한다.  

다른 값들도 유용하지만 노란 블럭에 대해서는 한번 설명을 한다면,

noRollbackFor, rollbackFor, noRollbackForClassName, rollbackForClassName ->

어떤 Exception 이 터지면 롤백을 하거나 안하거나를 설정할수 있음

 

propagation ->

트랜잭션 동작 도중 다른 트랜잭션을 호출할 때, 어떻게 할 것인지 전파속성을 선택할 수 있다. 총 7가지 속성이 있다.
  1. REQUIRED(Defualt): 이미 진행중인 트랜잭션이 있다면 해당 트랜잭션 속성을 따르고, 진행중이 아니라면 새로운 트랜잭션을 생성한다.
  2. REQUIRES_NEW: 항상 새로운 트랜잭션을 생성한다. 이미 진행중인 트랜잭션이 있다면 잠깐 보류하고 해당 트랜잭션 작업을 먼저 진행한다.
  3. SUPPORT: 이미 진행 중인 트랜잭션이 있다면 해당 트랜잭션 속성을 따르고, 없다면 트랜잭션을 설정하지 않는다.
  4. NOT_SUPPORT: 이미 진행중인 트랜잭션이 있다면 보류하고, 트랜잭션 없이 작업을 수행한다.
  5. MANDATORY: 이미 진행중인 트랜잭션이 있어야만, 작업을 수행한다. 없다면 Exception을 발생시킨다.
  6. NEVER: 트랜잭션이 진행중이지 않을 때 작업을 수행한다. 트랜잭션이 있다면 Exception을 발생시킨다.
  7. NESTED: 진행중인 트랜잭션이 있다면 중첩된 트랜잭션이 실행되며, 존재하지 않으면 REQUIRED와 동일하게 실행된다.

 

 

간단하게 사용하면 편하지만 복잡한 코드가 들어가게 되면 AOP로 동작을 하다보니 내부 호출에서 문제가 있다.

 

이 내용은 심화적인 내용이므로 별도 포스팅에서 다뤄볼 예정이다.


참고 포스팅

https://thenicesj.tistory.com/485

 

Error, Checked Exception, Unchecked Exception 비교

포스팅 시작 앞에 에러와 예외에 대해서 먼저 비교를 해보고 시작하려고 한다. Error란 시스템 레벨에서 발생하는 심각한 수준의 오류를 뜻하며 개발자가 미리 예측하여 처리할 수 없기에 개발

thenicesj.tistory.com

 

반응형

댓글