Spring-JSP

[Spring-JSP] Transaction 전파 속성

Jeong Jeon
반응형

우선 트랜젝션이 뭔지 먼저 간략하게 확인하고 가자.

 

1. 트랜잭션(Transaction)이란?

트랜잭션은 작업의 완전성 을 보장해주는 것.

작업을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우, 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능이다.

하지만 트랜젝션에서 세밀하게 보면 몇가지 전파옵션이 있다는것을 알아야한다.

 

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

추가적으로 선언적 트랜잭션에서는 롤백/커밋 기준을 변경하기 위해 두 가지 추가 속성을 지정할 수 있다.

 

2. SpringFramework의 트랜잭션 전파 속성

2개 이상의 트랜잭션이 작동할 때, 기존의 트랜잭션에 적용되는 방법을 설정한다.

 

1). REQUIRED 

  • DEFAULT : 전체 처리 =>  디폴트 속성.

모든 트랜잭션 매니저가 지원하며, 보통 이속성으로 사용하여 처리한다.

이미 시작된 트랜잭션이 있으면 참여하고 없으면 새로 시작한다. => 한 트랜잭션이 시작된 후, 다른 트랜잭션 경계가 설정된 메소드를 호출하면 자연스럽게 같은 트랜잭션으로 묶인다.

 

2). SUPPORTS

  • 기존 트랜잭션에 의존 => 이미 시작된 트랜젝션이 있고 없고에 따라 다르다.

이미 시작된 트랜잭션이 있으면 참여하고 그렇지 않으면 트랜잭션 없이 진행하게 만든다.

 

3). MANDATORY

  • 트랜잭션에 꼭 포함 되어야 함. (트랜잭션이 있는 곳에서 호출해야 됨)

 REQUIRED와 비슷하게 이미 시작된 트랜잭션이 있으면 참여한다. 반면에 트랜잭션이 시작된 것이 없으면 새로 시작하는 대신 예외를 발생시킨다. 혼자서는 독립적으로 트랜잭션을 진행하면 안 되는 경우에 사용

 

4). REQUIRES_NEW ( <->REQUIRED)

  • 각각 트랜잭션 처리(별도의 트랜잭션 처리) => REQUIRED의 반대

매번 새로운 트랜잭션을 시작한다. 이미 진행 중인 트랜잭션이 있으면 트랜잭션을 잠시 보류시킨다. JTA 트랜잭션 매니저를 사용한다면 서버의 트랜잭션 매니저에 트랜잭션 보류가 가능하도록 설정되어 있어야 한다.

 

5). NOT_SUPPORTED ( <-> SUPPORTS)

  • 트랜잭션에 포함 하지 않음(트랜잭션이 없는 것과 동일 함) =>SUPPORTS의 반대.

  트랜잭션을 사용하지 않게 한다 . 이미 진행 중인 트랜잭션이 있으면 보류시킨다. 트랜잭션이 있던 없던 사용하지 않는다.

 

6). NEVER ( <-> MANDATORY)

  • 트랜잭션에 절대 포함 하지 않음. 트랜잭션이 있는 곳에서 호출하면 에러 발생

트랜잭션을 사용하지 않도록 강제한다. 이미 진행 중인 트랜잭션도 존재하면 안된다. 있다면 예외를 발생시킨다. => 트랜잭션에 절대 참여하지 않도록 제한한다.

 

7). NESTED

  •  이미 진행중인 트랜잭션이 있으면 중첩 트랜잭션을 시작한다.

중첩 트랜잭션은 트랜잭션 안에 다시 트랜잭션을 만든다.

하지만 독립적인 트랜잭션을 만드는 REQUIRES_NEW와는 다르다고하는데, 트랜잭션 내부에 트랜잭션을 설정한다고 보면 될것같다.

 

먼저 시작된 부모 트랜잭션의 커밋/롤백에 내부(중첩)트랜젝션은 영향을 받지만 자기자신의 커밋/롤백은 부모 트랜잭션에게 영향을 주지 않는다.!!!

 

예를들어, 메인 메서드를 실행하고 그뒤에 해당 메서드에 관한 로그를 쌓는다고 보자.

이때 메인메서드가 실패하면 로그 도 자동으로 롤백되어야하지않는가.

반대로 메인 로직이 실행되고 로그가 실패했을때 메인로직이 실행된것은 그 작업을 위해 사용한 자원들이 아까우니, 메인 로직은 그대로 실행하고, 로그 적재는 실패하게 둔다. 그러고 난뒤 로그는 별도의 프로세스를 세워도 되는부분에 사용할 수 있다.

반응형