스프링에서는 트랜잭션을 어떻게 처리하는가? (1)

정원식·2023년 12월 16일
0

스프링 트랜잭션

목록 보기
1/5

22년 12월 작성한 글입니다.

개요

  • 우리는 보통 @Transactional 어노테이션을 통해 트랜잭션을 처리합니다.
  • 해당 어노테이션은 어떻게 적용이 되는지
  • 그리고 스프링에서는 트랜잭션을 어떻게 처리하는지 알아봅니다. (5.3.18 기준)
  • 이번 챕터에서는 @Transactional 이 어떻게 적용되는지 확인해봅니다.

@Transactional

  • 먼저 @Transactional 를 적용한 메서드에 어떻게 AOP 방식으로 트랜잭션이 적용되는지 확인해보겠습니다.

ProxyTransactionManagementConfiguration

  • @Transactional 이 적용된 메서드 혹은 클래스에 프록시를 적용하기 위해 우선 advisor 를 등록합니다.
    • 이를 위해 ProxyTransactionManagementConfiguration 에서 BeanFactoryTransactionAttributeSourceAdvisor 를 등록합니다.
  • BeanFactoryTransactionAttributeSourceAdvisor
    • advice 로 TransactionInterceptor 를 가집니다.
    • pointcut 으로 TransactionAttributeSourcePointcut 를 가지며 TransactionAttributeSource 를 사용하여 프록시 적용 여부를 결정합니다.
  • TransactionAttributeSource 는 기본적으로 AnnotationTransactionAttributeSource 를 사용하는데, @Transactional 이 있으면 프록시를 적용합니다.

TransactionInterceptor

  • 이제 @Transactional 이 적용된 메서드가 호출될때, 어떻게 @Transactional 의 프로퍼티를 가져오는지 살펴보겠습니다.
    • @Transactional 의 프로퍼티는 실행시, TransactionAttribute 로 컨버팅되어 조회됩니다.
  • advice 로 적용되는 TransactionInterceptorMethodInterceptor 를 구현하고 TransactionAspectSupport 를 상속합니다.
    • 호출될때, TransactionInterceptor#invoke 가 호출되고, 내부적으로 TransactionAspectSupport#invokeWithinTransaction 를 호출합니다.
    • 그리고 TransactionAspectSupport#invokeWithinTransaction 내부에서 TransactionAttributeSource 를 사용하여 TransactionAttribute 를 가져옵니다.

TransactionAttributeSource

  • 앞선 ProxyTransactionManagementConfiguration 에서 TransactionAttributeSourceAnnotationTransactionAttributeSource 로 등록합니다.
  • AnnotationTransactionAttributeSource 는 내부적으로 TransactionAnnotationParser 를 사용하여 TransactionAttribute 를 조회합니다.

TransactionAnnotationParser

  • TransactionAnnotationParser 는 트랜잭션 어노테이션이 적용된 메서드 혹은 클래스의 TransactionAttribute 를 파싱하는 인터페이스 입니다.
  • SpringTransactionAnnotationParserTransactionAnnotationParser 를 구현하며 @Transactional 이 적용된 메서드 혹은 클래스의 @TransactionalTransactionAttribute 로 파싱합니다.

결론

  • ProxyTransactionManagementConfiguration 를 통해 트랜잭션 advisor 가 등록됩니다.
  • TransactionInterceptor 가 advice 로 호출됩니다.
    • 내부적으로 @TransactionalTransactionAttribute 로 파싱하여 사용합니다.

Reference

spring-tx

profile
매일매일 성장하고 싶은 백엔드 개발자입니다.

0개의 댓글

관련 채용 정보