• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

트랜잭션 프록시 내부 호출에 대해 질문이 있습니다

22.08.03 22:28 작성 조회수 337

0

[질문 템플릿]
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

답변을 작성해보세요.

1

개발자는개발님의 프로필

개발자는개발

2022.08.05

제 생각에는 tx()에서 이미 트렌잭션이 걸려서, 그 이후 메소드에는 자동적으로 적용된 것 같아요

 

즉, tx2()가 @Trasanactional이 적용된게 아니고 단지 tx2()를 호출한 메소드에 트랜잭션이 걸려있어서 

tx2()에도 트랜잭션이 걸려있는거죠

개발자는개발님 설명 감사합니다^^

또또록님의 프로필

또또록

질문자

2022.08.08

아하 ! 감사합니다 😃