사이트 클론코딩 프로젝트를 진행하며 새롭게 알게 된 개념인 transaction(트랜잭션)에 대해 소개해보는 시간을 가져보겠습니다.
트랜잭션은 이해하면 어려운 개념까진 아니라고 생각한다. (자세히 알려면 아직 갈길이 멀지만) 쉽게 말해서 여러개의 프로세스를 하나로 묶어서 동작할 수 있게 만들어 주는 것인데
예를 들면 내 계좌에 있는 10,000원을 누군가의 계좌로 송금하는 상황이 있다고 가정해보자. 내 계좌에서 만원이 빠져나가고 상대방의 계좌로 가는 도중에 예기치 못한 사고가 발생하여 중단이 된다면? 내 만원은 말그대로 증발하고 말 것이다.
하지만 트랜잭션을 통해 하나의 프로세스로 묶어서 진행한다면 그러한 상황이 발생하여도 시작하기전으로 rollback 하기에 안전하다고 할 수 있다.
내가 공부하는 django에서도 transaction 기능을 제공하는데, 사용법을 알아보자. 크게 3가지로 나눌 수 있다.
transaction을 사용하기 가장 편한 방법은 데코레이터를 이용하는 법이다.
from django.db import transaction
@transaction.atomic
def test1(arg1, arg2):
a.save()
b.save()
위와 같이 @transaction.atomic 이라는 데코레이터만 붙여주면 사용할 수 있다. 메소드 안에 코드를 쓸 필요가 없기 때문에 아주 유용하다.
from django.db import transaction
def test2(arg,1 arg2):
a.save()
with transaction.atomic():
b.save()
c.save()
메소드 전체가 아닌 일부분만 묶어주고 싶을 때에는 with명령어를 통해 사용할 수 있다.
from django.db import transaction
def test3(arg1, arg2):
a.save()
sid = transaction.savepoint()
try:
b.save()
c.save()
transaction.savepoint_commit(sid)
except Exception
transaction.savepoint_rollback(sid)
위의 두가지 (1,2번) 방식은 메소드 내에서 exception이 발생해도 저절로 rollback이 가능하기 때문에 예외처리를 따로 해줄 필요가 없다. 하지만 3번의 경우에는 그렇지 않기 때문에 savepoint와 commit을 설정해줘야하기 때문에 예외처리도 따로 해주어야한다.