

@Slf4j
@RequiredArgsConstructor
public class MemberServiceV3_1 {
// **데이터 접근 기술의 주입이 일어나는 곳 **
private final PlatformTransactionManager transactionManager;
private final MemberRepositoryV3 memberRepository;
public void accountTransfer(String fromId, String toId, int money) throws
SQLException {
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을 적어줘야 하기 때문에, 이러한 중복코드들을 줄여주기 위해 template을 사용한다고 합니다.!
@Slf4j
public class MemberServiceV3_2 {
// private final PlatformTransactionManager transactionManager;
private final TransactionTemplate txTemplate;
private final MemberRepositoryV3 memberRepository;
public MemberServiceV3_2(PlatformTransactionManager transactionManager,
MemberRepositoryV3 memberRepository) {
// Template을 사용하려면 TransactionManager를 주입받아야 함
this.txTemplate = new TransactionTemplate(transactionManager);
this.memberRepository = memberRepository;
}
public void accountTransfer(String fromId, String toId, int money) throws
SQLException {
txTemplate.executeWithoutResult((transactionStatus -> {
try{
bizLogic(fromId,toId,money);
} catch (SQLException e) {
throw new IllegalStateException(e);
}
}));
}
한계 : 서비스 class에 비즈니스 로직만 있는 것이 아니라, 트랜잭션 로직도 같이 있다는 한계가 있다. 이는 서비스 유지보수하기가 어렵게 만든다. 해결 방법은 AOP이다.! @Transactional
method 위에다 @Transactional을 붙여주면 스프링이 해당 메소드를 상속받은 프록시 객체를 만든다. 실행 시에, 트랜잭션이 실행된다.

Connection - db와 연결
DataSource(Hikari) - Connection들을 가지고 있음
TransactionManager - Commit, rollBack과 같은 기능의 인터페이스
TransactionTemplate - Commit rollback을 생략해줌
AOP - 관심사를 완전히 분리