
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)를 생성하는 역할을 합니다.
- MatchAlwaysTransactionAttributeSource 객체 생성
- 항상 동일한 트랜잭션 속성을 적용하는 설정입니다.
- RuleBasedTransactionAttribute 객체 생성
- 트랜잭션 이름을 "*"으로 설정하여 모든 메서드에 적용하도록 합니다.
- 모든 예외 발생 시 롤백하도록 설정 (RollbackRuleAttribute(Exception.class)).
- TransactionInterceptor를 생성하여 반환합니다.
- Spring이 제공하는 PlatformTransactionManager를 사용하여 트랜잭션을 관리합니다.
4. AOP Advisor 설정 (transactionAdvisor())
- AspectJExpressionPointcut을 사용하여 트랜잭션을 적용할 지점(Pointcut) 설정
- pointcut.setExpression(TRANSACTION_POINTCUT_EXPRESSION);
- DefaultPointcutAdvisor를 사용하여 트랜잭션 인터셉터와 Pointcut을 연결
- return new DefaultPointcutAdvisor(pointcut, transactionInterceptor());
이 설정을 통해 특정 패키지의 서비스 클래스(impl 패키지)에 속한 모든 메서드에 대해 트랜잭션이 자동으로 적용됩니다.

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

'프로젝트 > 마이그레이션' 카테고리의 다른 글
Spring AOP를 활용한 로깅(Log) 설정 (1) | 2025.02.04 |
---|---|
스프링에서 전략 패턴(Strategy Pattern) 활용하기 (1) | 2025.02.03 |
Spring BeanNameGenerator 구현 (0) | 2025.01.24 |
Jackson 기반 JSON 유틸리티와 커스텀 ObjectMapper 적용하기 (0) | 2025.01.09 |