TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
bizLogic(fromId, toId, money);
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
throw new IllegalStateException(e);
}
위의 반복되는 패턴을 해결하는 방법으로 템플릿 콜백 패턴을 활용하면 해결할 수있다.
private final TransactionTemplate txTemplate;
private final MemberRepositoryV3 memberRepository;
public MemberServiceV3_2(PlatformTransactionManager transactionManager, MemberRepositoryV3 memberRepository) {
this.txTemplate = new TransactionTemplate(transactionManager);
this.memberRepository = memberRepository;
}
public void accountTransfer(String fromId, String toId, int money) throws SQLException {
txTemplate.executeWithoutResult((status) -> {
try {
bizLogic(fromId, toId, money);
} catch (Exception e) {
throw new IllegalStateException(e);
}
});
}
status --> V3_1 버전에서 사용했던 TransactionStatus
트랜잭션 템플릿의 기본 동작
비즈니스 로직이 정상 수행되면 커밋진행
코드에서 예외 처리를 위해 try ~ catch 가 들어갔는데 ,bizlogic() 메서드를 호출하면 SQLException 체크 예외를 넘겨줌.
V3_2 버전에도 서비스 로직인데 비즈니스로직뿐만 아니라 트랜잭션을 처리하는 기술 로직이 함께 포함되있는 것을 해결하지 못햇다.
번외
RuntimeException 클래스를 상속받지 않는 예외 클래스
컴파일러가 체크하는 예외
RuntimeException 클래스를 상속받는 예외클래스
복구 가능성이 없는 예외들이므로 컴파일러가 예외처리를 강제하지 않음.