[스프링 이해와 원리] 서비스단에서 트랜잭션 추상화하기 :: 잡다한 프로그래밍
반응형

1. 트랜잭션 적용이 필요한 시나리오

JDBC를 이용하는 환경에 맞게 스프링에서 제공하는 트랜잭션 기능을 통해 Service를 다음과 같이 구성했다고 하자. 

하지만 만약 다른 회사는 JDBC가 아닌 여러개의 DB를 이용하여 JTA를, 다른 회사는 , JPA를 사용한다고 했을 때 이 서비스는 사용자들의 환경에 따라 수정이 필요한 서비스가 되어 버린다. 따라서 스프링에서 제공하는 트랜잭션 서비스를 추상화 하는 인터페이스(PlatformTransactionManager)통해 추상화 할 수 있다.

@Autowired
private DataSource dataSource;

public void setDataSource(DataSource dataSource){
	this.dataSource = dataSource;
}

public void upgradeLevels() throws Exception {
	TransactionSynchronizationManager.initSynchronization(); //트랜잭션 동기화 관리자를 이용해 초기화
    Connection c = DataSourceUtils.getConnection(dataSource); //JDBC 커넥션을 시작함
    c.setAutoCommit(false);
    ......

 

다음과 같이 추상화 할 수 있다. set방식은 기존 DI와 같은 방식이고 추상화를 이용하면 JDBC, JPA 등 다양한 트랜잭션을 getTransaction, commit 같은 메소드로 실행할 수 있다.

public class UserService {
...
	private PlatformTransactionManager transactionManager;
    
    public void setTransactionManager(PlatformTransactionManager transactionManager) {
    	this.transactionManager = transactionManager;
    }
    
    public void upgradeLevels() {
    	TransactionStatus status = this.transactionManager.getTransaction(new DefaultTransactionDefinition());
        ...
}
반응형

+ Recent posts