본문 바로가기
🖥Web/🔥SpringBoot

[SpringBoot] AOP 트랜잭션 처리, 롤백, AspectJ 트랜잭션처리transactionAdvice, transactionAdviceAdvisor example

by 후누스 토르발즈 2021. 1. 19.
반응형

 

 

 

 

TransactionConfig.java

package com.example.base.config;

import java.util.Collections;
import java.util.HashMap;

import org.aspectj.lang.annotation.Aspect;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource;
import org.springframework.transaction.interceptor.RollbackRuleAttribute;
import org.springframework.transaction.interceptor.RuleBasedTransactionAttribute;
import org.springframework.transaction.interceptor.TransactionAttribute;
import org.springframework.transaction.interceptor.TransactionInterceptor;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Aspect
@Configuration
public class TransactionConfig {

	@Autowired
	private PlatformTransactionManager transactionManager;
	
	@Bean
	public TransactionInterceptor transactionAdvice() {
		log.debug("transactionAdvice()");
		TransactionInterceptor txAdvice = new TransactionInterceptor();
		NameMatchTransactionAttributeSource txAttributeSource = new NameMatchTransactionAttributeSource();
		RuleBasedTransactionAttribute txAttribute = new RuleBasedTransactionAttribute();

		txAttribute.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
		txAttribute.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
		
		HashMap<String, TransactionAttribute> txMethods = new HashMap<String, TransactionAttribute>();
		txMethods.put("*", txAttribute);
		txAttributeSource.setNameMap(txMethods);
		
		txAdvice.setTransactionAttributeSource(txAttributeSource);
		txAdvice.setTransactionManager(transactionManager);
		
		return txAdvice;
	}
	
	@Bean
	public Advisor transactionAdviceAdvisor() {
		log.debug("transactionAdviceAdvisor()");
		AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
		pointcut.setExpression("execution(* com.example.base..service.*.*(..))");
		return new DefaultPointcutAdvisor(pointcut, transactionAdvice());
	}
}

 

 

PlatformTransactionManager

  • Spring의 명령형 트랜잭션 인프라의 중심 인터페이스입니다. 애플리케이션은 이를 직접 사용할 수 있지만 기본적으로 API를 의미하지는 않습니다. 일반적으로 애플리케이션은 TransactionTemplate 또는 AOP를 통한 선언적 트랜잭션 경계와 함께 작용합니다.
  • AbstractPlatformTransactionManager 구현 자의 경우 정의 된 전파 동작을 사전 구현하고 트랜잭션 동기화 처리를 처리 하는 제공된 클래스에서 파생하는 것이 좋습니다. 하위 클래스는 기본 트랜잭션의 특정 상태(예 : 시작, 일시 중단, 다시 시작, 커밋)에 대한 템플릿 메서드를 구현해야 합니다.
  • 이 전략 인터페이스의 구본 구현은 JtaTransactionManager 

 

TransactionAspectSupport(org.springframework.transaction.interceptor)

  • AOP Aliance 호환 TransactionInterceptor 또는 AspectJ 측면과같은 트랜잭션 측면을 위한 슈퍼 클래스. 이를 통해 기본 Spring 트랜잭션 인프라를 쉽게 사용하여 모든 aspect 시스템에 대한 aspect를 구현할 수 있습니다.
  • 서브클래스는 이 클래스의 메서드를 올바른 순서로 호출해야합니다.
  • 전략 디자인 패턴을 사용합니다. PlatformTransactionManager 구현은 실제 트랜잭션 관리를 수행하고 
  • TransactionAttributeSource는 트랜잭션 정의를 결정하는데 사용됩니다.

 

TransactionInterceptor(org.springframework.transaction.interceptor)

  • 공통 Spring 트랜잭션 인프라를 사용하여 선언적 트랜잭션 관리를 제공하는 AOP Aliance MethodInterceptor.
  • TransactionAspectSupport 클래스에서 파생됩니다. 이 클래스에는 Spring의 기본 트랜잭션 API에 대한 필수 호출이 포함되어 있습니다. 이와 같은 하위 클래스 createTransactionIfNecessary는 정상적인 호출 반환 또는 예외 발생시 올바른 순서로 슈퍼 클래스 메서드를 호출하는 역할을 합니다.
  • TransactionInterceptor는 스레드로부터 안전합니다.

 

MethodInterceptor(org.aopaliance.intercept)

  • 대상으로 가는 도중에 인터페이스 호출을 차단합니다. 이들은 타겟의 “상단”에 중첩됩니다.
  • 사용자는 invoke(MethodInvocation) 원래 동작을 수정하기 위해 메서드를 구현합니다. 예를 들어 다음 클래스는 추적 인터셉터를 구현합니다. (호출 전 후에 추가 처리를 수행하려면 invoke(MethodInvocation invocation)구현)

 

NameMatchTransactionAttributeSource(org.springframework.transaction.interceptor)

  • 등록 된 이름으로 속성을 일치시킬 수 있는 간단한 구현입니다.

 

RuleBasedTransactionAttribute(org.springframework.transaction.interceptor)

  • 특정 예외가 양수 및 음수 모두의 여러 롤백 규칙을 적용하여 트랜잭션 롤백을 유발해야하는지 여부를 확인하는 TransactionAttribute 구현입니다. 예외와 관련된 규칙이 없는 경우 DefaultTransactionAttribute(런타임 예외시 롤백)처럼 작동합니다.
  • 이 전략 인터페이스의 기본 구현은 JtaTransactionManager 및 DataSourceTransactionManager로, 다른 트랜잭션 전략의 구현 가이드 역할을 할 수 있습니다.

 

RollbackRuleAttribute(org.springframework.transaction.interceptor)

  • 주어진 예외(및 모든 하위 클래스)가 롤백을 발생시켜야 하는지 여부를 결정하는 규칙입니다. 예외가 발생한 후 트랜잭션을 커밋할지 또는 롤백할지 여부를 결정하기 위햇 이러한 규칙을 여러 개 적용할 수 있습니다.

 

AspectJExpressionPointcut(org.springframework.aop.aspectj) 

  • PointcutPointcut 표현식을 평가하기 위해 AspectJ 위버를 사용하는 Spring 구현.
  • Pointcut 표현식 값은 AspectJ 표현식입니다. 이것은 다른 포인트 컷을 참조하고 구성 및 기타 작업을 사용할 수 있습니다.
  • 당연히 이것은 SpringAOP의 프록시 기반 모델에 의해 처리되므로 메서드 실행 포인트 컷 만 지원됩니다.

 

추가설명

  • Collections.singletonList(T) : 1개의 객체만 있는 리스트를 반환(불변)

 

반응형