트랜잭션 추상화, 트랜잭션 탬플릿으로 각 DB 툴에 대한 대응과 반복코드에 대한 문제점도 줄일 수 있었다.
하지만! 서비스 계층에 순수한 서비스 로직만 남긴다는 염원은 해결하지 못했다!
스프링 AOP를 통해 프록시를 도입하면 문제를 깔끔하게 해결할 수 있다! → 즉 @Transactional로 간단하게 해결 가능하다!
스프링 AOP란?
Spring AOP
는 스프링 컨테이너와 프록시 기반으로 AOP를 지원하는 모듈이다.
즉, 핵심 로직을 건드리지 않고도 공통 로직을 깔끔하게 분리/적용 할 수 있게 도와준다.
Spring AOP는 프록시 패턴을 사용→ 런타임에 동작! → 프록시가 부수적인 로직들을 처리해주므로 핵심 로직ㅇ 집중할 수 있다!
원래는 아래와 같이 서비스단에서 트랜잭션의 원자성을 지켜야하기에 서비스계층에서 트랜잭션을 시작했다면,

프록시를 도입하면 아래처럼 따로 트랜잭션 시작 종료를 해주기 때문에 순수한 서비스로직 작성이 가능하다!

아래 코드처럼 트랜잭션 프록시가 실행할 서비스로직을 target이라는 이름으로 직접 호출시켜주고, 트랜잭션도 시작하고 커밋,롤백도 도맡아서 하고 있다!!!
public class TransactionProxy {
		private MemberService target;
		
	public void logic() {
	
	//트랜잭션 시작
	TransactionStatus status = transactionManager.getTransaction(..);
	
	try {
	
	//실제 대상 호출 -> 여기서 서비스 로직 직접 호출중!
	target.logic();
	transactionManager.commit(status); //성공시 커밋
	
	} catch (Exception e) {
	
	transactionManager.rollback(status); //실패시 롤백
	throw new IllegalStateException(e);
	}
}
}