[java] Spring Framework를 활용한 다양한 데이터베이스 트랜잭션 처리 방법

데이터베이스 트랜잭션은 애플리케이션에서 데이터를 일관되게 유지하고 신뢰성 있는 작업을 수행하는 데 중요한 역할을 합니다. Spring Framework를 사용하면 편리하게 데이터베이스 트랜잭션을 처리할 수 있습니다. 이번 포스팅에서는 Spring Framework를 활용하여 다양한 데이터베이스 트랜잭션 처리 방법을 알아보겠습니다.

1. DataSource 설정

먼저, Spring Framework에서 데이터베이스와 연결하기 위해 DataSource를 설정해야 합니다. DataSource는 데이터베이스와의 커넥션을 관리하는 데에 사용되며, Spring에서는 JDBC를 기반으로 하여 다양한 구현체를 제공합니다. 예를 들어, HikariCP, Tomcat JDBC 등이 있습니다. 아래는 HikariCP를 사용한 DataSource 설정의 예입니다.

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");
        config.setUsername("username");
        config.setPassword("password");
	
        return new HikariDataSource(config);
    }

}

위 코드에서는 HikariCP를 사용하여 MySQL 데이터베이스에 연결하는 DataSource를 설정하였습니다.

2. @Transactional 어노테이션 활용

Spring Framework에서는 @Transactional 어노테이션을 사용하여 간편하게 트랜잭션을 처리할 수 있습니다. @Transactional 어노테이션을 메서드 레벨 또는 클래스 레벨에 지정하여 트랜잭션 범위를 설정할 수 있습니다. 아래는 @Transactional 어노테이션의 사용 예입니다.

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Transactional
    public void createUser(User user) {
        userRepository.save(user);
    }

    @Transactional(readOnly = true)
    public User getUserById(Long id) {
        return userRepository.findById(id);
    }
}

위의 코드에서는 createUser 메서드와 getUserById 메서드에 @Transactional 어노테이션을 지정하여 각각의 메서드가 트랜잭션 범위 내에서 실행되도록 설정하였습니다.

3. PlatformTransactionManager 사용

Spring Framework에서는 PlatformTransactionManager 인터페이스를 통해 다양한 트랜잭션 매니저를 지원합니다. PlatformTransactionManager의 구현체에는 JpaTransactionManager, DataSourceTransactionManager, JtaTransactionManager 등이 있습니다. 아래는 DataSourceTransactionManager를 사용하는 예시입니다.

@Configuration
public class TransactionManagerConfig {

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

}

위의 코드에서는 DataSourceTransactionManager를 생성하여 DataSource와 연결된 트랜잭션 매니저를 설정하였습니다.

4. 프로그래밍 방식으로 트랜잭션 제어

Spring Framework를 사용하면 프로그래밍 방식으로 트랜잭션을 제어할 수도 있습니다. TransactionTemplate을 사용하여 직접 트랜잭션을 시작하고 종료할 수 있습니다. 아래는 프로그래밍 방식으로 트랜잭션을 제어하는 예시입니다.

@Configuration
public class TransactionalService {

    private final PlatformTransactionManager transactionManager;

    public TransactionalService(PlatformTransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }

    public void performTransactionally() {
        TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);

        transactionTemplate.execute(status -> {
            // 트랜잭션 범위 내에서 실행할 작업
            // ...

            return null;
        });
    }
}

위의 코드에서는 TransactionTemplate을 사용하여 performTransactionally 메서드 내에서 트랜잭션 범위 내에서 실행할 작업을 정의하였습니다.

결론

Spring Framework를 활용하여 데이터베이스 트랜잭션을 처리하는 다양한 방법에 대해 알아보았습니다. DataSource 설정, @Transactional 어노테이션 활용, PlatformTransactionManager 사용, 프로그래밍 방식으로 트랜잭션 제어 등을 소개하였습니다. 이러한 기능들을 적절히 활용하여 데이터베이스 트랜잭션 처리를 더욱 효과적으로 수행할 수 있습니다.


참고자료: