트랜잭션이란?

 

원자성, 일관성, 고립성, 지속성을 만족하는 하나의 과정

 

 

 

어노테이션을 이용해 트랜잭션 설정하기

DatabaseConfiguration.java

 

 

 

@EnableTransactionManagement
.
.
.
@Bean
public PlatformTransactionManager transactionManager() throws Exception{
return new DataSourceTransactionManager(dataSource());
}

1: 스프링에서 제공하는 어노테이션 기반 트랜잭션을 활성화

5~8: 스프링이 제공하는 트랜잭션 매니저를 등록

 

 

 

사용하고 싶은곳에 @Transactional 만 추가하면된다.

BoardServiceImpl.java

.
.
.
@Service
@Transactional
public class BoardServiceImpl implements BoardService{
.
.
.

 

 

@Transactional  어노테이션은 인터페이스나 클래스, 메서드에 사용할 수 있다. 어노테이션이 적용된 대상은 설정된 트랜잭션 빈에 의해 트랜잭션이 처리된다.

 


AOP를 이용하여 트랜잰셕 설정하기

 

몇개의 설정이 필요할때에는 어노테이션을 사용해도 되지만, 생성할때 마다 어노테이션을 붙여줘야 하기 때문에 AOP로 설정하는 방법을 알아보자.

 

board\src\main\java\board\aop\TransactionAspect.java

package board.aop;
import java.util.Collections;
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.interceptor.MatchAlwaysTransactionAttributeSource;
import org.springframework.transaction.interceptor.RollbackRuleAttribute;
import org.springframework.transaction.interceptor.RuleBasedTransactionAttribute;
import org.springframework.transaction.interceptor.TransactionInterceptor;
@Configuration
public class TransactionAspect {
private static final String AOP_TRANSACTION_METHOD_NAME = "*";
private static final String AOP_TRANSACTION_EXPRESSION = "execution(* board..service.*Impl.*(..))";
@Autowired
private PlatformTransactionManager transactionManager;
@Bean
public TransactionInterceptor transactionAdvice(){
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 transactionAdviceAdvisor(){
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(AOP_TRANSACTION_EXPRESSION);
return new DefaultPointcutAdvisor(pointcut, transactionAdvice());
}
}

20~21: 트랜잭션을 설정할 때 사용되는 설정값을 상수로 선언 한다.

30: 트랜잰셕의 이름을 설정합니다. 트랜잭션 모니터에서 트랜잭션의 이름으로 확인가능하다.

31: 트랜잰션에서 롤백을 하는 룰을 설정한다. 여기서는 예외가 일어나면 수행되도록 했다.

40: AOP의 포인트컷을 설정한다. 여기서는 비즈니스 로직이 수행되는 모든 ServiceImpl 클래스의 모든 메서드를 지정함.

 

 

결과확인 

리스트를 조회하는 부분에 일부러 장애코드(int i = 10/0;) 삽입.

트랜잭션 적용전에는 에러난후 새로고침하면 조회수가 증가했다.

 

 

* 다만 두가지 방법을 동시에 사용하면 에러가 발생 할 수 있다고 함.

'Spring Boot > 3. 스프링의 다양한 기능 추가' 카테고리의 다른 글

예외처리 및 인코딩  (0) 2022.10.29
AOP 사용하기  (0) 2022.10.27
인터셉터 사용하기  (0) 2022.10.27
Logback  (0) 2022.10.26
복사했습니다!