Spring

[Spring] Spring Transaction 특징 및 핵심기술 설명

오잎 클로버 2022. 2. 20. 11:30
728x90

Transaction이란?

트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하기 위한 작업의 단위 또는

한꺼번에 모두 수행되어야 할 일련의 연산들을 의미합니다.

 

Transaction의 특징

  1. 트랜잭션은 DB 시스템에서 병행 작업 및 회복 작업 시 처리되는 작업의 논리 단어입니다,
  2. 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변화 과정의 작업 단위입니다.
  3. 하나의 트랜잭션은 Commit 되거나 Rollback 됩니다.

Transaction의 성질

Atomicity(원자성)

  • 트랜잭션의 연산은 데이터베이스에 모두 반영되든지 아니면 전혀 반영되지 않아야 한다.
  • 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.

Consistency(일관성)

  • 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환한다.
  • 시스템이 가지고 있는 고정 요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 한다.

Isolation(독립성, 격리성)

  • 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없다.
  • 수행 중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.

Durablility(영속성, 지속성)

  • 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장 나더라도 영구적으로 반영되어야 한다.

Transaction 연산 및 상태

Commit연산

  • Commit 연산은 한 개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산이다.

Rollback연산

  • Rollback 연산은 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산이다.
  • Rollback시에는 해당 트랜잭션을 재시작하거나 폐기한다.

트랜잭션의 상태

활동(Active) : 트랜잭션이 실행 중인 상태

실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태

철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태

부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태

완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태

 

Spring에서 제공하는 Transaction 핵심기술

총 3가지 핵심기술을 제공하는 데, 그 3가지 핵심 기술을 다음과 같습니다.

  1. 트랜잭션 동기화
  2. 트랜잭션 추상화
  3. AOP를 이용한 트랜잭션 분리

1. 트랜잭션 동기화

JDBC를 이용하는 개발자가 직접 여러 개의 작업을 하나의 트랜잭션으로 관리를 한다면 Connection 객체를 공유하는 등

상당히 불필요한 작업들이 발생하게 됩니다. Spring은 이러한 문제를 해결하고자 트랜잭션 동기화 기술을 제공해주고 있습니다.

트랜잭션 동기화는 트랜잭션을 시작하기 위한 Connection 객체를 특별한 저장소에 보관해두고 필요할 때 꺼내쓸 수 있도록 하는 기술입니다. 트랜잭션 동기화 저장소는 작업 쓰레드마다 Connection 객체를 독립적으로 관리하기 때문에,

멀티 쓰레드 환경에서도 충돌이 발생하지 않습니다. 

하지만 Connection 객체를 사용하지 않는 다른 트랜잭션 기술을 사용한다면 오류가 발생할 것입니다.

Hibernate가 대표적인 기술인데, Connection 대신 Session이라는 객체를 사용합니다.

그렇기에 다음에 설명할 추상화라는 기술을 제공해줍니다.

 

2. 트랜잭션 추상화

여기에서 설명을 해두었기에 짧고 추가적인 내용만 덧붙이겠습니다.

트랜잭션 추상화를 이용함으로써 애플리케이션에 각 기술마다(JDBC, JPA, Hibernate 등) 종속적인 코드를 이용하지 않고도 일관되게 트랜잭션을 처리할 수 있도록 지원해주고 있습니다.

위와 같은 기술로 개발자가 사용하는 기술과 무관하게 트랜잭션을 공유하고 커밋하고 롤백할 수 있도록 되었습니다.

public Object invoke(MethodInvoation invoation) throws Throwable {
    TransactionStatus status = this.transactionManager.getTransaction(new DefaultTransactionDefinition()); 
    try { 
        Object ret = invoation.proceed();
        this.transactionManager.commit(status);
        return ret; 
    } catch (Exception e) {
        this.transactionManager.rollback(status);
        throw e; 
    }
}

하지만, 위와 같은 트랜잭션 관리 코드들이 비즈니스 로직과 결합되어 2가지 책임을 가지고 있습니다.

그렇기에 다음에 설명할 AOP를 지원해줌으로써 이러한 트랜잭션 부분을 핵심 비즈니스 로직과 분리를 해주었습니다.

 

3. AOP를 이용한 트랜잭션 분리

트랜잭션 코드와 비즈니스 로직 코드가 복잡하게 얽혀있는 코드가 있다고 가정을 해봅시다.

그렇다면 해당 코드는 여러 책임을 가질 뿐만 아니라 서로 성격이 다릅니다.

또, 서로 주고받는 것이 만일 없다면 분리하는 것이 적합할 것입니다.

내부 메서드로 추출하거나 DI로 합성을 이용해 해결하거나 상속을 하는 방법을 흔히 해결방안으로 낼 수 있으나

, 이처럼 한다고 하더라도 트랜잭션을 담당하는 기술 코드를 완전히 분리하는 것은 불가능합니다.

그래서 Spring에서는 트랜잭션 코드와 같은 부가 기능 코드가 존재하지 않는 것처럼 보이기 위해 

해당 로직을 클래스 밖으로 빼내서 별도의 모듈로 만드는 AOP를 고안 및 적용하게 되었습니다.

이를 적용한 기술이 현재 사용되는 @Transactional이라는 어노테이션입니다.

이를 적용함으로써 핵심 비즈니스 로직과 트랜잭션을 분리할 수 있게 되었습니다.

 

 

위와 같은 정보들 외에도 Spring 트랜잭션 세부 설정, 롤백 처리 방식 등 설명해야 할 것이 몇 가지 더 있으나

내용이 너무 길어지는 관계로 다음에 포스팅하도록 하겠습니다.

 

 

이상입니다.

'Spring' 카테고리의 다른 글

[Spring] DTO vs VO  (0) 2022.02.28
[Spring] Spring Transaction 세부 설정 설명  (0) 2022.02.21
[Spring] Spring AOP/PSA 설명  (0) 2022.02.19
[Spring] Spring POJO 설명  (0) 2022.02.18
[Spring] Spring Entity, Repository 설명  (0) 2022.02.17