-
카테고리
-
세부 분야
백엔드
-
해결 여부
미해결
트랜잭션 프록시 내부 호출에 대해 질문이 있습니다
22.08.03 22:28 작성 조회수 337
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
트랜잭션 프록시의 내부 호출 강의를 듣고 궁금한 점이 생겨서 질문드립니다.
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가 적용되지 않는다는 뜻일까요?
답변을 작성해보세요.
답변 1