Skip to content

트랜잭션 #

Find similar titles

6회 업데이트 됨.

Edit
  • 최초 작성자
    人CoDOM
  • 최근 업데이트
    JehongLee

Structured data

Category
Computer science

컴퓨터 과학분야에서 자주 사용되는 용어 트랜잭션(Transaction)에는 원래 다음과 같은 의미가 있다.

  1. [불] [업무·교섭·활동 등의] 처리, 집행, 취급[of ‥].
  2. (처리가 끝난 또는 처리 중인) 업무; (종종 transactions) (상)거래, 매매
  3. (transactions) (학술 협회·회의 등의) 회보, 보고서, 의사록(proceedings).
  4. [불][가] [대륙법] 화해, 시담(示談)(compromise).

보통 "처리", "집행", "거래"를 의미하는데, 컴퓨터 과학분야에서는 살짝 다른 의미로 사용된다. 의외로 많은 사람들이 이 단어의 의미를 잘 모른채 사용하고 있다. 본 문서를 통해 그 쉬운 의미와 함께 웹어플리케이션에서의 구현에 대해 알아보려 한다.

개요 #

컴퓨터 과학분야에 트랜잭션은 "쪼개질 수 없는 업무처리의 단위"를 의미한다. ATM(Automated Teller Machine, 현금자동입출기)로 계좌이체를 한다고 생각해보자. 내 계좌의 잔액에서 이체한 금액만큼 빼는 일과, 상대 계좌의 잔액에서 해당 금액만큼 더하는 일은 쪼개어져서는 안된다. 즉 하나의 업무로 함께 진행되어야 하는 일이다. "더이상 쪼갤 수 없다는" 표현 때문에 이를 원자성(Atomicity)을 보장해야 한다라고 얘기한다. 쪼갤 수 없기 때문에 일부만 동작해선 안된다. 즉, 내 계좌 잔액에서 돈을 빼고, 상대 계좌 잔액을 더하려는 순간 정전이 일어났다면, 내 계좌에서 돈을 뺀 작업은 되돌려져야 한다. 각각의 부분 작업들이 동시에 동작하여 성공하던가, 하나라도 안되면 다 원래로 돌아가던가.

부분 작업들 여러개가 모여진 이러한 트랜잭션을 처리하기 위해 데이터베이스는 다음과 같은 기술을 제공한다.

  1. 롤백(Rollback): 부분 작업이 실패하면 트랜잭션 실행 전으로 되돌린다.
  2. 커밋(Commit): 모든 부분작업이 정상적으로 완료하면 이 변경사항을 한꺼번에 DB에 반영한다.

생물정보분석 관련 시스템을 만든다면, 뭔가 일괄로 동작해야 하는 다수의 부분작업을 하나의 트랜잭션으로 처리하게 할 필요가 있는 경우가 많다. 중간에 예상치 못한 오류가 발생하면, 작업 시작 전으로 되돌려져야 한다.

속성 #

ACID(Atomicity, Consistency, Isolation, Durability)는 데이터베이스 트랜젝션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어이다. 이를 각각 살펴보면,

  1. 원자성(Atomicity): 트랜잭션에 속한 작업들이 모두 수행되었는지 아니면 모두 실행이 안되었는지를 보장하는 능력이다. 즉, 중간 단계까지 실행되고 실패하는 일은 없도록 하는 것이다.
  2. 일관성(Consistency)은 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다.
  3. 고립성(Isolation)은 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다.
  4. 지속성(Durability)은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미한다.

트랜잭션을 지원해야 하는 소프트웨어는 위 4가지 성질을 모두 보장하도록 구현해야 한다.

웹 어플리케이션에서 #

오늘날 대다수의 소프트웨어가 (Web) 환경에서 동작한다. 웹 페이지에서 특정 링크를 클릭하는 순간 "요청(Request)"이 발생하고, 서버는 이 요청에 적당한 "응답(Response)"을 만들어 사용자의 웹 브라우저로 보낸다. 만일 인터넷 뱅킹에서 계좌이체를 한다고 하면, 계좌이체 버튼을 누른 순간부터, 결과화면이 보여지는 순간까지는 하나의 트랜잭션이라고 봐도 무방하다. 물론 세밀히 구분해 보면 그 내부에 더 다양한 트랜잭션이 있겠지만, 웹 환경의 특성상 요청부터 응답까지를 통상 하나의 트랜잭션으로 볼 수 도 있다. 이 얘기는 계좌 이체 부분업무가 다 완료됐는데, 마지막에 결과 화면을 보여주는 부분에서 서버에 이상이 생겨 화면에 출력되지 않는 일이 생긴다면 이 트랜잭션은 반드시 롤백되어야 하는 것임을 의미한다. 결과화면이 사용자에게 제대로 전송되지 않았다면 거래 자체가 안돼야 하는 것이기 때문이다.

인기있는 웹 프레임워크 Django는 최근 1.6버전에 ATOMIC_REQUEST 라는 설정 기능을 추가했다. 설정 파일(settings.py)에

#!python
ATOMIC_REQUEST = True

라고 설정하면, 요청부터 응답까지 모든 부분 작업을 하나의 트랜잭션으로 처리한다. 즉, 사이트 개발자가 별도의 트랜잭션 처리를 하지 않아도 웹 프레임워크가 모든 요청을 트랜잭션으로 관리한다. 이는 매우 중요한 기능인데, 뭔가 복잡한 작업이 내부에 있고 그 중간에 오류가 났을 때, 이를 원래로 돌아가게(롤백)해 주기 때문이다. 시스템의 일관성을 유지시켜 준다.

만일 특정 루틴은 저 설정을 벗어나고 싶으면, 뷰 함수에 다음과 같은 데코레이터를 쓴다.

#!python
from django.db import transaction

@transaction.non_atomic_requests
def my_view(request):
    do_stuff()

그럼 my_view 함수는 트랜잭션으로 구동되지 않는다.

반대로 개발할 수 도 있다. 사이트 기본 설정을 ATOMIC_REQUEST False로 설정하여 디폴트 트랜잭션을 막아두고, 특정 뷰만 트랜잭션으로 구동하게 할 수 도 있다.

#!python
from django.db import transaction

@transaction.atomic
def viewfunc(request):
    # This code executes inside a transaction.
  do_stuff()

Django 뿐 아니라, 최근의 웹 어플리케이션은 ATOMIC_REQUEST를 기본으로 제공하고 있는 추세이기 때문에, 필요에 따라 적절하게 활용하면 된다.

Incoming Links #

Related People #

Related Data Sciences #

Related Articles #

Suggested Pages #

0.0.1_20230725_7_v68