22년 12월 작성한 글입니다.
@Transactional
어노테이션을 통해 트랜잭션을 처리합니다.@Transactional
이 어떻게 적용되는지 확인해봅니다.@Transactional
를 적용한 메서드에 어떻게 AOP 방식으로 트랜잭션이 적용되는지 확인해보겠습니다.@Transactional
이 적용된 메서드 혹은 클래스에 프록시를 적용하기 위해 우선 advisor 를 등록합니다.ProxyTransactionManagementConfiguration
에서 BeanFactoryTransactionAttributeSourceAdvisor
를 등록합니다.BeanFactoryTransactionAttributeSourceAdvisor
는TransactionInterceptor
를 가집니다.TransactionAttributeSourcePointcut
를 가지며 TransactionAttributeSource
를 사용하여 프록시 적용 여부를 결정합니다.TransactionAttributeSource
는 기본적으로 AnnotationTransactionAttributeSource
를 사용하는데, @Transactional
이 있으면 프록시를 적용합니다.@Transactional
이 적용된 메서드가 호출될때, 어떻게 @Transactional
의 프로퍼티를 가져오는지 살펴보겠습니다.@Transactional
의 프로퍼티는 실행시, TransactionAttribute
로 컨버팅되어 조회됩니다.TransactionInterceptor
는 MethodInterceptor
를 구현하고 TransactionAspectSupport
를 상속합니다.TransactionInterceptor#invoke
가 호출되고, 내부적으로 TransactionAspectSupport#invokeWithinTransaction
를 호출합니다.TransactionAspectSupport#invokeWithinTransaction
내부에서 TransactionAttributeSource
를 사용하여 TransactionAttribute
를 가져옵니다.ProxyTransactionManagementConfiguration
에서 TransactionAttributeSource
를 AnnotationTransactionAttributeSource
로 등록합니다.AnnotationTransactionAttributeSource
는 내부적으로 TransactionAnnotationParser
를 사용하여 TransactionAttribute
를 조회합니다.TransactionAnnotationParser
는 트랜잭션 어노테이션이 적용된 메서드 혹은 클래스의 TransactionAttribute
를 파싱하는 인터페이스 입니다.SpringTransactionAnnotationParser
는 TransactionAnnotationParser
를 구현하며 @Transactional
이 적용된 메서드 혹은 클래스의 @Transactional
를 TransactionAttribute
로 파싱합니다.ProxyTransactionManagementConfiguration
를 통해 트랜잭션 advisor 가 등록됩니다.TransactionInterceptor
가 advice 로 호출됩니다.@Transactional
를 TransactionAttribute
로 파싱하여 사용합니다.