@Transactional 애노테이션이란?
- Spring 에게 트랜잭션 경계를 관리하도록 메타 정보를 주는 것이다.
@Transactional
이 붙은 메서드가 호출됐을 때, 스프링은 새 트랜잭션을 시작한다.- 메서드가 성공적으로 완료되면 트랜잭션이 커밋된다.
- 예외가 발생하면 트랜잭션이 롤백된다.
@Transactional 애노테이션으로 설정할 수 있는 것들
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
// 여기에도 쓸 수 있고, 여기에 쓰면 클래스 내부의 모든 메서드에 적용된다.
public class YourService {
private final YourRepository yourRepository;
// Constructor injection of the repository
public YourService(YourRepository yourRepository) {
this.yourRepository = yourRepository;
}
@Transactional
public void yourTransactionalMethod() {
// Multiple repository operations that should be part of a single transaction
yourRepository.method1();
yourRepository.method2();
// ...
}
}
전파 동작 (Propagation Behavior)
- 트랜잭션 컨텍스트가 이미 있을 때, 메서드가 기존 트랜잭션 내에서 실행될지 아니면 새 트랜잭션을 시작할지 지정할 수 있다.
격리 수준 (Isolation Level)
- 한 트랜잭션에서 액세스하는 데이터가 다른 트랜잭션으로부터 격리되는 방식을 결정할 수 있다.
- dirty read, non-repeatable read, phantom read 와 같은 문제를 방지하는데 매우 중요하다.
읽기 전용 최적화 (Read-Only Optimization)
- 트랜잭션을 읽기 전용으로 표시하면 성능을 최적화할 수 있다.
- 일부 DB 에서는 읽기 전용 트랜잭션을 사용하면 커밋/롤백을 위해 변경 내역을 추적할 필요가 없어 더욱 효율적으로 실행할 수 있다.
예외 처리 (Exception Handling)
- 롤백을 트리거할 예외를 지정할 수 있다.
- Spring 에서는 런타임 예외와 Unchecked 예외는 롤백을 유발하지만, Checked 예외는 롤백을 유발하지 않는다.
코드 예제를 통해 @Transactional 의 옵션 알아보기
propagation
: 전파에 관한 옵션- 트랜잭션이 이미 진행중일 때 트랜잭션에 합류할지, 새 트랜잭션을 시작할지 등..
isolation
: 고립과 트랜잭션 간의 데이터 가시성 결정- 커밋된 데이터만 읽도록 할지 등...
readOnly
: 트랜잭션을 읽기 전용으로 만들어 성능 최적화timeout
: 트랜잭션 완료 제한시간을 걸어둠rollbackFor
: 어떤 예외로 트랜잭션이 롤백될지 정의noRollbackFor
: 트랜잭션이 롤백되지 않아야 하는 예외를 정의
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Isolation;
@Service
public class TransactionalService {
@Transactional(
propagation = Propagation.REQUIRED,
isolation = Isolation.READ_COMMITTED,
readOnly = false,
timeout = 30,
rollbackFor = Exception.class,
noRollbackFor = IllegalArgumentException.class
)
public void exampleTransactionalMethod() {
// Business logic here
}
}
언제 써야하는가?
- 리포지토리 계층이 아닌 서비스 계층에서
@Transactional
애노테이션을 적용하는 것이 가장 좋다.- 서비스 메서드에서 리포지토리 호출을 포함하는 로직이 있을 때 비즈니스 로직 및 데이터베이스 작업을 캡슐화 할 수 있다.
- 데이터 무결성을 유지할 때 필수적이다.
- 서비스 수준 트랜잭션으로 래핑하면 모든 DB 작업이 단위로 성공적으로 완료되거나 오류 발생 시 롤백되어 데이터 무결성을 유지할 수 있다.
요약
- 적절한 트랜잭션 관리, 데이터 무결성 및 일관성 유지에 필요하다.
반응형
'프레임워크 > 스프링 프레임워크' 카테고리의 다른 글
@AutoConfigureTestDatabase 애노테이션이란? (0) | 2023.08.03 |
---|---|
@MockBean 애노테이션이란? (0) | 2023.08.03 |
@TestConfiguration 애노테이션이란? (0) | 2023.08.03 |
@DataJpaTest 애노테이션이란? (0) | 2023.08.03 |
Spring Boot Configuration Processor 란? (0) | 2023.08.02 |