public interface TxManager {
begin();
commit();
rollback();
}
트랜잭션은 사실 단순하다. 트랜잭션을 시작하고, 비즈니스 로직의 수행이 끝나면 커밋하거나 롤백하면 된다.
그리고 다음과 같이 `TxManager` 인터페이스를 기반으로 각각의 기술에 맞는 구현체를 만들면 된다.
- JdbcTxManager: JDBC 트랜잭션 기능을 제공하는 구현체 - JpaTxManager : JPA 트랜잭션 기능을 제공하는 구현체
- 서비스는 특정 트랜잭션 기술에 직접 의존하는 것이 아니라, `TxManager` 라는 추상화된 인터페이스에 의존한다.이제 원하는 구현체를 DI를 통해서 주입하면 된다. 예를 들어서 JDBC 트랜잭션 기능이 필요하면`JdbcTxManager` 를 서비스에 주입하고, JPA 트랜잭션 기능으로 변경해야 하면 `JpaTxManager` 를 주입하면된다. - 클라이언트인 서비스는 인터페이스에 의존하고 DI를 사용한 덕분에 OCP 원칙을 지키게 되었다. 이제 트랜잭션을 사용하는 서비스 코드를 전혀 변경하지 않고, 트랜잭션 기술을 마음껏 변경할 수 있다.
package org.springframework.transaction;
/**
* Spring 애플리케이션에서 트랜잭션 관리를 위한 인터페이스.
*/
public interface PlatformTransactionManager extends TransactionManager {
/**
* 새로운 트랜잭션을 시작하거나, 기존 트랜잭션을 가져옵니다.
*
* @param definition 트랜잭션 정의 (null일 경우 기본값 사용)
* @return 트랜잭션 상태 객체 (새 트랜잭션 또는 현재 트랜잭션)
* @throws TransactionException 트랜잭션 초기화 실패 시 예외 발생
*/
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
/**
* 주어진 트랜잭션을 커밋합니다.
*
* @param status 커밋할 트랜잭션 상태
* @throws TransactionException 커밋 실패 시 예외 발생
*/
void commit(TransactionStatus status) throws TransactionException;
/**
* 주어진 트랜잭션을 롤백합니다.
*
* @param status 롤백할 트랜잭션 상태
* @throws TransactionException 롤백 실패 시 예외 발생
*/
void rollback(TransactionStatus status) throws TransactionException;
}