Spring이 제공하는 Transaction 이해

gisung2215·2022년 11월 17일
0

SpringBoot

목록 보기
4/4

01. 트랜잭션의 정의

더 이상 쪼갤 수 없는 최소 단위의 작업 개념이다. 따라서 트랜잭션 경계 안에서 진행된 작업은 commit() 을 통해 모두 성공하든지 아니면 rollback()을 통해 모두 취소돼야 한다.

트랜잭션의 필요 예시

  • 사용자가 상품을 결재 중일 때 해당 상품 정보를 변경해서는 안된다.
  • 사용자가 결재 중일 때 해당 상품을 다른 사용자가 결재해서는 안된다.
  • 오류로 인한 구매 실패의 경우 결재 금액을 환불한다.

02. 트랜잭션의 특징

  • 원자성(Atomicity)
    트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력이다. 예를 들어, 자금 이체는 성공할 수도 실패할 수도 있지만 보내는 쪽에서 돈을 빼 오는 작업만 성공하고 받는 쪽에 돈을 넣는 작업을 실패해서는 안된다. 원자성은 이와 같이 중간 단계까지 실행되고 실패하는 일이 없도록 하는 것이다.
  • 일관성(Consistency)
    트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다. 무결성 제약이 모든 계좌는 잔고가 있어야 한다면 이를 위반하는 트랜잭션은 중단된다.
  • 독립성(Isolation)
    트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다. 이것은 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음을 의미한다. 은행 관리자는 이체 작업을 하는 도중에 쿼리를 실행하더라도 특정 계좌간 이체하는 양 쪽을 볼 수 없다. 공식적으로 고립성은 트랜잭션 실행내역은 연속적이어야 함을 의미한다. 성능관련 이유로 인해 이 특성은 가장 유연성 있는 제약 조건이다. 자세한 내용은 관련 문서를 참조해야 한다.
  • 지속성(Durability)
    성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미한다. 시스템 문제, DB 일관성 체크 등을 하더라도 유지되어야 함을 의미한다. 전형적으로 모든 트랜잭션은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있다. 트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있다.

03. 스프링에서 트랜잭션 관리

3.1 TransactionTemplate

Spring에서는 PlatformTransactionManager 인터페이스를 통해 트랜잭션에 대한 추상화를 지원한다. 사용자는 해당 클래스를 이용해 트랜잭션 시작/종료 지점을 명시적으로 결정할 수 있게 된다. 이 뿐만아니라 스프링에서는 해당 클래스의 다양한 구현체 역시 제공한다.

  • DataSourceTransactionManager
  • HibernateTransactionManager
  • JpaTransactionManager
  • JtaTransactionManager
  • WebLogicJtaTransactionManager
  • WebSphereUowTransactionManager

3.2 @Transactional 어노테이션

스프링에서는 또한 @Transactional 어노테이션을 지원해준다. 우리는 DB와 관련된, 트랜잭션이 필요한 클래스 혹은 메서드에 @Transactional 어노테이션을 달기만 하면 된다.

@Transactional 어노테이션은 클래스와 메서드 모두에 적용가능한데 클래스에 다는 경우 해당 클래스 및 하위 클래스까지 적용된다. 또한, 클래스와 메서드 모두에 적용하는 경우 매서드 레벨의 @Transactional 선언을 우선시 한다.

4. Spring 트랜잭션의 세부 설정

Spring의 DefaultTransactionDefinition이 구현하고 있는 TransactionDefinition 인터페이스는 트랜잭션의 동작방식에 영향을 줄 수 있는 네 가지 속성을 정의하고 있다. 해당 4가지 속성은 트랜잭션을 세부적으로 이용할 수 있게 도와주며, @Transactional 어노테이션에도 공통적으로 적용할 수 있다.

참고자료

0개의 댓글