부트캠프 기록/Section3

[Spring MVC] 트랜잭션(Transaction)

bbangduck 2022. 11. 12. 23:41

트랜잭션 

  • 여러개의 작업들을 하나의 그룹으로 묶어서 처리하는 처리 단위
  • 전부 성공하든가 전부 실패하든가(All or Nothing)  ➡ 데이터 무결성

 

  • ACID 원칙 (데이터베이스 트랜잭션이 안전하게 수행되는 것을 보장하기 위한 성질)
    • 원자성: 작업을 더 이상 쪼갤 수 없음
    • 일관성: 비즈니스 로직에서 의도하는대로 일관성있게 저장되거나 변경되는 것
    • 격리성:  여러개의 트랜잭션이 실행될 경우 각각 독립적으로 실행이 되어야 함
    • 지속성: 트랜잭션이 완료되면 그 결과는 지속되어야 함, 물리적인 저장소

 

  • 트랜잭션 커밋과 롤백

 

Spring FrameWork에서의 트랜잭션 처리

  • 트랜잭션
    • 로컬 트랜잭션
    • 분산 트랜잭션

 

  • Spring에서 사용되는 트랜잭션 방식
    • 선언형 트랜잭션(비즈니스 로직에 애너테이션 추가, AOP방식)
    • 프로그래맹 코드 베이스 트랜잭션

 

애너테이션 방식의 트랜잭션 적용

  • @Transactional 이라는 애너테이션을 트랜잭션이 필요한 영역에 추가
  •  클래스 레벨과 메서드 레벨
    • 조회 메서드에 @Transactional(readOnly = true) : flush처리를 하지 않고, 스냅샷도 생성하지 않으므로 효율적
  • 트랜잭션 전파
  • 트랜잭션 격리 레벨

 

AOP 방식의 트랜잭션 적용

더보기
// (1)
@Configuration
public class TxConfig {
    private final TransactionManager txm;

		// (2)
    public TxConfig(TransactionManager txm) {
        this.txm = txm;
    }

    @Bean
    public TransactionInterceptor txAdvice() {
        NameMatchTransactionAttributeSource txAttributeSource =
                                    new NameMatchTransactionAttributeSource();

				// (3)
        RuleBasedTransactionAttribute txAttribute =
                                        new RuleBasedTransactionAttribute();
        txAttribute.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

				// (4)
        RuleBasedTransactionAttribute txFindAttribute =
                                        new RuleBasedTransactionAttribute();
        txFindAttribute.setPropagationBehavior(
                                        TransactionDefinition.PROPAGATION_REQUIRED);
        txFindAttribute.setReadOnly(true);

				// (5)
        Map<String, TransactionAttribute> txMethods = new HashMap<>();
        txMethods.put("find*", txFindAttribute);
        txMethods.put("*", txAttribute);

				// (6)
        txAttributeSource.setNameMap(txMethods);

				// (7)
        return new TransactionInterceptor(txm, txAttributeSource);
    }

    @Bean
    public Advisor txAdvisor() {
				// (8)
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression("execution(* com.codestates.coffee.service." +
                "CoffeeService.*(..))");

        return new DefaultPointcutAdvisor(pointcut, txAdvice());  // (9)
    }
}
  1. AOP 방식으로 트랜잭션을 적용하기 위한 Configuration 클래스 정의
  2. TransactionManager DI
  3. 트랜잭션 어드바이스용 TransactionInterceptor 빈 등록
    1. 트랜잭션 애트리뷰트 지정
    2. 트랜잭션을 적용할 메서드에 트랜잭션 애트리뷰트 매핑
    3. TransactionInterceptor 객체 생성
  4. Advisor 빈 등록
    1. 포인트 컷 지정
    2. Advisor 객체 생성

 

 

📚 심화학습

  • 분산 트랜잭션
  • 다이나믹 프록시
  • 프록시 패턴