민서네집

Transaction 설정 파일 본문

Spring

Transaction 설정 파일

브라이언7 2013. 7. 5. 15:56

/WebContent/WEB-INF/spring/applicationContext.xml

<?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:beans="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
		http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:lang="http://www.springframework.org/schema/lang" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util">

	<context:property-placeholder location="classpath*:*.properties" />

	<context:component-scan base-package="com.examples.mgmt">
		<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation" />
	</context:component-scan>

	<!-- <tx:annotation-driven /> -->

	<!-- @Transactional 어노테이션에 대한 트랜잭션 처리시 트랜잭션 매니저 txManager 빈으로 등록 -->
 	<tx:annotation-driven transaction-manager="txManager" />
 	<!--

 		트랜잭션의 propagation 설정에 대한 설명

 		예제(별도의 트랜잭션을 사용)
			@Transactional(propagation=Propagation.REQUIRES_NEW)
			public String buildCode(String type, String... args) {
				...
			}

 	- MADATORY
	  : 반드시 트랜잭션 내에서 메소드가 실행되야 함
	  : 트랜잭션이 없는 경우에는 예외 발생

	- NESTED
	  : 트랜잭션에 있는 경우, 기존 트랜잭션 내의 nested transaction 형태로 메소드 실행
	  : nested transaction 자체적으로 commit, rollback 가능
	  : 트랜잭션이 없는 경우, PROPAGATION_REQUIRED 속성으로 행동

	- NEVER
	  : 트랜잭션 컨텍스트가 없이 실행되야 함
	  : 트랜잭션이 있으면 예외 발생

	- NOT_SUPPORTED
	  : 트랜잭션이 없이 메소드 실행
	  : 기존의 트랜잭션이 있는 경우에는 이 트랜잭션을 호출된 메소드가 끝날때까지 잠시 보류
	  : JTATransactionManager를 사용하는 경우에는, TransactionManager가 필요

	- REQUIRED
	  : 트랜잭션 컨텍스트 내에서 메소드가 실행되야 함
	  : 기존 트랜잭션이 있는 경우, 기존 트랜잭션 내에서 실행
	  : 기존 트랜잭션이 없는 경우, 새로운 트랜잭션 생성

	- REQUIRES_NEW
	  : 호출되는 메소드는 자신 만의 트랜잭션을 가지고 실행
	  : 기존의 트랜잭션들은 보류됨
	  : JTATransactionManager를 사용하는 경우에는, TransactionManager가 필요

	- SUPPORTS
	  : 새로운 트랜잭션을 필요로 하지는 않지만, 기존의 트랜잭션이 있는 경우에는 트랜잭션 내에서 실행
 	 -->

 	<!-- DataSource를 활용하는 트랜잭션 매니저를 등록 -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<!-- dataSource 빈을 DataSourceTransactionManager 트랜잭션 매니저의 dataSource 속성에 지정  -->
		<property name="dataSource" ref="dataSource" />
	</bean>

	<!-- AOP advisor 를 활용하여 트랜잭션을 처리함 -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
        	<!--
        		모든 메소드에 대해서 트랜잭션을 활용함
        		기본 propagation 은 REQUIRED 으로 지정됨
        		예외사항의 종류에 따라 롤백을 하지 않는 부분을 지정할 수도 있음
        	-->
            <tx:method name="*"  />
        </tx:attributes>
    </tx:advice>

    <aop:config>
		<!--
			execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
			위와 같은 패턴으로 아래의 경우에는
			하위 패키지 명이 service.impl 이며 이름의 마지막이 ServiceImpl 로 시작되는 모든 클래스의 모든 메소드에
			txAdvice 빈을 사용하여 트랜잭션을 사용하도록 한다.
		 -->
        <aop:advisor pointcut="execution(* *..service.impl.*ServiceImpl.*(..))" advice-ref="txAdvice" />
    </aop:config>

	<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName" value="jdbc/exampleDataSource" />
		<property name="resourceRef" value="true" />
	</bean>

	<!-- transaction manager, use JtaTransactionManager for global tx -->
	<!-- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean> -->

	<!-- define the SqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="typeAliasesPackage" value="com.examples.mgmt" />
	</bean>

	<!-- scan for mappers and let them be autowired -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.examples.mgmt" />
		<property name="annotationClass" value="org.springframework.stereotype.Repository"/>
	</bean>

	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basenames">
			<list>
				<value>message</value>
	            <!-- <value>Messages</value> -->
			</list>
		</property>
	</bean>

	<bean id="msgSrcAccessor" class="org.springframework.context.support.MessageSourceAccessor">
		<constructor-arg ref="messageSource" />
	</bean>

    <!-- Only needed because we require fileupload in the org.springframework.samples.mvc.fileupload package -->
	<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

</beans>


Default Transaction(REQUIRED) 말고, 다른 트랜잭션을 걸고 싶은 경우는 Service 메서드 위에

@Transactional(propagation = Propagation.REQUIRES_NEW)

라고 특정 Transaction 속성을 넣어준다.


그러면 Service 내의 모든 메서드는 @Transactional 어노테이션 없이도, 기본 트랜잭션(REQUIRED) 가 적용되고, 어노테이션이 붙은 서비스의 메서드의 경우는 그 어노테이션에 해당하는 트랜잭션이 적용된다.


Comments