@Transactional은 자바에서 스프링 프레임워크에서 제공하는 어노테이션 중 하나입니다. 이 어노테이션은 메서드 또는 클래스에 적용될 수 있습니다. 이 어노테이션을 사용하면 해당 메서드나 클래스의 실행이 트랜잭션 내에서 처리됨을 나타냅니다.
@Transactional 어노테이션을 사용하면 스프링이 트랜잭션을 관리하고, 설정된 트랜잭션 속성에 따라 메서드가 실행됩니다. 이를 통해 개발자는 트랜잭션 처리를 명시적으로 관리할 필요가 없으며, 트랜잭션의 관리와 제어를 스프링에 위임할 수 있습니다.
일반적으로 @Transactional 어노테이션은 다음과 같은 속성을 가질 수 있습니다:
- readOnly: 트랜잭션이 읽기 전용인지 여부를 나타냅니다. 읽기 전용 트랜잭션은 데이터베이스에 쓰기 작업이 없음을 나타내며, 성능을 향상시킬 수 있습니다.
- isolation: 트랜잭션 격리 수준을 설정합니다. 여러 트랜잭션이 동시에 실행될 때 각 트랜잭션 간의 데이터 접근 및 변경의 격리 수준을 제어합니다.
- propagation: 트랜잭션 전파 속성을 설정합니다. 메서드 호출 시 현재 트랜잭션이 이미 존재하는 경우 트랜잭션을 어떻게 처리할지를 결정합니다.
- timeout: 트랜잭션 제한 시간을 설정합니다. 특정 시간 내에 트랜잭션이 완료되지 않으면 롤백됩니다.
- rollbackFor: 롤백이 수행되어야 할 예외를 지정합니다.
- 읽기 전용 (Read-only): 대부분의 트랜잭션은 읽기와 쓰기 작업을 포함합니다. 그러나 읽기 전용 트랜잭션은 데이터를 읽기만하고 변경하지 않습니다. 이러한 트랜잭션은 데이터베이스에 부하를 줄이고 성능을 향상시키는 데 사용됩니다.
- 격리 수준 (Isolation Level): 트랜잭션이 동시에 실행되는 경우, 격리 수준은 각 트랜잭션이 서로 어떻게 영향을 미치는지를 결정합니다. 네 가지 주요 격리 수준은 다음과 같습니다:
- READ UNCOMMITTED: 커밋되지 않은 데이터를 읽을 수 있습니다.
- READ COMMITTED: 다른 트랜잭션이 커밋한 데이터만 읽을 수 있습니다.
- REPEATABLE READ: 같은 쿼리를 여러 번 실행해도 같은 결과가 나옵니다.
- SERIALIZABLE: 가장 높은 격리 수준으로, 트랜잭션 간에 완전한 격리를 제공합니다.
- 전파 동작 (Propagation Behavior): 트랜잭션을 시작한 메서드가 이미 실행중인 트랜잭션이 있는 경우, 새로운 트랜잭션을 어떻게 처리할지를 결정합니다. 대표적인 전파 동작에는 다음이 있습니다:
- REQUIRED: 이미 실행 중인 트랜잭션이 있으면 해당 트랜잭션을 사용하고, 없으면 새로운 트랜잭션을 시작합니다.
- REQUIRES_NEW: 항상 새로운 트랜잭션을 시작하고, 이미 실행 중인 트랜잭션을 일시 중단시킵니다.
- 타임아웃 (Timeout): 트랜잭션이 완료되기까지 대기할 최대 시간을 설정합니다. 설정된 시간 내에 트랜잭션이 완료되지 않으면 롤백됩니다.
@Transactional 어노테이션을 아무런 속성 없이 달아놓으면 일반적으로 기본 속성이 적용됩니다. 스프링 프레임워크에서의 @Transactional 어노테이션은 다음과 같은 기본 속성을 가집니다:
- 읽기 전용 (Read-only): 기본적으로 false입니다. 따라서 트랜잭션은 읽기 및 쓰기 작업을 수행할 수 있습니다.
- 격리 수준 (Isolation Level): 일반적으로 데이터베이스의 기본 격리 수준을 따릅니다. 대부분의 데이터베이스는 READ COMMITTED 격리 수준을 기본값으로 가지고 있습니다.
- 전파 동작 (Propagation Behavior): 기본적으로 REQUIRED입니다. 즉, 이미 실행 중인 트랜잭션이 있는 경우 해당 트랜잭션을 사용하고, 없는 경우 새로운 트랜잭션을 시작합니다.
- 타임아웃 (Timeout): 기본적으로 제한 시간이 없습니다. 따라서 트랜잭션은 완료될 때까지 대기할 수 있습니다.
이러한 기본 속성은 트랜잭션의 일반적인 동작을 보장하며, 필요에 따라 트랜잭션의 동작을 세밀하게 조정할 수 있습니다.
이러한 기본 속성은 데이터베이스 시스템에 따라 다를 수 있으며, 개발자는 이러한 속성을 조정하여 트랜잭션의 동작을 필요에 맞게 조정할 수 있습니다.
이 외에도 다양한 속성이 있으며, 이러한 속성을 사용하여 트랜잭션의 동작을 세밀하게 제어할 수 있습니다.
'Spring공부' 카테고리의 다른 글
스프링 부트 (0) | 2024.05.14 |
---|---|
자바 백엔드 개발자가 알아주면 좋은 지식. (0) | 2024.05.14 |
DTO의 필요성 (0) | 2024.01.29 |
회원 가입 API (0) | 2023.12.20 |
IoC(제어의 역전), DI(의존성 주입) (0) | 2023.12.13 |