■ 스프링의 트랜잭션 지원
● 스프링은 코드 기반의 트랜잭션 처리(Programmatic Transaction) 뿐만 아니라 선언적 트랜잭션(Declarative Transaction)을 지원하고 있다. 스프링이 제공하는 트랜잭션 템플릿 클래스를 이용하거나 설정 파일, 어노테이션을 이용해서 트랜잭션의 범위 및 규칙을 정의할 수 있다.
■ 선언적 트랜잭션 처리
● 선언적 트랜잭션은 설정 파일이나 어노테이션을 이용해서 트랜잭션의 범위, 롤백 규칙 등을 정의
● 다음과 같은 2가지 방식으로 정의
▶ <tx:advice> 태그를 이용한 트랜잭션 처리
▶ @Transactional 어노테이션을 이용한 트랜잭션 설정
◆ <tx:advice> 태그를 이용한 트랜잭션 처리
● tx 네임스페이스를 추가 후 다음과 같은 형태로 작성
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
<!-- 1. dataSource 생성 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager"> |
● <tx:advice> : 트랜잭션을 적용할 때 사용될 Advisor를 생성
▶ id 속성은 생성될 트랜잭션 Advisor의 식별 값, transaction-manager 속성에는 스프링의 PlatformTransactionManager 빈을 설정
▶ <tx:advice> 태그는 Advisor만 생성하는 것이지 실제로 트랜잭션을 적용하는 것이 아니므로 AOP를 통해서 설정해야 함(기본적으로 AOP를 알아야 함)
● <tx:method> : <tx:attributes> 태그의 자식 태그로 트랜잭션을 설정할 메서드 및 트랜잭션 속성을 설정
▶ <tx:method> 태그의 속성
속성 이름 |
설 명 |
name |
트랜잭션이 적용될 메서드 이름을 명시. '*' 사용 설정이 가능함 |
propagation |
트랜잭션의 전파 규칙을 설정 |
isolation |
트랜잭션의 격리 레벨을 설정 |
read-only |
읽기 전용 여부를 설정 |
no-rollback-for |
트랜잭션을 롤백하지 않을 예외 타입을 설정 |
rollback-for |
트랜잭션을 롤백할 예외 타입을 설정 |
timeout |
트랜잭션의 타임 아웃 시간을 초 단위로 설정 |
● <tx:method> 태그의 propagation 속성과 전파 규칙 - 트랜잭션의 전파 규칙을 정의
▶ <tx:method> 태그의 propagation 속성에 설정 가능한 값
속성 값 |
설 명 |
REQUIRED (default) |
메서드를 수행하는 데 트랜잭션이 필요하다는 것을 의미. 현재 진행 중인 트랜잭션이 존재하면, 해당 트랜잭션을 사용-존재하지 않는다면 새로운 트랜잭션을 생성 |
MANDATORY |
메서드를 수행하는 데 트랜잭션이 필요하다는 것을 의미. REQUIRED와 달리, 진행 중인 트랜잭션이 존재하지 않을 경우 예외를 발생 |
REQUIRES_NEW |
항상 새로운 트랜잭션을 시작. 기존 트랜잭션이 존재하면 기존 트랜잭션을 일시 중지하고 새로운 트랜잭션을 시작. 새로 시작된 트랜잭션이 종료된 뒤에 기존 트랜잭션이 계속됨 |
SUPPORTS | 메서드가 트랜잭션을 필요로 하지는 않지만, 기존 트랜잭션이 존재할 경우 트랜잭션을 사용한다는 것을 의미. 진행 중인 트랜잭션이 존재하지 않더라도 메서드는 정상적으로 동작 |
NOT_SUPPORTED | 메서드가 트랜잭션을 필요로 하지 않음을 의미. SUPPORTS와 달리 진행 중인 트랜잭션이 존재할 경우 메서드가 실행되는 동안 트랜잭션은 일시 중지되며, 메서드 실행이 종료된 후에 트랜잭션을 계속 진행 |
NEVER | 메서드가 트랜잭션을 필요로 하지 않으며, 만약 진행 중인 트랜잭션이 존재하면 예외를 발생 |
NESTED |
기존 트랜잭션이 존재하면, 기존 트랜잭션에 중첩된 트랜잭션에서 메서드를 실행. 기존 트랜잭션이 존재하지 않으면 REQUIRED와 동일하게 동작함. 이 기능은 JDBC 3.0 드라이버를 사용할 때에만 적용됨(JTA Provider가 이 기능을 지원할 경우에도 사용 가능함) |
선언적 트랜잭션을 하는 경우 별도 처리가 필요하지 않다면 기본값인 "REQUIRED"를 트랜잭션 전파 규칙으로 사용
● <tx:method> 태그의 rollback-for 속성과 no-rollback-for 속성을 통한 롤백 처리
▶ rollback-for : 예외 발생시 롤백 작업을 수행할 예외 타입을 설정
▶ no-rollback-for : 예외가 발생하더라도 롤백 하지 않을 예외 타입을 설정
▶ 예외 타입이 한 개 이상인 경우 콤마로 구분
▶ 예외 클래스는 완전한 이름을 입력하거나, 패키지 이름을 제외한 클래스 이름만을 입력
<tx:method name="regist" rollback-for="Exception" no-rollback-for="MemberNotFoundException"/> |
Exception 및 하위 타입의 예외가 발생할 경우 롤백 작업을 수행하고, MemberNotFoundException이 발생하는 경우에는 롤백 작업을 수행하지 않음.
※ 스프링은 예외 발생시 좀더 정확하게 매칭되는 타입을 기준으로 롤백 규칙을 적용하기 때문에 MemberNotFoundException이 Exception 클래스를 상속 받았다고 하더라도 MemberNotFoundException이 발생하면 롤백을 수행하지 않게 됨
● <tx:method> 태그의 isolation 속성과 트랜잭션 격리 레벨
▶ isolation 속성에 설정 가능한 값
속성 값 |
설 명 |
DEFAULT |
기본 설정을 사용 |
READ_UNCOMMITTED |
다른 트랜잭션에서 커밋하지 않은 데이터를 읽을 수 있음 |
READ_COMMITTED | 다른 트랜잭션에서 의해 커밋된 데이터를 읽을 수 있음 |
REPEATABLE_READ | 처음에 읽어 온 데이터와 두 번째 읽어 온 데이터가 동일한 값을 갖는다 |
SERIALIZABLE |
동일한 데이터에 대해서 동시에 두 개 이상의 트랜잭션이 수행될 수 없다 |
[참고자료] Spring 3.0 프로그래밍-최범균
'프로그램 > Spring 3.0' 카테고리의 다른 글
[예제-1] 선언적 트랜잭션 - <tx:advice>, AOP, @Aspect (0) | 2012.05.25 |
---|---|
스프링의 트랜잭션 관리 - 선언적 트랜잭션(@Transactional) (1) | 2012.05.25 |
[예제] 게시판 상세보기 샘플소스(@Autowired, @Component, @Aspect 적용) (0) | 2012.05.24 |
[예제] 게시판 상세보기 샘플소스(@Autowired, @Component, @Controller, aop 태그 적용) (0) | 2012.05.24 |
커스텀 View - JSON 응답(MappingJacksonJsonView) (0) | 2012.05.23 |