부트에서의 트랜잭션
- 코드 기반의 트랜잭션, 어노테이션을 통한 선언적 트랜잭션 두가지를 지원한다.
// 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()
@Transactional과 AOP 트랜잭션의 차이점
@Transactional
- 특별한 설정 없이 쉽게 사용 가능
- 원하는 곳에만 트랜잭션을 설정해 성능에 대한 영향을 최소화 할 수 있다.
- Annotation이 누락되거나 여러 메소드에 걸쳐 사용될 경우 트랜잭션이 누락될 수 있다.
- 외부 라이브러리에 대해서는 사용이 불가능하다.
AOP 트랜잭션
- 공통으로 트랜잭션이 적용되기 때문에 트랜잭션이 누락될 일이 없다.
- 외부 라이브러리에 적용 가능하다.
- 트랜잭션이 필요없는 곳까지 적용된다. → 필터를 잘 골라내자.
- 개발하다보면 원하는곳에만 필터를 적용하기 힘들 수 있다.. 예를 들어 비즈니스 로직 중 특정 시점에는 데이터가 commit되어야 하는 스팩이 있는데 이를 무시하고 rollback되버릴 수 있다.