(Spring) Transactional 사용법

2022. 8. 10. 00:16Spring

반응형

Transactional.

 

이 어노테이션을 왜 붙이는 지 모른다면, 트랜잭션에 대한 이해도가 부족한 것일 수 있다.

 

 

Transaction에 대한 이해가 필요하다면 아래 문서를 참고해보자.

 

 

 

(Database) 트랜잭션(ACID)과 무결성

구글에 트랙잭션을 검색하면 가장 많이 나오는 말이 있다. "DB의 상태를 변화시키기 수행하는 단위" 그런데 이것 만으로는 트랜잭션에 관해 전혀 감이 오지 않는다. (나만 그런가?) 나는 이 문장

mirrorofcode.tistory.com

 

 

그럼 트랜잭션에 대해서 안다고 가정하고 시작하겠다!

 

@Transactional


스프링에서는 트랜잭션 처리를 간편하게 어노테이션으로 처리할 수 있다.

 

아래 코드를 보자.

 

@Service
@Transactional(readOnly = true)
public class UserService{
    @Autowired
    private UserRepository userRepository;
   
    @Transactional
    public User getUser(Long id) {
        return userRepository.findById(id)
                             .orElseThrow(() -> new UserNotFoundException(id));
    }
    
    @Transactional(isolation = Isolation.REPEATABLE_READ)
    public User createUser(UserData userData) {
        User user = mapper.map(userData, User.class);
        return userRepository.save(user);
    }

 

 

Transactional 어노테이션은 클래스에서도, 메서드에서도 사용할 수 있다

 

하지만 Public인 클래스 혹은 메서드에만 사용할 수 있다.

 

 

그리고 코드에서 확인할 수 있지만, 클래스 레벨과 메서드 레벨에 동시에 어노테이션이 붙은 것을 확인 할 수 있다.

 

이럴 때는 우선순위가 중요해진다.

 

우선순위는 다음과 같다.

 

  • 클래스 메서드(static)
  • 클래스
  • 인터페이스 메서드
  • 인터페이스

 

 

@어떻게 사용하나요?


Type element  
Isolation isolation 격리 수준
String[] label  
Class<? extends Throwable> [] noRollbackFor 롤백이 수행되지 않아야 하는 클래스의 배열
String[] noRollbackForClassName 롤백이 수행되지 않아야 하는 클래스 이름의 배열
Propagation propagation 전파 타입
boolean readOnly 일기 / 쓰기 설정
Class<? extends Throwable> rollbackFor 롤백이 수행 되어야 하는 클래스의 배열
String[] rollbackForClassName 롭갱시 수행 되어야 하는 클래스 이름의 배열
int timeout 타임 아웃 시간
String timetoutString 타임 아웃 시간에 대한 String
String transactionManager  
String value  

 

각각 하나하나 상세하게 사용법을 서술하고 싶지만 시간이 여유치 않아서 공식문서 링크로 대체한다.

 

 

 

Transactional (Spring Framework 5.3.22 API)

Defines zero (0) or more exception Classes, which must be subclasses of Throwable, indicating which exception types must not cause a transaction rollback. This is the preferred way to construct a rollback rule (in contrast to noRollbackForClassName()), mat

docs.spring.io

 

반응형