스프링에서는 DB 접근 기술 (JDBC, JPA 등)에 따라서 트랜잭션을 사용하는 코드가 다르다.
이러한 문제를 해결하기 위해 스프링은 트랜잭션 추상화를 제공한다.
트랜잭션을 사용하는 입자에서는 이 추상화를 통해 여러 DB 접근 기술의 트랜잭션을 동일한 방식으로 사용할 수 있다.
여기에 더해서 스프링 부트를 사용하면 어떤 데이터 접근 기술을 사용하는지 자동으로 인식해서 적절한 트랜잭션 매니저 구현체를 선택해 스프링 빈으로 등록해준다.
*트랜잭션 프록시 코드 예시*
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);
}
}
트랜잭션 AOP는 기본적으로 프록시 방식의 AOP를 사용한다.
대상 객체 내부의 메서드 호출이 발생하면 프록시를 거치지 않고 호출되기 때문에 트랜잭션이 걸리지 않는다!
fun external() {
internal() // transaction 적용 안됨!!!!!!!!!!!!
}
@Transactoinal
fun internal() {
}