본문 바로가기
코딩도전기/Spring

Transaction

by 코도꼬마 2023. 12. 30.

Transaction

  • 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위
  • 트랜잭션이 일어난 후에는 commit을 통해 변화를 반영하거나 rollback이 이루어진다.

 

트랜잭션의 특징

  • 4가지 특징
  •  Atomicity, Consistency, Isolation, Durability의 앞글자를 따서 ACID라고 부른다.

 

원자성 ( Atomicity )

  • 하나의 트랜잭션이 작업이 그중에 일부분만 실행되거나 중단되지 않는 것을 보장해주는 것
  • All or Noting, 하나의 트랜잭션 즉 작업단위에 대해서 전체 성공 혹은 전체 실패만을 보장하며 데이터베이스의 부분적인 갱신으로 더 큰 문제가 야기되는 것을 방지한다.

 

일관성 ( Consistency )

  • 작업이 성공적으로 완료가 되더라도 작업 이전과 같은 일관성 있는 데이터베이스 상태를 유지하는 것을 의미한다.
  • 예를들어 정수 타입의 컬럼에 문자열 값이 들어가 이전과 다른 상태를 가지지 않는 것을 보장한다. 데이터는 미리 정의된 정책에 대해서만 수정이 가능하며 무결성 원칙이 지켜지지 않는 작업은 바로 중단된다.

 

고립성 ( Isolation )

  • Transaction 작업이 수행되고 있을 때 다른 트랜잭션이 끼어들지 못하도록 보장해주는 것
  • 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음
  • 원칙적으로는 트랜잭션이끼리는 서로 간섭을 할 수 없어야 하지만 성능 이슈들이 많아 가장 유연하게 설정이 가능한 제약 조건이다.

 

지속성 ( Durability )

  • 성공적으로 수행된 트랜잭션에 대해서 영구적으로(Persistent) 반영되어야 함을 의미
  • 작업이 완료되어 COMMIT까지 된 작업은 시스템 문제가 발생하거나 DB 일관성 체크등을 하더라도 영구적으로 유지 되어야 한다.

 

트랜잭션의 경계(시작과 종료)


스프링 프레임워크에서 트랜잭션의 경계는 프레젠테이션 층과 비즈니스 로직층 사이에 있다.

전파 속성에 따라 하나의 요청에 트랜잭션이 여러개 생성될 수 있으나 결국 프레젠테이션 층으로 넘어올 때쯤 모든 트랜잭션은 종료될 것이다.

비즈니스 로직층에서는 비즈니스 로직과 데이터액세스로 구성되는데 트랜잭션이 종료되면서 변화 사항을 데이터베이스에 반영하는 commit을 하거나 로직과 액세스 하나라도 잘못되면 변화사항이 없었던 일이 되도록 rollback한다.
컨트롤러에서 서비스의 메서드를 실행하면 트랜잭션이 시작되고 메서드 실행을 종료하고 컨트롤러로 돌아갈 때 트랜잭션 종료가 이루어지도록 설계한다.

 

트랜잭션 처리 구현


두가지 트랜잭션 처리 구현 방법이 존재한다. 비즈니스 로직 안에서 트랜잭션의 시작과 끝을 소스코드로 명시하는 명시적인 트랜잭션 AOP를 활용하여 스프링이 제공하는 기능을 사용하는 선언적 트랜잭션이다.

AOP는 프록시 패턴으로 서비스의 메서드가 호출될 때 @Before 영역이 호출되며 트랜잭션이 시작되고 메서드가 끝날 때 @After 영역이 호출되며 커밋이 이루어지도록 한다.

AOP를 이용한 트랜잭션 처리 시 @Transactionl 어노테이션을 활용한 선언적 트랜잭션, Bean 정의 파일에 의한 선언적 트랜잭션 처리 구현 방법이 있으며 보통 어노테이션을 활용한 선언적 트랜잭션을 사용한다.

 

Transaction Manager

트랜잭션의 시작(start)과 종료(commit, rollback)와 트랜잭션의 정의정보를 설정하는 역할을 한다.

 

참고 블로그

 

스프링에서의 DB Transaction 처리

트랜잭션에 대해 정리해보았습니다.

velog.io

 

관련 블로그

 

[Spring] Transaction 사용 방법

spring-study에서 스터디를 진행하고 있습니다. Spring에서 트랜잭션을 사용하는 방법 JDBC 트랜잭션 Connection connection = dataSource.getConnection(); // (1) try (connection) { connection.setAutoCommit(false); // (2) // execute s

steady-coding.tistory.com

 

'코딩도전기 > Spring' 카테고리의 다른 글

Spring 교육  (0) 2024.01.18
AOP - Proxy Pattern  (1) 2023.12.30
CODO Day46_Spring(Paging)  (0) 2023.04.07
CODO Day45_Spring(AJAX)  (0) 2023.04.05
CODO Day44_Spring(PhotoBoard)  (0) 2023.04.04