프로젝트/마이그레이션

Spring AOP를 활용한 트랜잭션 관리 설정

10Biliion 2025. 2. 4. 08:47

 

 

 

 

 

 

 

 

 

Spring Framework에서 트랜잭션을 관리하는 방법 중 하나로 AOP(Aspect-Oriented Programming)를 활용할 수 있습니다. TransactionManagerConfig 클래스를 분석하며 Spring AOP 기반 트랜잭션 관리의 원리를 살펴보겠습니다.


전체 코드

@Configuration
@RequiredArgsConstructor
public class TransactionManagerConfig {

    private static final String TRANSACTION_METHOD_PATTERN = "*";
    private static final String TRANSACTION_POINTCUT_EXPRESSION = "execution(* com.example.service.impl.*.*(..))";

    private final PlatformTransactionManager transactionManager;

    @Bean
    public TransactionInterceptor transactionInterceptor() {
        MatchAlwaysTransactionAttributeSource source = new MatchAlwaysTransactionAttributeSource();
        RuleBasedTransactionAttribute transactionAttribute = new RuleBasedTransactionAttribute();
        
        transactionAttribute.setName(TRANSACTION_METHOD_PATTERN);
        
        transactionAttribute.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
        source.setTransactionAttribute(transactionAttribute);

        return new TransactionInterceptor(transactionManager, source);
    }

    @Bean
    public Advisor transactionAdvisor() {
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression(TRANSACTION_POINTCUT_EXPRESSION);

        return new DefaultPointcutAdvisor(pointcut, transactionInterceptor());
    }
}

1. @Configuration 과 @RequiredArgsConstructor

  • @Configuration:
    • 해당 클래스가 Spring 설정 클래스임을 나타냅니다.
    • 하나 이상의 @Bean 메서드를 포함하는 경우 사용됩니다.
  • @RequiredArgsConstructor:
    • Lombok에서 제공하는 어노테이션으로, final 필드에 대한 생성자를 자동으로 생성합니다.
    • 이 코드에서는 PlatformTransactionManager 객체를 의존성 주입받는 역할을 합니다.

2. AOP 기반 트랜잭션 관리 개념

2.1 트랜잭션 관리의 필요성

트랜잭션은 데이터 일관성을 보장하기 위해 필요합니다. Spring에서는 @Transactional 어노테이션을 통해 쉽게 관리할 수 있지만, AOP 기반으로 설정할 경우 전역적으로 트랜잭션을 적용할 수 있는 장점이 있습니다.

2.2 AOP 방식의 트랜잭션 설정

이 코드에서는 AspectJ 표현식을 사용하여 특정 패키지의 모든 서비스 메소드에 트랜잭션을 적용합니다.

  • TRANSACTION_POINTCUT_EXPRESSION = "execution(* com.example.service.impl.*.*(..))";
    • com.example.service.impl 패키지 내 모든 클래스의 모든 메소드에 트랜잭션을 적용한다는 의미입니다.
    • execution(* 패키지명..클래스명.*(..)) 형태의 표현식을 사용하여 메서드를 지정합니다.

3. 트랜잭션 인터셉터 (TransactionInterceptor)

3.1 transactionInterceptor()

트랜잭션 관리를 위한 인터셉터(TransactionInterceptor)를 생성하는 역할을 합니다.

  1. MatchAlwaysTransactionAttributeSource 객체 생성
    • 항상 동일한 트랜잭션 속성을 적용하는 설정입니다.
  2. RuleBasedTransactionAttribute 객체 생성
    • 트랜잭션 이름을 "*"으로 설정하여 모든 메서드에 적용하도록 합니다.
    • 모든 예외 발생 시 롤백하도록 설정 (RollbackRuleAttribute(Exception.class)).
  3. TransactionInterceptor를 생성하여 반환합니다.
    • Spring이 제공하는 PlatformTransactionManager를 사용하여 트랜잭션을 관리합니다.

4. AOP Advisor 설정 (transactionAdvisor())

  1. AspectJExpressionPointcut을 사용하여 트랜잭션을 적용할 지점(Pointcut) 설정
    • pointcut.setExpression(TRANSACTION_POINTCUT_EXPRESSION);
  2. DefaultPointcutAdvisor를 사용하여 트랜잭션 인터셉터와 Pointcut을 연결
    • return new DefaultPointcutAdvisor(pointcut, transactionInterceptor());

이 설정을 통해 특정 패키지의 서비스 클래스(impl 패키지)에 속한 모든 메서드에 대해 트랜잭션이 자동으로 적용됩니다.


 

 

  • Spring AOP를 활용하여 전역적으로 트랜잭션을 적용하는 설정을 구현했습니다.
  • TransactionInterceptor를 이용해 모든 메서드에서 예외 발생 시 자동으로 롤백하도록 설정했습니다.
  • AspectJExpressionPointcut을 활용하여 특정 패키지(service.impl)에 속한 클래스의 모든 메서드에 트랜잭션을 적용했습니다.
  • @Transactional을 개별적으로 붙이지 않아도 되므로 트랜잭션 일관성을 유지하는데 효과적입니다.