티스토리 뷰

Spring (Springboot) 에서는 선언적 Transaction 관리를 한다. 이는 비즈니스 로직에 트랜잭션 로직을 심는것이 아닌 설정이나 어노테이션으로 간편하게 트랜잭션을 정의하는것을 말한다. 이렇게 트랜잭션 정의를 할때 timeout은 어떻게 설정하는지 알아보자. Transaction에서의 timeout은 지정한 시간 내에 해당 메소드 수행이 완료되지 않은 경우 rollback 수행하는것을 말한다. 참고로 Spring의 default timeout은 -1 이다. (timeout 무제한)


전역 timeout 설정 (application.yml or application.properties)

spring:
  transaction:
    default-timeout: 10

이렇게 spring.transaction.default-timeout 설정으로 default-timeout을 설정할 수 있다. (단위 : 초) 

즉 이렇게 설정을 해놓으면 무슨 로직이든 transaction을 타게 된다면 10초가 넘어가면 transaction 처리가 되지 않고 rollback이 수행되는것을 볼 수 있다. 


지역 timeout 설정 (@Transactional or Java Config or Xml Config)

보통은 transaction timeout을 걸때 특정한 업무에 대해서만 제한시간을 두는 경우가 많다. 이럴 경우에는 전역 설정보다는 지역 설정으로 timeout을 컨트롤하는것이 맞다. 

 

가장 transaction을 걸때 많이 사용하는 @Transactional 에 timeout을 설정하는 방법에 대해 알아보자. 

Property Type Description
value String Optional qualifier specifying the transaction manager to be used.
propagation enum: Propagation Optional propagation setting.
isolation enum: Isolation Optional isolation level.
readOnly boolean Read/write vs. read-only transaction
timeout int (in seconds granularity) Transaction timeout.
rollbackFor Array of Class objects, which must be derived from Throwable. Optional array of exception classes that must cause rollback.
rollbackForClassName Array of class names. Classes must be derived from Throwable. Optional array of names of exception classes that must cause rollback.
noRollbackFor Array of Class objects, which must be derived from Throwable. Optional array of exception classes that must not cause rollback.
noRollbackForClassName Array of String class names, which must be derived from Throwable. Optional array of names of exception classes that must not cause rollback.

@Transactional 에는 위와 같은 property 값을 넣어서 사용할 수 있다. 이중 timeout 옵션도 있다. 

@Transactional(timeout = 2)

위와 같은 방법으로 간단하게 timeout을 설정할 수 있다. 

 

 

두번째 방법으로는 모든 서비스 메소드에 @Transactional을 설정하지 않고 Java Config로 transaction을 관리할때 timeout을 설정하는 방법이다. 예를 들면 TransactionConfig라는 클래스에서 transaction을 관리한다고 하면

@Bean
public TransactionInterceptor txAdvice() {
    TransactionInterceptor txAdvice = new TransactionInterceptor();
    Properties txAttributes = new Properties();
    List<RollbackRuleAttribute> rollbackRules = new ArrayList<RollbackRuleAttribute>();
    rollbackRules.add(new RollbackRuleAttribute(Exception.class));
    
    DefaultTransactionAttribute readOnlyAttribute = new DefaultTransactionAttribute(
            TransactionDefinition.PROPAGATION_SUPPORTS);
    readOnlyAttribute.setReadOnly(true);
    readOnlyAttribute.setTimeout(10);
    
    RuleBasedTransactionAttribute writeAttribute = new RuleBasedTransactionAttribute(
            TransactionDefinition.PROPAGATION_REQUIRED, rollbackRules);
    writeAttribute.setTimeout(10);
    
    String readOnlyTransactionAttributesDefinition = readOnlyAttribute.toString();
    String writeTransactionAttributesDefinition = writeAttribute.toString();

    txAttributes.setProperty("create*", writeTransactionAttributesDefinition);
    txAttributes.setProperty("*", readOnlyTransactionAttributesDefinition);

    txAdvice.setTransactionAttributes(txAttributes);
    txAdvice.setTransactionManager(transactionManager());
    return txAdvice;
}

@Bean
public Advisor txAdviceAdvisor() {
    AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
    pointcut.setExpression("execution(* *..service.*Service.*(..))");
    return new DefaultPointcutAdvisor(pointcut, txAdvice());
}

이런식으로 txAdvice에 txAttributes를 통해 timeout을 세팅할 수 있다. (11line, 15line) 물론 이 방법대로 하면 특수한 경우에는 timeout 설정을 늘리고 싶으면 그에 맞는 규칙도 정의해서 넣어줘야 하고 그에 따라 timeout 설정도 따로 해줘야 한다. 번거롭지만 transaction timeout을 막 여기저기 많이 설정하고 그런 경우는 거의 없으니까..

 

 

세번째는 xml config 로 transaction을 설정했을 때 timeout을 거는 방법이다. 

<tx:advice id="txAdvice" transaction-manager="transactionManager"> 
  <tx:attributes> 
    <tx:method name="get*" read-only="true" timeout=10 /> 
    <tx:method name="delete*" /> 
  </tx:attributes> 
</tx:advice> 

<aop:config> 
  <aop:pointcut id="transactionPointcut" expression="execution(* *..service.*Service.*(..))"/> 
  <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut" /> 
</aop:config>

이것도 Java Config와 마찬가지로 txAttributes를 통해 timeout을 설정한다. tx:method 부분에 정의하면 된다. 

 

이정도만 알아도 Spring에서 transaction 처리시 timeout을 설정하는 것은 문제 없이 할수 있을것이다. 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31