@Transactional은 Spring Framework에서 제공하는 어노테이션으로, 메서드나 클래스에 이 어노테이션을 사용하여 데이터베이스 트랜잭션을 관리할 수 있도록 도와주는 기능을 제공합니다.
이 어노테이션을 사용하면 메서드 실행 도중에 트랜잭션의 시작, 커밋, 롤백 등을 자동으로 처리할 수 있습니다.
@Transactional 어노테이션은 다음과 같은 중요한 특성을 가지고 있습니다.
메서드 내에서 실행되는 트랜잭션과 외부 트랜잭션 간의 상호 작용을 정의합니다.
예를 들어, REQUIRED, REQUIRES_NEW, NESTED 등의 전파 속성을 설정할 수 있습니다.
동시에 여러 트랜잭션이 실행될 때 어떻게 격리되어야 하는지를 정의합니다.
READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE 등의 격리 수준을 설정할 수 있습니다.
트랜잭션 내에서 데이터를 읽기만 하는 경우, 해당 트랜잭션을 읽기 전용으로 설정하여 성능을 향상시킬 수 있습니다.
트랜잭션이 얼마 동안 실행될 수 있는지를 설정합니다.
시간 초과가 발생하면 트랜잭션은 롤백될 수 있습니다.
특정 예외 유형에 대한 롤백 여부를 설정할 수 있습니다.
@Transactional 어노테이션은 기본적으로 메서드 수준에서 트랜잭션을 관리합니다.
클래스 수준에도 설정할 수 있으며, 클래스 수준에서 설정한 값은 메서드 수준에서 재정의할 수 있습니다.
@Transactional 어노테이션의 전파 속성 DEFAULT와 REQUIRES_NEW
@Service
public class TransactionService {
@Autowired
private UserRepository userRepository;
@Transactional
public void updateUserWithDefaultTransaction(User user) {
// 데이터 변경 작업
userRepository.save(user);
}
@Transactional
public void processWithDefaultTransaction(User user) {
// 여러 데이터 변경 작업
updateUserWithDefaultTransaction(user);
// 다른 데이터 변경 작업
}
}
위의 예시에서 updateUserWithDefaultTransaction 메서드와 processWithDefaultTransaction 메서드는 모두 @Transactional 어노테이션이 기본 설정인 DEFAULT로 실행됩니다.
따라서 이 두 메서드 안에서 수행되는 데이터 변경 작업은 하나의 트랜잭션으로 묶이게 됩니다.
@Service
public class TransactionService {
@Autowired
private UserRepository userRepository;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateUserWithRequiresNewTransaction(User user) {
// 데이터 변경 작업
userRepository.save(user);
}
@Transactional
public void processWithRequiresNewTransaction(User user) {
// 여러 데이터 변경 작업
updateUserWithRequiresNewTransaction(user);
// 다른 데이터 변경 작업
}
}
위의 예시에서 updateUserWithRequiresNewTransaction 메서드와 processWithRequiresNewTransaction 메서드는 각각 @Transactional 어노테이션의 propagation 속성을 사용하여 REQUIRES_NEW 설정으로 실행됩니다.
따라서 processWithRequiresNewTransaction 메서드 안에서 updateUserWithRequiresNewTransaction 메서드를 호출하면 독립적인 새로운 트랜잭션이 생성되어 실행됩니다.
이렇게 트랜잭션의 범위와 특성을 설정함으로써 데이터 변경 작업의 격리 수준과 처리 방식을 조절할 수 있습니다.
유익한 자료 감사합니다.