스프링 트랜잭션 처리

스프링에서 트랜잭션 관리란, 여러 개의 데이터베이스 작업을 한 덩어리로 묶어서 실행하고, 실행 결과가 모두 정상이면 데이터베이스 상태를 일관성 있게 유지하는 것입니다. 예를 들어, 계좌 이체를 처리하는 과정에서 첫 번째 계좌에서 출금을 하고, 두 번째 계좌로 입금을 하는데, 이 과정에서 한 번이라도 오류가 발생하면 둘 다 처리되지 않도록 하는 것입니다.

스프링에서는 트랜잭션 관리를 위한 기능을 제공하며, 이를 사용하면 프로그래머가 직접 코드를 작성하지 않아도 데이터베이스 작업을 트랜잭션으로 묶어줄 수 있습니다. 이를 Declarative Transaction Management라고 부르며, 메서드에 @Transactional 어노테이션을 추가하면 해당 메서드에서 실행되는 데이터베이스 작업이 모두 트랜잭션으로 처리됩니다.

이 방법을 사용하면, 데이터베이스 작업을 실행하는 코드에 트랜잭션 처리 코드를 추가하지 않아도 되므로 코드가 간결해집니다. 또한, 중복 코드를 제거하여 유지보수성을 높일 수 있습니다.

예시

@Service
public class MyService {

    @Autowired
    private MyMapper myMapper;

    @Transactional
    public void transferMoney(String fromAccount, String toAccount, int amount) {
        // 출금
        myMapper.withdraw(fromAccount, amount);

        // 입금
        myMapper.deposit(toAccount, amount);
    }
}

위 코드에서 @Service 어노테이션을 사용하여 MyService 클래스를 스프링 빈으로 등록합니다. @Autowired 어노테이션을 이용하여 MyMapper 인터페이스를 구현한 클래스를 주입받습니다.

@Transactional 어노테이션을 사용하여 transferMoney() 메서드에서 실행되는 데이터베이스 작업이 트랜잭션으로 처리되도록 설정합니다. 출금과 입금 작업이 모두 성공해야만 트랜잭션이 커밋되며, 그렇지 않으면 롤백됩니다. 이렇게 하면, 중간에 예외가 발생하더라도 출금과 입금 작업이 모두 취소되므로 데이터베이스 상태가 일관성 있게 유지됩니다.

간단 요약 : 스프링에서 제공하는 트랜잭션 관리 기능을 이용하면, 여러 개의 데이터베이스 작업을 한 덩어리로 묶어서 실행하고, 실행 결과가 모두 정상이면 데이터베이스 상태를 일관성 있게 유지할 수 있습니다. @Transactional 어노테이션을 이용하여 메서드 단위로 트랜잭션을 설정하고, 이를 Declarative Transaction Management라고 부릅니다. 이 방법을 사용하면 코드가 간결해지고, 중복 코드를 제거할 수 있습니다.