- 비지니스 로직하나와 트랙잭션 하나가 거의 1:1 로 이루어짐
- 서비스 메소드가 호출 → 트랜잭션 시작
- 서비스마치고 컨트롤러 되돌아갈 때 → 트랜잭션 종료(모든 작업확정하는 커밋/모든 작업을 무효화하는 롤백)
트랜잭션 전파속성 Transaction Propagation 이란?
Spring 이 제공하는 선언적 트랜잭션(@Transaction)의 장점 중 하나는 여러 트랜잭션을 묶어서 커다란 하나의 트랜잭션 경계를 만들수 있다는 점이다. 작업을 하다보면 기존에 트랜잭션이 진행중 일 때 추가적인 트랜잭션을 진행해야 하는 경우가 있다. 이미 트랜잭션이 진행중 일 때 추가 트랜잭션 진행을 어떻게 할지 결정하는 것이 전파속성이다.
전파속성에 따라 기존의 트랜잭션에 참여할 수도 있고 별도의 트랜잭션으로 진행할 수도 있고, 에러를 발생시키는 등 여러 선택을 할 수 있다.
즉, 2개이상의 트랜잭션이 작동할 때, 기존의 트랜잭션에 적용되는 방법을 설정
트랜잭션 설정파일
xml파일에 transactionManager 빈을 추가
DataSourceTransactionManager 는 Connection의 트랜잭션 API를 이용해서 트랜잭션을 관리해주는 매니저이고
JDBC API를 이용하여 트랜잭션을 관리하는 데이터액세스 기술인 JDBC와 Mybatis에 적용 가능하다.
- Annotation을 이용한 트랜잭션
xml파일에 위 한줄을 추가해야한다!
사용할 때에는 트랜잭션을 적용할 클래스, 인터페이스, 메소드에 @Transactional 어노테이션을 선언
트랜잭션 전파 속성
7가지 전파속성이 존재하는데 REQUIRED 와 REQUIRES_NEW 를 이해하면 나머지는 응용가능!
- REQUIRED <=> REQUIRES_NEW
- SUPPORTS <=> NOT_SUPPORTED
- MANDATORY <=> NEVER
- REQUIRED
REQUIRED는 스프링이 제공하는 기본적인(DEFAULT) 전파 속성
미리 시작한 트랜잭션이 있으면 참여하고 아니면 새로 시작한다. => 한 트랜잭션이 시작된 후, 다른 트랜잭션 경계가 설정된 메소드를 호출하면 자연스럽게 같은 트랜잭션으로 묶인다.
- REQUIRES_NEW
각각 트랜잭션 처리(별도의 트랜잭션 처리)
매번 새로운 트랜잭션 시작한다. 이미 진행중인 트랜잭션이 있으면 트랜잭션을 잠시 보류시킨다.
- SUPPORTS
기존 트랜잭션에 의존 => 이미 시작된 트랜잭션이 있고 없고에 따라 다르다
이미 시작된 트랜잭션이 있으면 참여하고 아니면 트랜잭션 없이 진행한다.
- NOT_SUPPORTED
트랜잭션에 포함하지 않음(트랜잭션이 없는것과 동일)
트랜잭션을 사용하지 않게 한다. 이미 진행중인 트랜잭션은 보류시키며 트랜잭션 유무와 관계없이 사용하지 않는다.
- MANDATORY
트랜잭션에 꼭 포함되어야함 (트랜잭션이 있는 곳에서 호출해야됨)
REQUIRED와 비슷하게 이미 시작된 트랜잭션이 있으면 참여한다.
반면에 트랜잭션 시작된 것이 없으면 예외를 발생시킨다. 혼자서는 독립적으로 트랜잭션을 진행하면 안되는 경우에 사용
- NEVER
트랜잭션에 절대 포함시키지 않음, 트랜잭션이 있는 곳에서 호출하면 에러발생
트랜잭션을 사용하지 않도록 강제화하는 것이다. 이미 진행중인 트랜잭션도 존재하면 안된다. 있다면 예외를 발생시킨다.
- NESTED
이미 진행중인 트랜잭션이 있으면 중첩 트랜잭션을 시작한다.
중첩트랜잭션은 트랜잭션 안에 다시 트랜잭션을 만든다.
'JAVA' 카테고리의 다른 글
[Spring] 트랜잭션 격리 수준 (Transaction Isolation Level) (2) | 2022.09.23 |
---|---|
[Spring] @requestBody 와 @responseBody 차이점 (0) | 2022.09.19 |
[Spring] Spring Interceptor (스프링 인터셉터) (0) | 2022.09.04 |
[Spring] AOP (Spring AOP)란? (0) | 2022.09.02 |
[Spring] Spring MVC 란? (2) | 2022.09.01 |
댓글