728x90
트랜잭션을 사용하는 로직을 살펴보면 위 사진과 같은 패턴이 반복된다.
트랜잭션을 시작하고, 비즈니스 로직 실행하고, 성공하면 커밋, 예외가 발생해서 실패하면 롤백
다른 서비스에서 트랜잭션을 시작하려면 try, catch, finally를 포함한 성공시 커밋, 실패시 롤백 코드가 반복될 것이다.
→ 트랜잭션 템플릿을 적용해서 반복되는 코드를 해결해 보자
트랜잭션 템플릿
템플릿 콜백 패턴을 적용하려면 템플릿을 제공하는 클래스를 작성해야하는데, 스프링은 TransactionTemplate 라는 템플릿 클래스를 제공한다.
public class TransactionTemplate {
private PlatformTransactionManager transactionManager;
public <T> T execute(TransactionCallback<T> action){..}
void executeWithoutResult(Consumer<TransactionStatus> action){..}
}
- execute() : 응답 값이 있을 때 사용한다.
- executeWithoutResult() : 응답 값이 없을 때 사용한다.
서비스 로직에 트랜잭션 템플릿을 적용해보면
private final TransactionTemplate txTemplate;
this.txTemplate = new TransactionTemplate(transactionManager);
TransactionTemplate 을 사용하려면 transactionManager 가 필요하다. 생성자에서 transactionManager 를 주입 받으면서 TransactionTemplate 을 생성했다.
트랜잭션 템플릿 사용 로직을 보면 (accountTransfer)
트랜잭션 템플릿 덕분에 트랜잭션을 시작하고, 커밋하거나 롤백하는 코드가 모두 제거되었다.
트랜잭션 템플릿의 기본 동작
- 비즈니스 로직이 정상 수행되면 커밋한다.
- 언체크 예외가 발생하면 롤백한다. 그 외의 경우 커밋한다. (체크 예외의 경우에는 커밋하는데, 이 부분 은 뒤에서 설명한다.)
728x90
'Spring > Spring DB' 카테고리의 다른 글
트랜잭션 AOP 이해 (0) | 2023.10.04 |
---|---|
스프링 부트의 자동 리소스 등록 (0) | 2023.10.03 |
트랜잭션 추상화 (0) | 2023.10.03 |
트랜잭션 동기화 (0) | 2023.10.03 |
JDBC에 의존하는 트랜잭션을 적용하면서 나타나는 문제점 (0) | 2023.10.03 |