Spring

[Spring] 스프링 AOP를 이용해 트랜잭션(transaction) 처리하기

dev.mk 2022. 6. 27. 16:53
반응형

필자의 스프링 버전

<properties>
    <java-version>1.8</java-version>
    <org.springframework-version>4.3.4.RELEASE</org.springframework-version>
	<spring.security.version>4.2.3.RELEASE</spring.security.version>
	<org.aspectj-version>1.6.10</org.aspectj-version>
	<org.slf4j-version>1.6.6</org.slf4j-version>
    <org.apache.tiles-version>3.0.8</org.apache.tiles-version>
</properties>

 

 

pom.xml 의존성 추가

<!-- AOP lib -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

<!-- 트랜잭션 처리 lib -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

aop와 트랜잭션을 사용하기 위해 pom.xml에 추가한다.

 

 

context-transaction.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:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
						http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
						http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
						
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>

	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="*" rollback-for="Exception"/>
		</tx:attributes>
	</tx:advice>
	
	<aop:config>
        <aop:pointcut id="requiredTx" expression="execution(* com.spring.app..service..*ServiceImpl.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx"/>
	</aop:config>
	
</beans>

 

aop의 포인트컷 설정으로 ServiceImpl.java로 끝나는 자바파일에 트랜잭션을 설정한다.

bean id txManager의 dataSource는 데이터베이스가 연결설정을 하는 context xml파일내의 bean id다.

web.xml 의 contextConfigLocation가 Load할 수 있는 경로에 있어야한다.  

ex) <param-value>classpath*:spring/context-*.xml</param-value>

 

테스트로 TestServiceImpl.java 파일이 트랙잰션의 대상이다.

 

TestServiceImpl.java 의 내용

@Service
public class TestServiceImpl implements TestService {

	@Autowired
	TestDao testDao;
	
	public void insertTest(TestVo testVo) throws Exception {
		//트랜잭션 테스트, insertNull로 고의적인 에러를 발생시킨다. 크러면 첫번째 인서트문이 롤백된다.
		testDao.insertTest(testVo);
		testDao.insertNull();
	}
}

insertTest();는 정상적인 인서트문이고

insertNull();는 고의적으로 에러를 발생하는 인서트문이다.

 

insertTest 메소드를 실행시 Exception발생으로 트랜잭션이 걸리고 Rollback이 된다.

반응형