day70) [AOP] 횡단관심 - 트랜잭션
[트랜잭션이란(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)