Imperative Transactions Vs. Reactive Transactions
2025-09-22
일단 시작하기 전에, 정확하게 한가지 짚고 넘어갈 것이 있다.
트랜잭션 관리는 기술에 독립적인 패턴으로 데이터베이스 관점에서는 명령형과 반응형 트랜잭션이 동일하게 동작한다.
Imperative Transactions
스프링의 AOP 기반 @Transactional에서는 트랜잭션 상태와 리소스(Context)가 ThreadLocal에 바인딩된다.
즉, 동일 스레드 내에서 모든 트랜잭션 작업이 수행될 것을 보장한다.
데이터 경계 관점에서는 트랜잭션이 진행되는 동안의 데이터는 @Transactional 메서드 내부에 머물며 외부로 탈출하지 않는다.
Reactive Transactions
트랜잭션 Context 바인딩이 ThreadLocal이 아닌 subscriber context에 바인딩을 한다. 각 reactive sequence는 독립된 Context를 갖고 서로 격리된다. 이게 명령형과의 첫 번째 큰 차이이다.
두 번째는 데이터가 @Transactional 메서드 경계 밖으로 스트리밍될 수 있다는 점이다.
Publisher는 DB 드라이버가 row를 디코드하는 즉시 요소를 방출하므로, 트랜잭션 활성 중에도 데이터가 흘러나간다.
@Transactional은 reactive sequence 내 마커 역할에 가깝고, subscribe 시점과 onComplete 시점의 효과를 관찰하는 모델로 이해하면 된다.