스트럿츠 사이트에 가면 사람들의 사고를 굳게 하는 보기 프로그램이 하나 있습니다. getConnectioin() 메소드로 디비 연결 객체를 가져와 뭔가 작업을 하고 커밋을 하는 아주 간단한 예제입니다.
많은 사람들이 그 예제에서 출발합니다. 물론 저도 그랬습니다. :)
서비스 객체간 트랜잭션을 처리하는 경우엔 콘트롤러에서 받아온 연결 객체를 서비스(Service, Manager, Bo 등등) 객체로 넘깁니다. 서비스 객체는 넘겨 받은 연결 객체를 이용해서 데이터를 처리합니다. 당연히 서비스 객체간 트랜잭션 관리는 콘트롤러에서 담당합니다.
데이터접근객체(DAO)간에만 트랜잭션 관리를 하는 경우엔 굳이 콘트롤러에서 커넥션을 만들 필요도 서비스에 넘길 필요도 없습니다. 서비스 객체에서 데이터 연결 객체를 만들고 트랜잭션 관리까지 다 맡으면 됩니다.
콘트롤러와 서비스 객체는 상황에 따라 트랜잭션 관리 코드가 들어가기도 하고 안들어가기도 하고 디비 연결 객체를 가져오기도 하고 안 가져오기도 하고. 일관성이 없습니다. (지저분합니다. AOP에서 말하는 횡단관심사이죠)
이런 상황은 정말 빈번하고 아주 아주 일반적인 상황입니다. 이런 경우(빈번하고 일반적인 상황)엔 대게 이미 솔루션이 있습니다. ^^
스프링 프레임워크에선 아래와 같은 설정만으로 아주 쉽게 트랜잭션 관리를 할 수 있습니다.
1. xml 파일에 아래 정보를 등록합니다.
2. 원하는 클래스나 메소드 앞에 “@Transactional”을 붙이면 그것으로 충분합니다.<aop:aspectj-autoproxy/>
<bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource” destroy-method=”close”
p:driverClassName=”${jdbc.driverClassName}”
p:url=”${jdbc.url}”
p:username=”${jdbc.username}”
p:password=”${jdbc.password}”
p:defaultAutoCommit=”false”/><bean id=”txManager” class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”
p:dataSource-ref=”dataSource”/><tx:annotation-driven transaction-manager=”txManager”/>
@Transactional
public class BlogServiceImpl
간단하죠?
스프링은 AOP 기술과 애노테이션을 이용하여 아주 쉽게 트랜잭션을 지원합니다. 물론 애노테이션을 지원하지 않는 JDK1.4에서도 다른 방법을 이용하여 위와 버금가는 방법으로 쉽게 트랜잭션을 관리할 수 있습니다.
‘봄’이 완연하다못해 더운 계절입니다. :-) 왜 아직도 스프링을 쓰지 않으시는지요? ^^
