들어가며
트랜잭션의 정의와 스프링에서의 트랜잭션의 사용방법에 대해서 정리한다.
Transaction
먼저 트랜잭션이란 더 이상 쪼갤 수 없는 최소 작업 단위이다. 항상 그렇듯 이렇게 정의만 놓고 보면 정확히 감이 안오기 때문에 왜 트랜잭션이란 기능을 만들어 더 이상 쪼갤 수 없는 최소 작업 단위를 만들었는지 예를 통해 알아본다.
가장 대표적인 예인 은행에서의 송금의 과정을 봐보자. A라는 사람이 B에게 10만원을 입금했다. 하지만 그 중간과정에서 에러가 발생해서 A의 통장에서는 돈이 빠져나갔지만 B의 통장에는 돈이 입금되지 않은 상황이 발생했다. 바로 이러한 상황을 막기 위해 만들어진 것읻 트랜잭션의 개념이다.
개발 상황에서의 Transaction
개발을 하다보면 단일 쿼리 한줄로는 해결할 수 없는 로직들을 만나게 된다. 예를 들어 하나의 로직 안에 쿼리문이 3개가 정상적으로 작동해야만 해당 서비스 로직이 정상적으로 작동되는 상황이라고 할때 중간에 하나의 쿼리문이라도 오작동을 하게 되면 해당 서비스에는 문제가 생길 것이다. 이때 Transaction을 통해 3개의 쿼리문을 하나의 커넥션으로 묶어서 DB로 전송하고, 이 과정에서 문제가 생긴다면 자동으로 모든 과정을 원래대로 되돌려 놓는 롤백을 하게 된다.
Spring에서의 Transaction
스프링에서는 3가지의 핵심 기술을 통해 트랜잭션을 지원한다.
1. 트랜잭션 동기화
트랜잭션을 시작하기 위한 커넥션 객체를 특별한 저장소에 보관해두고 필요할 때 꺼내쓸 수 있도록 하는 기술이다. 덕분에 멀티쓰레드 환경에서도 충돌이 발생하지 않는다.
2. 트랜잭션 추상화
트랜잭션 기술의 공통점을 담은 트랜잭션 추상화를 통해서 애플리케이션의 기술마다 종속적인 코드를 이용하지 않고도 트랜잭션 처리를 가능하게 해준다. (추상화 기술이 없었다면 JDBC를 사용하다 Hibernate와 같은 기술을 쓰게 된다면 JDBC에 종속적인 트랜잭션 동기화 코드들이 문제를 유발 했을 것이다.)
3. AOP를 이용한 트랜잭션 분리
해당 로직을 클래스 밖으로 빼내서 별도의 모듈로 만드는 AOP를 고안하여 적용해서 나온 것이 트랜잭션 어노테이션(@Transactional)이다.
@Transactional
해당 어노테이션이 붙으면 스프링은 해당 타킷을 포인트 컷의 대상으로 자동 등록하며 트랜잭션 관리 대상이 된다. 해당 방식을 선언적 트랜잭션이라고 부르고 반대로 TransactionTemplate나 개별 데이터 기술을 이용하면 프로그램에 의한 트랜잭션이라고 한다. 스프링에서는 두가지 방법 모두 지원하지만 특별한 경우가 아니라면 선언적 트랜잭션을 사용하는 게 좋다. 메소드 단위로 다르게 지정도 가능하여 세밀하게 트랜잭션 설정이 가능하고 코드를 보고 직관적으로 이해가 가능하기 때문이다.
@Transactional의 Fallback Policy(대체정책)
스프링에서는 @Transactional의 대체 정책을 통해서 메소드에 트랜잭션 어노테이션이 없다면 다음 우선 순위를 두어 적용이 가능하도록 지원을 한다. 이것을 4단계의 대체 정책이라고 부르며 순서는 다음과 같다.
1. 타깃 메소드
2. 타깃 클래스
3. 선언 메소드
4. 선언 타입 (클래스 or 인터페이스)
아래의 코드를 보면 더욱 이해가 빠르게 간다. ([x]의 순서로 진행)
// [4]
public interface Service {
// [3]
void method1();
// [3]
void method2();
}
// 타깃 클래스 [2]
public class Servicelmpl implements Service {
// [1]
public void method1() (
// [1]
public void method2() {
}
'Spring' 카테고리의 다른 글
Spring - @NotNull, @NotEmpty, @NotBlack (0) | 2022.02.13 |
---|---|
Spring - @ConfigurationPropertiesScan 어노테이션 (0) | 2022.01.19 |
Spring Security를 이용한 회원 로그인 구현과 동작 원리 정리 (+SecurityFilterChain 기능 정리 ) (0) | 2021.11.19 |
JPA Auditing 을 이용한 생성 시간과 수정 시간 자동화하기 (0) | 2021.10.08 |
Spring - Singleton 컨테이너 정리. (0) | 2021.08.02 |
댓글