Notice
Recent Posts
Recent Comments
Link
쯔이's Dev
트랜잭션(Transaction) 본문
반응형
데이터베이스에서 여러 작업을 하나의 작업 단위로 묶어서 처리하는 것을 말합니다. 이 작업 단위는 모두 성공하거나 모두 실패해야 하며, 데이터의 일관성과 무결성을 보장하는 데 중요한 역할을 합니다.
트랜잭션의 4가지 특성 (ACID)
트랜잭션이 가지는 4가지 주요 특성은 다음과 같습니다:
- 원자성(Atomicity): 트랜잭션에 포함된 작업이 모두 성공하거나 모두 실패해야 함을 의미합니다. 트랜잭션 내 작업 중 하나라도 실패하면, 모든 작업이 취소됩니다.
- 일관성(Consistency): 트랜잭션이 완료된 후에도 데이터베이스는 항상 일관된 상태를 유지해야 합니다.
- 고립성(Isolation): 동시에 여러 트랜잭션이 수행되더라도 서로의 작업에 영향을 주지 않아야 합니다.
- 지속성(Durability): 트랜잭션이 성공적으로 완료된 후, 데이터는 영구적으로 저장되어야 합니다.
스프링에서 트랜잭션 관리
스프링 프레임워크는 트랜잭션을 쉽게 관리할 수 있도록 트랜잭션 관리 기능을 제공합니다. 스프링에서는 주로 @Transactional 애노테이션을 사용하여 트랜잭션을 설정합니다.
기본 설정 방법
- 의존성 추가: spring-tx 라이브러리를 사용하여 트랜잭션 관리를 지원합니다. 스프링 부트를 사용할 경우 별도의 의존성 추가 없이 트랜잭션을 사용할 수 있습니다.
- 트랜잭션 설정: @EnableTransactionManagement를 추가하여 스프링에서 트랜잭션 관리를 활성화합니다.
-
java코드 복사import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement public class AppConfig { // DataSource, EntityManager 설정 }
- 트랜잭션 애노테이션 적용: 트랜잭션이 필요한 서비스 메서드나 클래스에 @Transactional 애노테이션을 붙여 트랜잭션 처리를 설정합니다.
- @Transactional을 붙이면 메서드 내에서 예외가 발생할 경우 자동으로 롤백하여 데이터의 일관성을 유지합니다.
- 기본적으로 RuntimeException 또는 unchecked 예외가 발생할 경우 롤백됩니다.
-
java코드 복사import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class UserService { @Transactional public void registerUser(User user) { // 여러 데이터베이스 작업이 수행됨 userRepository.save(user); accountRepository.createAccount(user); // 예외 발생 시 모든 작업이 롤백됨 } }
트랜잭션 전파 및 격리 수준
스프링은 트랜잭션을 세밀하게 제어할 수 있는 옵션을 제공합니다.
1. 전파(propagation) 옵션
전파 속성은 현재 트랜잭션이 존재할 때 새 트랜잭션을 시작할지, 기존 트랜잭션을 사용할지를 결정합니다.
- REQUIRED: 기본 옵션으로, 이미 진행 중인 트랜잭션이 있으면 해당 트랜잭션에 참여하고, 없으면 새 트랜잭션을 시작합니다.
- REQUIRES_NEW: 항상 새로운 트랜잭션을 시작하고, 기존 트랜잭션은 일시 정지합니다.
- MANDATORY: 반드시 현재 트랜잭션이 존재해야 하며, 트랜잭션이 없으면 예외를 발생시킵니다.
2. 격리(isolation) 수준
격리 수준은 트랜잭션 간 간섭을 어떻게 제어할지 결정합니다.
- DEFAULT: 기본 데이터베이스 격리 수준을 따릅니다.
- READ_COMMITTED: 트랜잭션이 커밋한 데이터만 읽을 수 있으며, 일반적으로 많이 사용됩니다.
- REPEATABLE_READ: 트랜잭션 동안 동일한 데이터를 읽으면 항상 같은 결과를 보장합니다.
- SERIALIZABLE: 가장 높은 격리 수준으로, 트랜잭션 간 완전한 격리를 보장하지만 성능에 영향이 있을 수 있습니다.
트랜잭션 속성 예시
java
코드 복사
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.REPEATABLE_READ) public void processTransaction() { // 트랜잭션 처리 로직 }
이 설정은 트랜잭션을 새로운 트랜잭션으로 시작하고, REPEATABLE_READ 격리 수준을 사용하도록 지정합니다.
트랜잭션 관리 예제
예를 들어, 사용자 가입과 관련된 여러 데이터베이스 작업이 있을 때, 그 중 하나라도 실패하면 모든 작업이 취소되어야 할 필요가 있습니다.
java
코드 복사
@Service public class UserService { @Autowired private UserRepository userRepository; @Autowired private AccountRepository accountRepository; @Transactional public void registerUser(User user) { userRepository.save(user); // 사용자 정보 저장 accountRepository.createAccount(user); // 계좌 정보 생성 if (someConditionFails()) { throw new RuntimeException("등록 실패"); } } }
여기서 someConditionFails()가 예외를 발생시키면 registerUser 메서드 내의 모든 데이터베이스 작업이 롤백됩니다.
요약
- 트랜잭션은 데이터베이스의 일관성을 유지하며, 여러 작업을 하나의 작업 단위로 묶어 관리하는 기능입니다.
- 스프링에서는 @Transactional 애노테이션을 사용해 트랜잭션을 쉽게 관리할 수 있습니다.
- 전파 및 격리 수준을 통해 트랜잭션의 범위와 영향을 세밀하게 조정할 수 있습니다.
- 트랜잭션은 데이터베이스의 무결성을 보장하고 오류 발생 시 안전하게 롤백하도록 설계하는 데 중요한 역할을 합니다.
728x90
반응형