작성
·
410
0
class Service {
public void external() {
internal();
}
@Transactional
public void internal() {
return;
}
}
위와 같은 상황에서
외부에서 external()을 호출하면 -> 프록시가 호출되고 -> 트랜잭션이 적용되지 않은 상태로 실제 external()이 호출되고
-> this.internal()이 호출될 때는 프록시를 통하지 않고 호출했기 때문에 트랜잭션 AOP가 적용되지 않는다고 이해했습니다
그럼 두 메서드 모두 @Transactional이 붙어있을 때 내부 호출을 하면 어떻게 될까 궁금해서 확인을 해보니
그때는 internal() 메서드를 호출할 때 트랜잭션이 적용이 되더라구요 !
모든 내부 호출 시 this.XXXX() 호출이기 때문에 트랜잭션 AOP가 적용되지 않는다고 생각했는데 잘못 이해했나봐요
@Slf4j
static class BasicService2 {
@Transactional
public void tx() {
log.info("call tx");
final boolean txActive = TransactionSynchronizationManager.isActualTransactionActive();
log.info("tx active = {}", txActive);
this.tx2();
}
@Transactional
public void tx2() {
log.info("call tx2");
final boolean txActive = TransactionSynchronizationManager.isActualTransactionActive();
log.info("tx active = {}", txActive);
}
}
이렇게 하면 tx()에서 this로 tx2()를 직접 호출해도 트랜잭션이 적용되더라구요
프록시 방식의 AOP에서 내부 호출 시 AOP가 적용되지 않는다는 것은
모든 Spring AOP의, 모든 내부 호출이 그렇다는게 아니라
트랜잭션 AOP에서, 트랜잭션이 적용되지 않은 채로 호출된 메서드에서, 내부 호출을 할 때만 AOP가 적용되지 않는다는 뜻일까요?
개발자는개발님 설명 감사합니다^^