-
[Spring] 스프링 트랜잭션Programming Language/Spring 2022. 9. 30. 21:07반응형
트랜잭션이란
트랜잭션은 완전히 성공 하거나 완전히 실패하는 일련의 논리적 작업 단위 입니다.
@Transactional 애노테이션
스프링 트랜잭션은 프로그래밍 방식과 선언적 방식의 두가지 방식으로 구분할 수 있습니다.
프로그래밍 방식
- TransactionTemplate
- 직접 PlatformTransactionManager 구현하기
- 트랜잭션 관리가 비즈니스 로직과 함께 사용되기 때문에 프로그래밍 방식으로는 널리 사용되지 않음
- 하지만 기능이 몇가지 밖에 없는 애플리케이션에서는 트랜잭션 프록시를 통한 부하가 중한 작업으로 느껴질 수 있어서 프로그래밍 방식이 사용될 수 있음
선언적 방식 (@Transactional)
메서드 혹은 구현체 클래스 상단에 @Transactional 애노테이션을 사용합니다. 클래스 수준에서 사용되는 경우 메서드 전체에 전역으로 적용됩니다.
public class OrderService { @Transactional public ovid orderMethod() { } }
OrderService가 다른 클래스에 주입되면 Spring은 냉부적으로 아래와 같은 클래스를 생성하여 대신 주입합니다.
class ProxyOrderService extends OrderService { private OrderService orderService; public ProxyOrderService(OrderService s){ this.orderService = s; } @Override public void orderMethod(){ try{ // 트랜잭션 시작 orderService.orderMethod(); // 트랜잭션 커밋 } catch(Exception e){ // 트랜잭션 롤백 } } }
이를 프록시(Proxy) 패턴이라고 합니다. 실제 호출되는 메서드는 프록시이며 내부적으로 target(본쳬)를 호출합니다.
- 트랜잭션 관리가 비즈니스 로직과 별도로 분리되어 있기 때문에 널리 사용됨
- Spring AOP 프록시를 활용하여 적절한 TransactionManager로 메서드 호출 주변의 트랜잭션을 구동함
- XML과 애노테이션을 활용하여 수행할 수 있으며 요즘에는 대부분 애노테이션 기반으로 사용함
propagation
트랜잭션 전파를 위한 설정입니다. 이것은 트랜잭션 동작을 설정하는데 매우 중요한 속성입니다.
- REQUIRED (default) — 현재 트랜잭션 지원, 존재하지 않는 경우 새 트랜잭션 생성
- REQUIRES_NEW — 새로운 트랜잭션을 생성하고 존재하지 않는 경우 현재 트랜잭션을 일시 중단합니다.
- MANDATORY — 현재 트랜잭션을 지원하고 존재하지 않는 경우 예외를 던집니다.
- NESTED — 현재 트랜잭션이 있는 경우 중첩된 트랜잭션 내에서 실행
- SUPPORTS — 현재 트랜잭션을 지원하지만 존재하지 않는 경우 비트랜잭션으로 실행
isolation
트랜잭션의 격리 수준입니다. 트랜잭션이 다른 트랜잭션과 격리되어야 하는 수준을 설정합니다.
- DEFAULT — 데이터 소스의 기본 격리 수준
- READ_UNCOMMITTED — Dirty Read, Non-Repeatable Read 및 Phantom Read가 발생할 수 있음을 나타냅니다. 다른 트랜잭션의 커밋되지 않은 데이터도 읽을 수 있음.
- READ_COMMITTED — Dirty Read를 방지하고 반복할 수 없으며 Phantom Read가 발생할 수 있음을 나타냅니다. 커밋된 데이터만 읽음. 반복조회시 커밋 시점에 따라 데이터 상이.
- REPEATABLE_READ — Dirty Read와 Non-Repeatable Read가 방지되지만 Phantom Read가 발생할 수 있음을 나타냅니다. 반복적으로 조회하여도 동일한 데이터를 보장
- SERIALIZABLE — Dirty Read와 Non-Repeatable Read, Phantom Read가 방지될 수 있음을 나타냅니다. 데이터 처리의 직렬화를 보장.
readOnly : 트랜잭션이 읽기 전용인지 또는 읽기/쓰기인지 여부
timeout : 트랜잭션 타임아웃(처리 시간초과)
rollbackFor : 트랜잭션의 롤백을 발생시켜야 하는 예외(Exception) 클래스의 배열
rollbackForClassName : 트랜잭션의 롤백을 발생시켜야 하는 예외 클래스 이름의 배열
noRollbackFor : 트랜잭션 롤백을 유발하지 않아야 하는 예외 클래스 개체의 배열
noRollbackForClassName : 트랜잭션 롤백을 유발하지 않아야 하는 예외 클래스 이름의 배열반응형'Programming Language > Spring' 카테고리의 다른 글
[Spring In Action] 11. 리액티브 API 개발하기 (0) 2023.03.24 @Transaction(readOnly = true) (0) 2022.11.21 [Spring] @Bean vs @Component (0) 2022.09.28 [Spring] 스프링 빈(Bean) (0) 2022.05.31 [Spring] 스프링 주요 어노테이션 정리 (0) 2021.09.13