//트랜잭션 시작
TransactionStatus status = transactionManager.getTransaction(new
DefaultTransactionDefinition());
try {
//비즈니스 로직
bizLogic(fromId, toId, money);
transactionManager.commit(status); //성공시 커밋
} catch (Exception e) {
transactionManager.rollback(status); //실패시 롤백
throw new IllegalStateException(e);
}
위 코드는 보면 비즈니스 로직이 성공하면 commit을 하고 실패하면 rollback을 한다.
이러한 비즈니스 로직이 여러개라면 커밋과 롤백 코드를 각각의 비즈니스로직 뒤에 모두 넣어줘야 하므로 매우 번거롭게 된다.
이때 템플릿 콜백 패턴을 활용하면 이런 반복 문제를 깔끔하게 해결할 수 있다.
private final TransactionTemplate txTemplate;
private final MemberRepositoryV3 memberRepository;
public MemberServiceV3_2(PlatformTransactionManager transactionManager, MemberRepositoryV3 memberRepository) {
this.txTemplate = new TransactionTemplate(transactionManager);
this.memberRepository = memberRepository;
}
TransactionTemplate을 사용하려면 transactionManager가 필요하기 때문에 생성자에서 transactionManager를 주입 받으면서 TransactionTemplate를 생성해줘야 한다.
<TransactionTemplate 적용 후 비즈니스 로직>
public void accountTransfer(String fromId, String toId, int money) throws SQLException {
txTemplate.executeWithoutResult((status)->{
try{
bizLogic(fromId,toId,money);
}catch (SQLException e){
throw new IllegalStateException(e);
}
});
}
커밋과 롤백을 직접 해주지 않아도 비즈니스 로직이 정상 수행된다면 커밋해주고, 예외가 발생하면 롤백한다.
따라서 TransactionTemplate를 이용하면 반복되는 코드를 제거할 수 있다.
'BackEnd > Database' 카테고리의 다른 글
JDBC를 이용한 반복문제 해결 - JdbcTemplate (0) | 2025.02.04 |
---|---|
스프링 예외 추상화 (0) | 2025.02.04 |
DB 락 (0) | 2025.01.19 |
커넥션 풀 / DataSource (0) | 2025.01.13 |
데이터베이스 연결, JDBC개발 - 등록, 조회, 수정 ,삭제 (0) | 2025.01.12 |