우당탕탕 개발일지

[Spring] @Transactional(트랜잭션) 애노테이션 정리 본문

Spring

[Spring] @Transactional(트랜잭션) 애노테이션 정리

kyunge_ev 2023. 1. 12. 14:55

트랜잭션(Transaction)

트랜잭션은 여러작업들을 하나로 묶는 단위로써 한 덩어리의 작업들은 모두 실행되거나, 모두 실행되지 않는다.

트랜잭션의 구성은 @Configuration, XML 기반 설정 말고도 애노테이션 기반으로 많이 사용한다.
애노테이션 방식은 선언적 트랜잭션 이라고 불린다.

트랜잭션 선언 시 해당 기능이 적용된 Proxy(프록시) 객체가 생성된다.
이렇게 생성된 프록시 객체는 @Transactional이 적용된 메소드가 호출될 경우, 
PlatformTransactionManager를 사용하여 트랜잭션을 시작하고, 정상 여부에 따라 Commit/Rollback 동작을 수행한다.

정리하면, 트랜잭션 처리를 JDK Dynamic Proxy 객체에게 위임하고 AOP를 통해 트랜잭션 처리 코드가 전, 후로 수행,동작하게 한다.

출처 : https://hwannny.tistory.com/98

👇PlatformTransactionManager

더보기

- 스프링 트랜잭션 추상화의 핵심 인터페이스
- 모든 스프링의 트랜잭션 기능과 코드는 이 인터페이스를 통해서 로우레벨의 트랜잭션 서비스를 사용할 수 있다.
- 아래와 같이 3가지 메소드를 가지고 있다.

public interface PlatformTransactionManager {
	
	TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
	
	void commit(TransactionStatus status) throws TransactionException;
	
	void rollback(Transaction status) throws TransactionException;
}

👇AOP(Aspect Oriented Programming)

더보기

- AOP는 핵심기능 코드에 존재하는 공통된 부가기능 코드를 독립적으로 분리해주는 기술
- 어드바이스(Advice) : 부가기능
- 포인트컷(Point Cut) : 부가기능이 부여될 타킷을 선정하는 룰
- Spring 에서는 어드바이스와 포인트컷을 합쳐서 어드바이저라고 부르며, 어드바이저는 아주 단순한 형태의 에스펙트(Aspect)라 부를 수 있다.
- Aspect(에스펙트) : 핵심기능에 부가되는 특별한 모듈을 뜻함

👉 에스펙트를 통해 애플리케이션을 설계하여 부가기능을 분리하는 개발 방법을 관점 지향 프로그래밍(AOP)라고 한다.
- JDK Dynamic Proxy
- CGLib
위 두가지 방식이 있다.


Transaction ACID

ACID는 데이터의 유효성을 보장하기 위한, 트랜잭션의 특징들의 앞글자를 딴 단어

Atomicity(원자성)

모든 작업이 반영되거나 모두 롤백되는 특성
예를들어, 클라이언트가 1~5번까지의 작업을 수행하고자 할 때 1~3번까지는 처리되고 4,5번 진행 중 결함이 발생되는(프로세스가 죽거나, 네트워크의 연결이 끊어지거나 하는 경우) 상황이라면 일부만 처리되는 것이 아닌 1~5번까지 모두 롤백되는 것을 말한다.

Consistency(일관성)

트랜잭션은 일관성 있는 데이터베이스 상태를 유지
데이터 베이스는 항상 좋은 상태, 항상 진실이어야한다.

Isolation(격리성)

동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리
데이터 베이스를 사용할 때 하나의 컴퓨터로만 데이터 베이스에 접속하지 않는다.
예를 들어, 여러 클라이언트가 접속 할 때 동시에 한 작업을 처리하게 되면 충돌이 발생될 수 있기 때문에 이 때 트랜잭션은 서로 격리되어 하나의 트랜잭션이 다른 트랜잭션을 절대로 방해할 수 없게 해야한다.
이는 트랜잭션의 순차적 실행 즉, 직렬성이라고도 표현한다. 이 때 발생하는 성능 손해는 감수해야한다.

Durability(지속성)

트랜잭션을 성공적으로 마치게되면 결과는 항상 저장
데이터가 손실 될 염려 없이 안전한 저장소를 제공하여 성공적으로 commit된 데이터는 어더한 결함이 발생되거나 데이터베이스가 죽더라도 안전한 저장소에 보존되어야한다.


애노테이션 트랜잭션(@Transactional)

애노테이션으로 트랜잭션을 구성할 경우에 아래의 구성을 추가로 지원한다.

- Propagation Type
- Isolation Level
- Timeout
- Read Only Flag
- Rollback Rules

단, 접근 제어자가 private / protected 메소드는 @Transactional을 무시한다.

글 처음에 설명 한것 처럼 Spring은 @Transactional이 적용된 모든 클래스와 메소드에 대한 Froxy를 생성한다.
생성 된 프록시는 프레임워크가 트랜잭션을 시작 / 커밋 하기 위해 실행 중인 메소드의 전, 후로 트랜잭션 로직을 주입한다.


Transaction Options

isolation

트랜잭션에서 일관성 없는 데이터 허용 수준을 설정 (격리 수준)

propagation

동작 도중 다른 트랜잭션을 호출 할 때, 어떻게 할 것인지 지정하는 옵션 (전파 옵션)

noRollbackFor

특정 예외 발생 시 rollback이 동작하지 않도록 설정

rollbackFor

특정 예외 발생 시 rollback이 동작하도록 설정

timeout

지정한 시간 내에 메소드 수행이 완료되지 않으면 rollback이 동작하도록 설정

readOnly

트랜잭션을 읽기 전용으로 설정

 

 

📃 더보기에 있는 내용은 추가로 공부하여 포스팅할 예정
📃 Transaction Options에 대한 자세한 내용 추가할 예정


📊 참고 자료 : https://data-make.tistory.com/738