Spring/Spring

day70) [AOP] 횡단관심 - 트랜잭션

code_learner 2022. 4. 8. 20:33

[트랜잭션이란(Transaction)]

-작업의 단위

ex) 결제 시스템에서 여러 테이블에서 데이터를 입출력하는 과정중 어느 한 가지 과정에서라도 에러 또는 예외 사항이 발생하면 모든 데이터를 롤백해줘야 한다 -> 트랜잭션!

-트랜잭션자체가 횡단관심이기 때문에 AOP와 관련이 깊다.

 

-로그를 횡단관심으로 처리 할때는 xml과 @둘다 등록이 가능하다.

https://code-learning.tistory.com/110

 

day67)[AOP] - 횡단관심: 로깅 처리하기2

https://code-learning.tistory.com/109 day66) [AOP] - 로깅 처리하기1 [AOP] - 관점 지향 프로그래밍 (때가 되면 알아서 동작할 수 있게 만든다) - 공통로직을 분리하기 위해 공통 로직과 (횡단 관심) +..

code-learning.tistory.com

-하지만 '트랜젝션 처리'는 xml설정파일으로만 사용가능하다.

  : spring에서 기본제공하는 클래스를 사용하기 때문에 클래스파일을 직접 생성하지 않는다.

  -> 클래스명, 메서드명을 알 수 없으므로 연결방식이 따로 있다.

 

 


[트랜젝션 처리 순서]

1) applicationContext의 namespaces에 tx추가

2) 트랜잭션 관리자 클래스 등록

JDBC/MyBatis/JPA등 어떤 방식으로 DB연동을 하는가에 따라 관리자 클래스가 달라진다.이번 포스팅은 JDBC를 사용할 것이므로 DataSourceTransactionManager 클래스를 사용할 것이다.

	<!-- applicationContext.xml : 트랜잭션 관리자 클래스 등록 -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" /><!-- 각종 db관련 리소스 객체 -->
	</bean>
    
    
    <!-- DataSource 설정 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<!-- destroy-method="close": 연결해제 메서드 -->
		<!-- setter injection -->
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
		<property name="username" value="kim" />
		<property name="password" value="1234" />
	</bean>

 

3) 1.어떤 비즈니스메서드에 대해(언제) 2.무슨 공통로직을 수행할지(무엇을) 설정

1. get으로 시작하는 메서드(select류)는 트랜잭션을 적용하지 않고, 참조만 하도록 read-only="true" 설정

   나머지 메서드들은 트랜잭션을 적용.

	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true"/>
			<tx:method name="*" />
		</tx:attributes>
	</tx:advice>

2. 설정한 클래스 결합처리

<aop:config>
	<aop:pointcut expression="execution(* com.test.app..*(..))" id="txPointcut"/>
	<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>

사용자가 직접 만들어낸 클래스명, 메서드명이 아니라서 이름을 직접적으로 알지 못하는 상태라면
 <aop: advisor> 를 사용한다. <-> <aop:aspect>

 

동작과정

클라이언트 -> Service를 이용(insert) -> 핵심관심 수행 -> 문제발생 -> 트랜잭션관리자가 메서드 호출(rollback)