Spring의 선언적 트랜잭션 관리 기법 중에서 XML 설정 내용을 사용하는 방법을 살펴 봅니다.

다른 방법으로는 어노테이션을 사용하는 방법이 있습니다. 이것은 Spring 트랜잭션 관리가 Spring AOP(그중에서도 Autoproxing)를 사용하고 있기 때문에 Spring AOP를 구현하는 두 가지 방법과 나란히 두 가지 방법을 마련한 것 같습니다.

먼저 트랜잭션 설정을 하기 위한 네임스페이스가 필요합니다. 다음과 같은 XML 설정 탬플릿을 사용하면 됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:p="http://www.springframework.org/schema/p"
       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-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
default-autowire="byName">

//여기에 기타 bean 설정을 넣어 줍니다.

</beans>

그리고 일반 bean들을 등록한 뒤 "트랜잭션 Advice"로 트랜잭션 처리할 메소드의 이름과 트랜잭션 특성을 지정해 주고 "트랜잭션 Advisor"로 방금 만든 Advice와 이 Advice를 적용한 Pointcut을 묶어 줍니다.

    <bean id="memberService" class="com.bookbuying.member.service.MemberServiceImplDeclarativeTransactionManagement">
        <property name="memberDao" ref="memberDao" />
    </bean>

    <bean id="memberDao" class="com.bookbuying.member.dao.MemberDaoImpleWIthSpringTransaction">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="memberServiceOperation"
            expression="execution(* com.bookbuying.member.service.MemberService.*(..))" />
        <aop:advisor advice-ref="txAdvice"
            pointcut-ref="memberServiceOperation" />
    </aop:config>

설정 파일의 내용은 좀 복잡해 졌지만 자바 코드는 매우 깔끔해 졌습니다. 더이상 Business Layer에 전~혀 트랜잭션 관련 코드가 들어있지 않습니다.

    private MemberDao memberDao;

    public void setMemberDao(MemberDao memberDao) {
        this.memberDao = memberDao;
    }

    public void add(Member member) throws SQLException {
        memberDao.add(member);
        //TODO 예외 발생시키기
        TransactionTestingUtil.generateExceptionMethod();
    }

Dao 구현체는 이전에 만들어둔 클래스를 사용하였습니다. 테스트 코드 역시 이전 글들에서 사용한 것을 사용했으며 제대로 동작하는 것을 확인했습니다.