쯔이's Dev

트랜잭션(Transaction) 본문

카테고리 없음

트랜잭션(Transaction)

jjhim531 2024. 11. 1. 13:28
반응형

데이터베이스에서 여러 작업을 하나의 작업 단위로 묶어서 처리하는 것을 말합니다. 이 작업 단위는 모두 성공하거나 모두 실패해야 하며, 데이터의 일관성무결성을 보장하는 데 중요한 역할을 합니다.

트랜잭션의 4가지 특성 (ACID)

트랜잭션이 가지는 4가지 주요 특성은 다음과 같습니다:

  1. 원자성(Atomicity): 트랜잭션에 포함된 작업이 모두 성공하거나 모두 실패해야 함을 의미합니다. 트랜잭션 내 작업 중 하나라도 실패하면, 모든 작업이 취소됩니다.
  2. 일관성(Consistency): 트랜잭션이 완료된 후에도 데이터베이스는 항상 일관된 상태를 유지해야 합니다.
  3. 고립성(Isolation): 동시에 여러 트랜잭션이 수행되더라도 서로의 작업에 영향을 주지 않아야 합니다.
  4. 지속성(Durability): 트랜잭션이 성공적으로 완료된 후, 데이터는 영구적으로 저장되어야 합니다.

스프링에서 트랜잭션 관리

스프링 프레임워크는 트랜잭션을 쉽게 관리할 수 있도록 트랜잭션 관리 기능을 제공합니다. 스프링에서는 주로 @Transactional 애노테이션을 사용하여 트랜잭션을 설정합니다.

기본 설정 방법

  1. 의존성 추가: spring-tx 라이브러리를 사용하여 트랜잭션 관리를 지원합니다. 스프링 부트를 사용할 경우 별도의 의존성 추가 없이 트랜잭션을 사용할 수 있습니다.
  2. 트랜잭션 설정: @EnableTransactionManagement를 추가하여 스프링에서 트랜잭션 관리를 활성화합니다.
  3. java
    코드 복사
    import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement public class AppConfig { // DataSource, EntityManager 설정 }
  4. 트랜잭션 애노테이션 적용: 트랜잭션이 필요한 서비스 메서드나 클래스에 @Transactional 애노테이션을 붙여 트랜잭션 처리를 설정합니다.
    • @Transactional을 붙이면 메서드 내에서 예외가 발생할 경우 자동으로 롤백하여 데이터의 일관성을 유지합니다.
    • 기본적으로 RuntimeException 또는 unchecked 예외가 발생할 경우 롤백됩니다.
  5. 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
반응형