반응형
Transaction이란
트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위를 의미합니다.
데이터베이스의 상태를 변화한다는 것은 insert, update, delete 같은 SQL 문을 이용해 데이터베이스에 접근하는 것을 의미합니다.
⭐️ Spring에서의 @Transcational 이란
Springboot에서 @Transcational은 하나의 함수가 하나의 데이터베이스 트랜잭션의 범위 안에서 실행되어야 하는 것을 명시합니다.
해당 어노테이션을 메서드에 적용시키면, Springboot는 해당 메서드를 시작할 때 트랜잭션을 시작하고, 메서드가 성공적으로 완료되면 트랜잭션을 commit 합니다. (만약, 도중 예외가 발생하면 rollback 합니다.)
이를 통해 비정상적인 종료나 오류로 인해 rollback이 발생했을 때,
트랜잭션의 일부 작업만 데이터베이스에 적용되는 것을 방지하여 데이터 일관성을 유지시킵니다.
@Transactional 동작 과정 (AOP 이해)
AOP는 관점 지향 프로그래밍으로, 애플리케이션의 공통 기능과 핵심 기능을 분리해서 모듈화하는 프로그래밍 방법입니다.
Springboot에서는 해당 AOP 방식으로 선언전 트랜잭션을 구현합니다.
프록시 패턴
Springboot는 AOP를 구현하기 위해 주로 프록시 패턴을 사용합니다.
프록시 패턴은 특정 객체에 대한 접근을 제어하거나 추가적인 기능을 제공하기 위해, 해당 객체의 대리인 역할을 수행하는 디자인 패턴입니다.
@Transactional이 붙은 클래스나 메서드를 호출할 때,
Springboot는 실제 객체 대신 프록시 객체를 사용하여 호출을 가로채 트랜잭션을 적용합니다.
⭐️ @Transactional 동작 과정
- @Transactional이 붙은 클래스나 메서드가 있는 경우, SpringBoot는 해당 클래스나 메서드를 호출 할 때 트랜잭션을 관리하는 프록시 객체를 생성한다.
- 프록시 객체는 @Transactional이 붙은 메서드가 호출될 때, 트랜잭션 매니저를 사용하여 새로운 트랜잭션을 시작하거나, 이미 진행 중인 트랜잭션에 참여한다.
- 메서드 실행 중에 예외가 발생하면, 프록시 객체는 트랜잭션 매니저에 ROLLBACK을 요청하고, 만약 성공적으로 완료되면 COMMIT을 요청한다.
⭐️ @Transactional 전파 속성
트랜잭션이 진행 중일 때 추가 트랜잭션 진행을 어떻게 할지 결정하는 것입니다.
@Transactional의 기본 값은 REQUIRED 입니다.
외부 트랜잭션과 내부 트랜잭션 이해하기
- 내부 트랜잭션은 기존에 실행되던 트랜잭션을 의미합니다.
- 외부 트랜잭션은 새롭게 추가되는 트랜잭션을 의미합니다.
물리 트랜잭션
물리 트랜잭션이란
- 여러 개의 트랜잭션을 하나의 트랜잭션으로 감싼 개념
- 실제 데이터베이스에 적용되는 트랜잭션
- 실제 커넥션을 통해 트랜잭션을 시작하고 종료(커밋, 롤백)하는 단위
⭐️ 모든 논리 트랜잭션이 커밋되어야 물리 트랜잭션이 커밋됩니다.
= 하나의 논리 트랜잭션이라도 롤백되면 물리 트랜잭션은 롤백됩니다.
⭐️ 신규 트랜잭션만 물리 트랜잭션을 종료(커밋, 롤백)할 수 있다.
Spring 환경 Transactional(Required) 예시
- 기본 설정 값 Required인 경우
- 영화 서비스에서 먼저 트랜잭션이 생성됩니다.
- 영화 예매에서 기존 트랜잭션에 참여합니다.
- 로그 저장에서 기존 트랜잭션에 참여합니다.
- 하나의 트랜잭션으로 처리됩니다.
📌 로그 저장 트랜잭션에서 예외가 발생하는 경우
- 영화 예매는 정상적으로 처리됐지만, 로그 저장에서 예외가 발생함
- @Transactional이 required로 되어 있어 모두 하나의 물리 트랜잭션으로 운영됨
- 로그 저장 시 발생한 예외로 영화 서비스에서 rollback-only가 발생함.
- 영화 예매해 성공되었는데, 로그 저장이 되지 않았다고 롤백되면 사용자에게 큰 문제가 됨
위와 같은 상황에서 트랜잭션을 분리하기 위해서 Required_new를 사용하여 영화 예매와 로그 저장 트랜잭션을 분리할 수 있습니다.
⭐️ Transactional(Required_nex)로 설정한 경우
- 로그 저장에 실패해도 영화 예매는 유지되어 사용자가 서비스 이용하는 데 문제가 없음
- 새로운 트랜잭션으로 처리하기에 분리하여 처리가 가능
참고 자료
https://www.youtube.com/watch?v=b0s9RzKyHN0
반응형