CP/WEB

[Spring] 트랜잭션 속성

효니K 2019. 4. 25. 02:52
반응형

안녕하세요

효니k DB의 효니k입니다.

오늘은 

[토비의 스프링 3.1]

6.6 트랜잭션 속성 부분을 정리해보겠습니다.

교재의 페이지와 순서를 참고하였으니, 교재가 있으신 분들께서는 교재를 보면서 정리하는 것을 추천드립니다!^^

 

p.512

(6.6) 트랜잭션 속성

 

모든 트랜잭션이 같은 방식으로 동작하는 것은 아니다.

더이상 쪼갤수 없는 최소 단위의 작업이라는 개념을 베이스로 약간의 차이점들이 있다.

스프링은 트랜잭션의 경계를 설정할 4가지 트랜잭션 속성을 지정할 있다.

1)트랜잭션 전파 2)격리수준 3)제한시간 4)읽기전용

 

1)트랜잭션 전파(propagation)

: 트랜잭션의 경계에서 이미 진행중인 트랜잭션이 있을 또는 없을 어떻게 동작할 인가를 결정하는 방식이다.

 

트랜잭션의 경계의 시작지점에서 트랜잭션 전파 속성을 참조해서 해당 범위의 트랜잭션을 어떤 식으로 진행시킬지 결정할 있다.

 

스프링이 지원하는 트랜잭션 전파 속성은  6가지가 있다.

대표적으로 책에서 나온 3가지를 살펴보면 아래와 같다.

 

-required

: 가장 많이 사용되는 트랜잭션 전파 속성으로, 진행 중인 트랜잭션이 없으면 새로 시작하고, 이미 시작된 트랜잭션이 있으면 이에 참여한다.

 

-requires_new

: 앞에서 시작된 트랜잭션이 있든 없든 새로운 트랜잭션을 만들어서 동작한다.

, 항상 새로운 트랜잭션을 시작한다.

 

-not supported

: 트랜잭션을 무시하는 속성이다. 트랜잭션 없이 동작하도록 만드는 속성이다.

* 트랜잭션 없이 사용할거면서 경계설정을 하는 이유 -> 한번에 많은 메소드가 동시에 실행되는데 특정 메소드만 AOP적용에서 제외하고 싶을

 

2)격리수준(isolation level)

: 동시에 여러 트랜잭션이 진행될 때에 격리 수준을 적절하게 조정해서 가능한 많은 트랜잭션을 동시에 진행시킬 있도록 제어하기 위한 것이다.

 

3)제한시간(timeout)

: 트랜잭션에 제한시간을 지정할 있고 값은 단위로 지정한다.

 

4)읽기전용(read only)

:트랜잭션 내에서 데이터를 조작하는 시도를 막아줄 있고, 데이터 엑세스 기술에 따라 성능이 향상될 수도 있다.

 

p.516

(6.6.2) 트랜잭션 인터셉터와 트랜잭션 속성

 

메소드별로 트랜잭션을 다르게 적용하기 위해서는 어드바이스의 기능을 확장하여 메소드 이름 패턴에 따라 다른 트랜잭션 정의가 적용되도록 만든다.

 

1)TransactionInterceptor

 

이미 스프링에는 편리하게 트랜잭션 경계설정 어드바이스로 사용하도록 만들어진 transactionInterceptor 존재한다. 기존까지 사용해온 transactionAdvice 어드바이스의 동작원리를 알아보려고 만들었던 것이므로 이제는 TransactionInterceptor 사용하자.

TransactionInterceptor PlatformTransactionManager Properties타입의 두가지의 프로퍼티를 갖고있다.

 

 Properties 타입은 번째 프로퍼티 이름은 transactionAttributes, 트랜잭션 속성을 정의한 프로퍼티다. TransactionDefinition 가지 기본 항목에 rollbackOn()이라는 메소드를 하나 갖고 있는 TransactionAttribute 인터페이스로 정의된다.

 

TransactionAdvice RuntimeException 발생하는 경우에만 트랜잭션을 롤백시킨다.

그렇다면 런타임 예외 이외의 모든 예외에서 트랜잭션 rollback 시켜야 할까?

-> NO. 

비즈니스 로직상의 예외 경우를 나타내기 위해 타깃 오브젝트가 체크 예외를 던지는 경우에는 DB 트랜잭션은 커밋시켜야 하기 때문이다. 스프링의 기본적인 예외처리 원칙에 따라 비즈니스적인 의미가 있는 예외상황에만 체크 예외를 사용하고, 외의 모든 복구 불가능한 순수한 예외의 경우는 런타임 예외로 포장돼서 전달한다.

그런데 TransactionInterceptor 이러한 예외처리 따르지 않고 TrasactionAttribute rollbackOn()이라는 속성을 둬서 기본 원칙과 다른 예외처리가 가능하도록 해준다.

 

2)메소드 이름 패턴을 이용한 트랜잭션 속성 지정

 

properties 타입의 transactionAttributes 프로퍼티는 메소드 패턴과 트랜잭션 속성을 key , value값으로 갖는 컬랙션이다. 트랜잭션 속성은 다음과같이 문자열로 정의한다.

 

⁃PROPAGATION_NAME : 트랜잭션 전파 방식, 필수항목이다. PROPAGATION_으로 시작한다.

⁃ISOLATION_NAME : 격리수준, ISOLATION_으로 시작한다. 생략 가능하고 생략하면 디폴트 격리 수준으로 지정된다.

⁃readOnly : 읽기전용 항목. 디폴트는 읽기전용이 아니다. 생략 가능

⁃timeout_NNNN : 제한시간, timeout_으로 시작하고 단위 시간을 뒤에 붙인다. 생략 가능

  -Exception1 : 체크 예외 중에서 롤백 대상으로 추가할 것을 넣는다. 이상을 등록 가능

  +Exception2 : 런타임 예외지만 롤백시키지 않을 예외들을 넣는다. 이상 등록 가능

 

중에서 전파 항목만 필수이고, 나머지는 생략 가능하며, 생략가능한 부분을 모두 생략하면, DefaultTransactionDefinition 설정된 디폴트 속성이 부여된다. 모든 항목이 구분되기 때문에 순서는 상관없다.

+ 또는 - 시작하는 기본 원칙을 따르지 않는 예외를 정의해주는 것이다.

모든 런타임 예외는 롤백돼야 하지만 +XXXRuntimeException이라고 해주면 런타임 예외라도 커밋하게 만들 있다.

체크 예외는 모두 커밋하는 것이 기본 처리 방식이지만 - 붙여서 넣어주면 트랜잭션은 롤백 대상이 된다.

이렇게 하면 대부분은 디폴트를 사용해도 충분하므로 편리해 진다.

 

3)tx  네임스페이스를 이용한 설정 방법

 

tx스키마의 전용 태그를 이용해 transactionInterceptor타입의 어드바이스 빈과 transactionAttribute 타입의 속성정보를 정의할 수 있다.

“리스트6-72”에서

1> xmlns:tx=“….” 를 통해 tx네임스페이스를 선언하고

2> tx스키마 위치를 지정해주고

3>tx스키마의 advice 태그를 통해 트랜잭션 부가기능을 담은 어드바이스를 정의하면된다.

이때, 트랜잭션 속성은 메소드 단위로 다르게 지정이 가능하다.

반응형