트랜잭션 관련 포스팅
트랜잭션 의존
JDBC 트랜잭션 의존 시
- 트랜잭션을 사용하는 코드는 데이터 접근 기술마다 다르다
- 따라서 데이터 접근 기술이 바뀌면 서비스 계층의 코드도 바뀐다
- 이는 OCP 원칙을 위반한다
트랜잭션 추상화
public interface TxManager {
begin();
commit();
rollback();
}
- 트랜잭션은 단순하다. 트랜잭션을 시작하고 비즈니스 로직이 끝난 후 커밋이나 롤백을 수행하면 된다
- 따라서 이 인터페이스를 기반으로 각 데이터 접근 기술에 적합한 구현체를 만들면 된다
TxManager 의존 시
- 서비스는 이제 특정 트랜잭션 기술에 직접 의존하는 것이 아니라 TxManager라는 추상화된 인터페이스에 의존한다
- 실제 구현체는 DI를 통해 주입한다
- 클라언트인 서비스는 TxManager에 의존하고 DI를 사용함으로써 OCP 원칙을 지키게 되었다
스프링의 트랜잭션 추상화
- 스프링은 위의 TxManager와 같은 트랜잭션 추상화 기술을 제공한다
- 그것이 바로 PlatformTransactionManager 인터페이스이다
- 구현체도 이미 만들어져 있으므로 가져다가 사용하기만 하면 된다
- 어떤 트랜잭션 매니저을 선택할 지는 현재 등록된 라이브러리를 보고 판단한다
- JDBC 기술을 사용하면 DataSourceTransactionManger를 빈으로 등록하고, JPA를 사용하면 JpaTransactionManager를 사용한다
- 둘다 사용하는 경우엔 JpaTransactionManger를 등록한다
- JpaTransactionManger는 DataSourceTransactionManger가 제공하는 기능도 대부분 지원한다
package org.springframework.transaction;
public interface PlatformTransactionManager extends TransactionManager {
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
- getTransaction(): 트랜잭션을 시작한다
- 이름이 getTransaction()인 이유는 기존에 이미 진행중인 트랜잭션이 있는 경우엔 해당 트랜잭션에 참여할 수 있기 때문이다
- commit(): 트랜잭션을 커밋한다
- rollback(): 트랜잭션을 롤백한다
참고
스프링 DB 1편