코딩항해기

[Spring] springframework 트랜잭션 설정 본문

Spring

[Spring] springframework 트랜잭션 설정

miniBcake 2024. 10. 18. 17:12

 

트랜잭션 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가 필요하므로 먼저 관련 설정을 등록한다.

 

[Spring] 관점 지향 프로그래밍 AOP (xml)

AOP 관점 지향 프로그래밍 Aspect Oriented ProgrammingSpring 프레임워크는 IoC와 AOP을 지원하는 경량의 프레임워크이다. 그 중 AOP는 관점 지향 프로그래밍을 의미하며, 횡단 관심사의 분리를 허용해 모듈

minibcake.tistory.com

    <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)과 함께 트랜잭션 기능 수행 이전으로 자동 롤백되는 것을 확인할 수 있다.