요르딩딩

[Spring 분석] Transaction이란 본문

[Web]/[Spring]

[Spring 분석] Transaction이란

요르딩딩 2021. 4. 21. 10:55
728x90
반응형
Transaction이란
:
여러개의 쿼리를 하나의 connnetion으로 묶어 DB에 전송하고,
  이 과정에서 에러가 발생할 경우 자동으로 모든과정을 원래대로 되돌려놓습니다.(모두 RollBack)

Spring이 제공하는 Transaction Template Class를 이용하거나  설정파일, 어노테이션을 이용해서 트랜잭션의 범위 및 규칙을 정의할 수 있습니다. 

 

Spring에서는 주로 선언적 트랜잭션을 이용합니다.

 <tx:advice>태그 또는 @Transactional 어노테이션을 이용하는데, 퀴리문을 처리하는 과정에서 에러가 났을 경우 자동으로 모두 Rollback 처리를 해줍니다.

 

아래의 예시는 Service 인터페이스 부분입니다.

일반적으로 Spring에서는 Service Layer에서 @Transactional 을 추가하여 Transaction 처리를 합니다. 

public interface companyService  extends JhService {



@Transactional

JhResult insertCompany(HashMap<String, Object> param);

}

 

참고: mangkyu.tistory.com/50?category=761302

 

context-transaction.xml에 <tx:advice> 태그 사용시 주의사항

expresson의 경로를 제대로 설정해 주지않으면 Jenkins에서 오류 발생하므로 주의해야합니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">

    <!-- transaction 설정 -->
    <!-- mysql core -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!-- <tx:annotation-driven transaction-manager="txManager"/> -->
   
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
        </tx:attributes>
    </tx:advice>
    
    <tx:advice id="noTxAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="*Tx" propagation="NOT_SUPPORTED" rollback-for="Exception"/>
        </tx:attributes>
    </tx:advice>

    <!-- expresson의 경로를 제대로 설정해 주지않으면 Jenkins에서 오류 발생함 -->
    <aop:config>
        <aop:pointcut id="requiredTx" expression="execution(public * com.project.controller.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
    </aop:config>
    
    <!-- expresson의 경로를 제대로 설정해 주지않으면 Jenkins에서 오류 발생함 -->
    <aop:config>
        <aop:pointcut id="notRequiredTx" expression="execution(public * com.project.mapper.*.*(..))"/>
        <aop:advisor advice-ref="noTxAdvice" pointcut-ref="notRequiredTx" />
    </aop:config>
	
</beans>

 

+) 혹시 transaction 어노테이션을 활용한 방법이 잘 실행되지 않을때는 

dispatcher-servlet의 component-scan에 controller만 (나머지는 exclude)

context-common의 component-scan에 나머지를 읽도록 (controller exclude))수정해보자

728x90
반응형
Comments