목차

Spring Boot; Transactional

🗓️

부트에서의 트랜잭션

  • 코드 기반의 트랜잭션, 어노테이션을 통한 선언적 트랜잭션 두가지를 지원한다.
// DatabaseConfiguration.class
//...
@EnableTransactionManagement
public class DatabaseConfiguration {
    //..
        @Bean
    public PlatformTransactionManager transactionManager() throws Exception {
        return new DataSourceTransactionManager(dataSource());
    }
    //..
  • @EnableTransactionManagement : 어노테이션 기반의 트랜잭션 활성화.
  • PlatformTransactionManager : 스프링이 제공하는 트랜잭션 매니져 등록.
//BoardServiceImplement.class
@Service
@Transactional
public class BoardServiceImplement implements BoardService {
  • @Transactional : 트랜잭션 빈으로 트랜잭션 처리됨.

AOP를 활용한 트랜잭션

@Configuration
public class TransactionAspect {

    private static final String AOP_TRANSACTION_METHOD_NAME = "*";
    private static final String AOP_TRANSACTIION_EXPRESSION =
        "execution(* org.platanus.webappboard..service.*Implement.*(..))";

    @Autowired
    private PlatformTransactionManager transactionManager;

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

        return new TransactionInterceptor(transactionManager, source);
    }


    @Bean
    public Advisor transactionPointcutAdvisor() {
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression(AOP_TRANSACTIION_EXPRESSION);
        return new DefaultPointcutAdvisor(pointcut, transactionInterceptorAdvice());
    }

}

transactionInterceptorAdvice()

  • AOP_TRANSACTION_ 상수 : Aspect의 필터와 지정대상을 상수로 지정한다.
  • transactionAttribute.setName() : 트랜잭션의 이름
  • transactionAttribute.setRollbackRules() : Rollback 룰을 설정한다. 예외가 일어나면 롤백하는것으로 지정. 모든 예외는 Exception.class를 상속받기 때문에 모든 예외에 대해서 롤배고딘다.

transactionPointcutAdvisor()

  • Advice가 실행될 지점을 지정한다.

@Transactional과 AOP 트랜잭션의 차이점

@Transactional

  • 특별한 설정 없이 쉽게 사용 가능
  • 원하는 곳에만 트랜잭션을 설정해 성능에 대한 영향을 최소화 할 수 있다.
  • Annotation이 누락되거나 여러 메소드에 걸쳐 사용될 경우 트랜잭션이 누락될 수 있다.
  • 외부 라이브러리에 대해서는 사용이 불가능하다.

AOP 트랜잭션

  • 공통으로 트랜잭션이 적용되기 때문에 트랜잭션이 누락될 일이 없다.
  • 외부 라이브러리에 적용 가능하다.
  • 트랜잭션이 필요없는 곳까지 적용된다. → 필터를 잘 골라내자.
  • 개발하다보면 원하는곳에만 필터를 적용하기 힘들 수 있다.. 예를 들어 비즈니스 로직 중 특정 시점에는 데이터가 commit되어야 하는 스팩이 있는데 이를 무시하고 rollback되버릴 수 있다.