

트랜잭션이란?
원자성, 일관성, 고립성, 지속성을 만족하는 하나의 과정
어노테이션을 이용해 트랜잭션 설정하기
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 |