코딩항해기
[Spring] springframework 트랜잭션 설정 본문
트랜잭션 Transaction
데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 기능의 단위 혹은 일련의 연산을 칭한다.
관계형 데이터베이스에서 하나의 작업 또는 밀접하게 연관되어 있는 작업 수행을 위해 나눌 수 없는 최소 수행 단위를 트랜잭션이라고 한다. 중간에 서비스가 제대로 처리되지 않는다면 수행 이전으로 돌아가는 롤백이 있다.
트랜잭션 또한 종단 기능 사이에 횡단으로 사용되는 기능이므로 Advice를 활용한다.
의존 주입 (dependency)
connection 객체를 활용하므로 DataSource를 제공하는 의존성과 AOP를 사용할 수 있도록 도와주는 의존성을 주입해야한다.
<!--AOP-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<!--JDBCTemplate-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!---->
이제 루트 컨테이너 xml에서 루트 앨리먼트에 스키마를 추가할 수 있게 된다.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
</beans>
스키마까지 선언하고 나면 DataSource 객체와 TransactionManager 객체를 불러올 수 있게 되며, aop 태그를 사용할 수 있다. (advisor사용)
먼저 DataSource 객체를 등록한다.
<bean class="org.apache.commons.dbcp.BasicDataSource" id="ds" destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/minibcake" />
<property name="username" value="root" />
<property name="password" value="1234" />
</bean>
이 DataSource 객체에 의존하는 TransactionManager 객체를 등록한다.
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="txManager">
<property name="dataSource" ref="ds"/>
</bean>
등록한 TransctionManager 객체가 어느 곳에서 트랜잭션 처리를 할지 설정해야하는데, 이 때 advice가 필요하므로 먼저 관련 설정을 등록한다.
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.koreait.app.biz..*Impl.*(..))"/>
<!--스프링에서 제공하는 걸 사용할 때는 advisor를 사용-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
이제 이 Advice를 사용해 TransctionManager의 설정을 등록할 수 있다. 이 때 주의할 점은 spring에서 제공하는 advice를 사용하기 때문에 직접 만들 때 사용했던 aspect가 아닌 advisor를 사용한다.
<tx:advice transaction-manager="txManager" id="txAdvice">
<tx:attributes>
<!--select 류는 트랜잭션처리하지 말고 읽기만으로 설정(생략처리)-->
<tx:method name="select*" read-only="true"/>
<!--모든 메서드 수행이 기본-->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
read-only 속성에 true를 주면 해당 method는 트랜잭션으로 묶이지 않는다.
이제 트랜잭션 처리된 Service에서 작업 중 문제가 발생한다면 예외 발생(500)과 함께 트랜잭션 기능 수행 이전으로 자동 롤백되는 것을 확인할 수 있다.
'Spring' 카테고리의 다른 글
[Spring] AOP @Order 실행 우선 순위 설정 (0) | 2024.10.20 |
---|---|
[Spring] AOP @AfterThrowing (0) | 2024.10.20 |
[Spring] 템플릿 패턴 : JDBCTemplate 적용 (DAO 고도화) (0) | 2024.10.18 |
[Spring] 관점 지향 프로그래밍 AOP (@어노테이션) (0) | 2024.10.16 |
[Spring] AOP의 JoinPoint (0) | 2024.10.15 |