ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot - Transaction(트랜잭션)
    Framework & Library/Spring Boot 2021. 11. 29. 23:03

    트랜잭션의 정의

    트랜잭션이란?

    돈을 송금하는 과정을 예로 들어 트랜잭션의 개념을 알아보겠다. 돈을 송금하는 과정은 아래와 같다.

     

        1. 송금하고자 하는 계좌와 금액을 입력한다.

        2. 이체하는 계좌에서 돈이 출금된다.

        3. 이체받는 계좌에 돈이 입금된다.

        4. 거래가 정상적으로 완료된다.

     

    거래가 정상적으로 처리되면 문제가 없지만, 중간에 문제가 발생할 수 있다. 예를 들어, 2번과 3번 과정 사이에서 문제가 발생하면, 돈은 출금되었는데 이체받는 계좌에는 돈이 들어오지 않게 된다. 따라서, 돈을 송금하는 과정에서 문제가 발생하면 이와 관련된 모든 과정이 취소되고 원래 상태로 되돌아와야 한다.

     

    트랜잭션이란, 데이터베이스의 상태를 변화시킬 때 더 이상 분리할 수 없는 작업의 단위를 의미한다. 위의 예를 볼 때 돈이 출금되고 입금되는 과정이 분리되면 안 된다는 것이다. 즉, 하나의 트랜잭션에서 일련의 작업이 처리되어야 함을 뜻한다.

     

    트랜잭션의 속성

     

    속성 설명
    원자성(Atomicity) 하나의 트랜잭션 내에서 실행한 작업들은 하나로 간주한다.
    일관성(Consistency) 트랜잭션은 일관성있는 데이터베이스 상태를 유지한다.
    고립성(Isolation) 트랜잭션은 독립적으로 처리되어야 하며, 처리되는 중간에 외부의 간섭이 없어야 한다.
    지속성(Durability) 트랜잭션이 성공적으로 처리되면, 그 결과는 지속적으로 유지되어야 한다.

    트랜잭션 설정 방법

    애너테이션을 이용한 방법
    @Configuration
    @EnableTransactionManagement
    public class DBConfiguration {
        
        @Bean
        public PlatformTransactionManager transactionManager() throws Exception {
    		return new DataSourceTransactionManager(dataSource());
    	}
    }

     - 애너테이션을 이용해 트랜잭션 처리를 해보기 위해서 DBConfiguration 클래스에 위 코드를 추가한다.

     - @EnableTransactionManagement : 스프링에서 제공하는 애너테이션 기반 트랜잭션을 활성화한다.

     - transactionManager() : 스프링에서 제공하는 트랜잭션 매니저를 빈으로 등록하기 위한 메서드이다.

     

    @Service
    @Transactional
    public class BoardServiceImpl implements BoardService { }

     - 트랜잭션을 처리하고자 하는곳에 위 코드와 같이 @Transactional 애너테이션을 추가한다.

     - @Transactional : 인터페이스, 클래스, 메서드에 사용될 수 있으며, 해당 애너테이션이 적용된 대상은 설정된 트랜잭션으로 처리된다.

     

    AOP를 이용한 방법
    @Configuration
    public class TransactionAspect {
    
    	@Autowired
    	private PlatformTransactionManager transactionManager;
    
    	private static final String EXPRESSION = "execution(* com.board..service.*Impl.*(..))";
    
    	@Bean
    	public TransactionInterceptor transactionAdvice() {
    
    		List<RollbackRuleAttribute> rollbackRules = Collections.singletonList(new RollbackRuleAttribute(Exception.class));
    
    		RuleBasedTransactionAttribute transactionAttribute = new RuleBasedTransactionAttribute();
    		transactionAttribute.setRollbackRules(rollbackRules);
    		transactionAttribute.setName("*");
    
    		MatchAlwaysTransactionAttributeSource attributeSource = new MatchAlwaysTransactionAttributeSource();
    		attributeSource.setTransactionAttribute(transactionAttribute);
    
    		return new TransactionInterceptor(transactionManager, attributeSource);
    	}
    
    	@Bean
    	public Advisor transactionAdvisor() {
    
    		AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
    		pointcut.setExpression(EXPRESSION);
    
    		return new DefaultPointcutAdvisor(pointcut, transactionAdvice());
    	}
    
    }

     - AOP를 통해 트랜잭션을 처리하기 위해, 위 코드와 같이 TransactionAspect 클래스를 생성한다.

     - transactionManager : DBConfiguration 클래스에서 빈(Bean)으로 등록한 PlatformTransactionManager 객체이다.

     - transactionAttribute.setRollbackRules(rollbackRules) : 트랜잭션에서 롤백을 수행하는 룰을 설정한다. 위 코드에서는 어떠한 예외가 발생하면 무조건 롤백이 수행되도록 설정하였다.

     - transactionAttribute.setName("*") : 트랜잭션의 이름을 설정한다.

     - pointcut.setExpression(EXPRESSION) : AOP 포인트컷을 설정한다. 위 코드에서는 비즈니스 로직을 수행하는 ServiceImpl 클래스의 모든 메서드를 지정해 주었다.

     

    트랜잭션 처리 방식의 장단점

     

      @Transactional 애너테이션을 이용한 설정 AOP를 이용한 트랜잭션
    장점 1. 특별한 설정 없이 쉽게 사용이 가능하다.
    2. 원하는 곳에만 트랜잭션을 설정이 가능하여, 성능에 최소한의 영향만 끼친다.
    1. 공통으로 트랜잭션이 적용되어 누락될 일이 없다.
    2. 외부 라이브러리 역시 적용이 가능하다.
    단점 1. 애너테이션이 누락되거나 여러 메서드에 걸쳐서 사용될 경우 트랜잭션이 적용되지 않을 수 있다.
    2. 외부 라이브러리에 사용이 어렵다.
    1. 트랜잭션이 필요 없는 곳까지 적용되어 성능에 영향을 끼칠 수 있다.
    2. 원하는 곳에만 트랜잭션을 적용하기 어렵다.

     

    728x90

    'Framework & Library > Spring Boot' 카테고리의 다른 글

    Spring Boot - JPA의 영속성 컨텍스트  (0) 2021.12.02
    Spring Boot - JPA  (0) 2021.12.01
    Spring Boot - Filter  (0) 2021.11.28
    Spring Boot - AOP  (0) 2021.09.23
    Spring Boot - 사용자 입력 데이터 처리  (0) 2021.09.23

    댓글

Designed by Tistory.