본문 바로가기
Programing/Java & Spring

[SPRING3.0] 데이터 엑세스 기술②

by 슈퍼와이비 2013. 9. 4.
반응형

DB사용을 위한 ①DataSource, ②DAO, ③TransactionManager를 등록하였으면

이번엔 트랜잭션의 경계를 설정하는 작업을 해야한다.


트랜잭션의 경계설정방법에는 코드에 의한 방법과 선언적 방법이 존재한다.


그중 선억적 트랜잭션 경계설정 방법에 대해 정리한다.

코드에는 전혀 영향을 주지 않으면서 특정 메소드 실행 전후에 혹은 기존 트랜잭션에 참여하도록 하는 방법이다.


AOP를 이용해서 부가기능을 빈에 적용할 수 있다. 

① 사용할 부가기능 선정 : 트랜잭션 경계설정

② 적용할 대상을 선정 : 서비스계층 비지니스 로직

③ 트랜잭션 속성 설정


1. 트랜잭션 경계설정 부가기능 사용 선언

transaction-manager 속성값은 TransactionManager 빈 오브젝트의 id 이여야 한다.



<bean id="transactionManager" class="...DataSourceTransactionManager">

<property name="dataSource" ref="dataSource" />

</bean>


<tx:advice id="txAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="*" rollback-for="Exception"/>

</tx:attributes>

</tx:advice>



2. 적용할 대상 선정

일반적으로 데이터 엑세스계층보다 서비스계층의 메소드가 트랜잭션의 경계가 되는 것이 자연스럽니다.  하나의 단위 비지니스 로직은 하나의 트랜잭션 안에서 동작해야 하기 떄문이다. 따라서 서비스계층의 메소드가 선정대상이 되야한다.

포인트컷은 기본적으로 인터페이스에 사용된다. 하지만 인터페이스없이 클래스에 적용하려면 기본값을 변경해야 한다. : proxy-target-class="true"



<aop:config proxy-target-class="true">

<aop:pointcut id="txPointcut" expression="execution(* *..MemberDaoImpl.*(..))" />

<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />

</aop:config>


MemberDaoImpl 에 있는 모든 메소드를 선정하여 트랙잭션을 걸어준다.


3. 트랜잭션 속성 설정

모든 트랙잭션이 같은 방식으로 동작하지 않는다. 트랜잭션 경계 설정시 속성을 지정할 수 있다.

<tx:advice id="txAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="..."

    read-only="..."

    isolation="..."

    propagation="..."

    timeout="..."

    rollback-for="..."

    no-rollback-for="..."

/>

</tx:attributes>

</tx:advice>

name 은 메소드의 이름을 설정한다. 예를들어 name="get*" 이면 get으로 시작하는 메소드를 find* 이면 find로 시작하는 메소드를 의미한다.

read-only 는 트랜잭션안에서 쓰기 작업이 일어나는 것을 방지하는 역할을 한다. INSERT, UPDATE, DELETE와 같은 쓰기 작업이 일어나면 예외가 발생한다.

<tx:method name="get*" read-only="true" />

isolation 은 트랜잭션이 진행될때 다른 트랜잭션이 해당 데이터에 접근할 수 있는 수준을 지정한다. 기본적으로 READ_COMMITED를 사용한다.

propagation 은 트랜잭션을 시작하고 기존 트랜잭션에 참여하는 방법을 결정한다. 기본값으로 REQUIRED를 사용하며 미리 시작된 트랜잭션이 있으면 참여하고 없으면 새로 시작한다.

timeout 은 트랜잭션의 제한시간을 지정한다.

rollback-for 는 트랜잭션에서 런타임예외가 발생하면 예외가 발생하고 체크예외가 발생하면 롤백을 하지 않는다. 그런데 체크예외상황에서도 롤백을 발생하려면 해당 옵션을 설정한다.

<tx:method name="get*" rollback-for="Exception" />

no-rollback-for 는 런타임예외를 트랜잭션 커밋대상으로 지정한다.

<tx:method name="get*" no-rollback-for="NoSuchMemberException" />

반응형