6
Spring Transaction Manager 개요 작성자 : 김진아 사원 작성일 : 2013 년 4 월 30 일 Spring 에서 TransactionManager 란? Spring Framework 를 사용하는 가장 중요한 이유 중 하나는 종합적인 트랜잭션 지원입니다. Spring Framework 는 다음과 같은 이점을 제공합니다. JTA, JDBC, Hibernate, JPA 와 JDO 같은 서로 다른 트랜잭션 API 를 포괄하여 일관된 프로그래밍 모델을 제공합니다. 선언적 트랜잭션 관리를 제공합니다. JTA 같은 복잡한 트랜잭션 API 보다 더 간단한 트랜잭션 관리 API 를 제공합니다. Spring 은 다양한 데이터 접근 추상화와 잘 통합되어 있습니다. Spring-AOP 를 이용하여 Transaction Manager 사용하기 다른 말로는 선언적 트랜잭션 처리라고도 하는데, 복잡하지 않은 경우에는 선언적 트랜잭션을 주로 사용합니다. Spring-AOP 를 이용하여 Transaction Manager 를 사용하는 방법은 다음과 같습니다. 1. Spring 의 Context 파일에 aop 와 tx 에 대한 Namespace 를 정의합니다. 2. <tx:advice>와 <aop:config>를 이용하여 Advice 와 Pointcut 을 정의합니다. Exception 이 발생했을 때, 특정 Exception 에서만 Rollback 하게 할 수도 있고 Rollback 을 하지 않을

Spring Transaction Manager_SYS4U

  • Upload
    sys4u

  • View
    599

  • Download
    9

Embed Size (px)

Citation preview

Page 1: Spring Transaction Manager_SYS4U

Spring Transaction Manager 개요

작성자 : 김진아 사원

작성일 : 2013 년 4 월 30 일

Spring 에서 TransactionManager 란?

Spring Framework 를 사용하는 가장 중요한 이유 중 하나는 종합적인 트랜잭션 지원입니다.

Spring Framework 는 다음과 같은 이점을 제공합니다.

JTA, JDBC, Hibernate, JPA 와 JDO 같은 서로 다른 트랜잭션 API 를 포괄하여 일관된

프로그래밍 모델을 제공합니다.

선언적 트랜잭션 관리를 제공합니다.

JTA 같은 복잡한 트랜잭션 API 보다 더 간단한 트랜잭션 관리 API 를 제공합니다.

Spring 은 다양한 데이터 접근 추상화와 잘 통합되어 있습니다.

Spring-AOP 를 이용하여 Transaction Manager 사용하기

다른 말로는 선언적 트랜잭션 처리라고도 하는데, 복잡하지 않은 경우에는 선언적 트랜잭션을

주로 사용합니다. Spring-AOP 를 이용하여 Transaction Manager 를 사용하는 방법은 다음과

같습니다.

1. Spring 의 Context 파일에 aop 와 tx 에 대한 Namespace 를 정의합니다.

2. <tx:advice>와 <aop:config>를 이용하여 Advice 와 Pointcut 을 정의합니다. Exception 이

발생했을 때, 특정 Exception 에서만 Rollback 하게 할 수도 있고 Rollback 을 하지 않을

Page 2: Spring Transaction Manager_SYS4U

수도 있습니다.

3. 위의 샘플 XML 에서와 같이 트랜잭션 관리를 위해 <tx:advice>의 하위 태그인

<tx:method>에는 다음과 같은 상세 속성 정보를 부여할 수 있습니다.

속성 이름 설명

name 트랜잭션이 적용될 메서드 이름을 명시. “*” 사용 설정이 가능.

propagation 트랜잭션의 전파 규칙을 설정

isolation 트랜잭션의 격리 레벨을 설정

read-only 읽기 전용 여부를 설정

no-rollback-for 트랜잭션을 롤백 하지 않을 예외 타입 설정

rollback-for 트랜잭션을 롤백 할 예외타입을 설정

timeout 트랜잭션의 타입 아웃 시간을 초 단위로 설정

Page 3: Spring Transaction Manager_SYS4U

4. <tx:method> 태그의 propagation 속성에 설정 가능한 값을 다음과 같습니다.

속성 값 설명

REQUIRED(default)

메서드를 수행하는 데 트랜잭션이 필요하다는 것을 의미. 현재

진행 중인 트랜잭션이 존재하면, 해당 트랜잭션을 사용하고

존재하지 않는다면 새로운 트랜잭션 생성

MANDATORY

메서드를 수행하는 데 트랜잭션이 필요하다는 것을 의미.

REQUIRED 와 달리, 진행 중인 트랜잭션이 존재하지 않을 경우

예외를 발생

REQUIRES_NEW

항상 새로운 트랜잭션을 시작. 기존 트랜잭션이 존재하면 기존

트랜잭션을 일시 중지하고 새로운 트랜잭션을 시작. 새로

시작된 트랜잭션이 종료된 뒤에 기존 트랜잭션이 계속 됨

SUPPORTS

메서드가 트랜잭션을 필요로 하지 않지만, 기존 트랜잭션이

존재할 경우 트랜잭션을 사용한다는 것을 의미. 진행 중인

트랜잭션이 존재하지 않더라도 메서드는 정상적으로 동작

NOT_SUPPORTED

메서드가 트랜잭션을 필요로 하지 않음을 의미. SUPPORTS 와

달리 진행 중인 트랜잭션이 존재할 경우 메서드가 실행되는

동안 트랜잭션은 일지 중지되며, 메서드 실행이 종료된 후에

트랜잭션을 계속 진행

NEVER 메서드가 트랜잭션을 필요로 하지 않으며, 만약 진행 중인

트랜잭션이 존재하면 예외를 발생

NESTED

기존 트랜잭션이 존재하면, 기존 트랜잭션에 중첩된

트랜잭션에서 메서드를 실행. 기존 트랜잭션이 존재하지 않으면

REQUIRED 와 동일하게 동작함. 이 기능은 JDBC 3.0 드라이버를

사용할 때에만 적용됨(JTA Provider 가 이 기능을 지원할

경우에도 사용 가능)

5. <tx:method> 태그의 rollback-for 속성과 no-rollback-for 속성을 통한 롤백 처리는 다음과

같습니다.

- rollback-for : 예외 발생시 롤백 작업을 수행할 예외타입을 설정

- no-rollback-for : 예외가 발생하더라도 롤백 하지 않을 예외 타입을 설정

Page 4: Spring Transaction Manager_SYS4U

- 예외 타입이 한 개 이상인 경우 콤마로 구분

- 예외 클래스는 완전한 이름을 입력하거나, 패키지 이름을 제외한 클래스 이름만을

입력

6. <tx:method>태그의 isolation 속성에 설정 가능한 값은 다음과 같습니다.

속성 값 설명

DEFAULT 기본 설정을 사용

READ_UNCOMMITTED 다른 트랜잭션에서 커밋하지 않은 데이터를 읽을 수 있음

READ_COMMITTED 다른 트랜잭션에서 의해 커밋 된 데이터를 읽을 수 있음

REPEATABLE_READ 처음에 읽어 온 데이터와 두 번째 읽어 온 데이터가 동일한

값을 갖는다.

SERIALIZABLE 동일한 데이터에 대해서 동시에 두 개 이상의 트랜잭션이

수행 될 수 없다

@Transactional 을 이용하여 트랜잭션 사용하기

@Transactional 어노테이션을 이용하는 방식은 단순하게 트랜잭션이 필요한 클래스 또는

메소드에 직접 어노테이션을 부여하는 방식으로 설정파일을 이용한 방식보다 훨씬 편리하고,

코드를 이해하기에 좋고, 좀 더 복잡하거나 세부적인 처리를 가능하게 해줍니다. 그렇지만

트랜잭션 적용 대상을 파악하기 힘듭니다.

트랜잭션을 메소드 단위로 적용할 경우에는 유연한 속성 제어는 가능하지만, 코드가

지저분해지고 동일한 속성 정보를 가진 경우 메소드마다 중복되는 결과가 나타납니다.

Spring 에서는 @Transactional 을 적용할 때 4 단계의 대체 정책을 이용하여 정책에 따라

자체적으로 확인해줍니다. 즉, 메소드의 속성을 확인할 때 구현 클래스의 메소드 → 구현클래스

→ Interface 의 선언 메소드 → Interface 순으로 차례로 확인하여 Interface 에 선언되어 있을

경우 그 하위에 다른 설정이 없으면 Interface 에 선언되어 있는 설정을 모두 반영합니다.

@Transactional 사용 방법은 다음과 같습니다.

Page 5: Spring Transaction Manager_SYS4U

1. Spring 의 Context 파일에 tx 에 대한 Namespace 를 정의합니다. (AOP 를 이용하는 방식과

동일)

2. Data Source 와 Transaction Manager, <tx:annotation-driven> 설정합니다.

3. @Transactional 주요 속성은 AOP 에서 정의한 속성과 동일합니다.

4. <tx:annotation-driven> 태그의 속성은 다음과 같습니다.

속성 값 설명 기본값

transaction-manager 사용할 Transaction Manager 빈

의 이름 transactionManager

proxy-target-class

클래스에 대해서 프록시를 생성

할 지의 여부. true일 경우 CGLIB

를 이용해서 프록시를 생성하며,

false인 경우 자바 다이나믹 프록

시를 이용해서 프록시를 생성

false

order advice 적용 순서 int의 최대값(가장 낮은 순위)

5. 클래스에 대한 사용은 다음과 같습니다.

6. 메소드에 대한 사용은 다음과 같습니다.

Page 6: Spring Transaction Manager_SYS4U

참고자료

- http://0px.kr/332

- http://static.springsource.org/spring/docs/2.5.x/reference/transaction.html#tx-

propagation

- http://beerloveshot.tistory.com/99