[python] Flask-RESTful에서 트랜잭션 처리 방법

Flask-RESTful은 Python으로 개발된 웹 프레임워크인 Flask를 기반으로 한 RESTful API를 쉽게 구축할 수 있도록 도와주는 라이브러리입니다. 트랜잭션은 데이터베이스에 대한 일련의 작업을 하나의 단위로 묶어서 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 보장하는 기능입니다. 이번 글에서는 Flask-RESTful에서 트랜잭션을 처리하는 방법에 대해 알아보겠습니다.

1. 데이터베이스 연결

Flask-RESTful에서 트랜잭션을 처리하려면 먼저 데이터베이스에 연결해야 합니다. 예를 들어, MySQL 데이터베이스에 연결하는 코드는 다음과 같습니다.

import pymysql

def create_database_connection():
    conn = pymysql.connect(
        host='localhost',
        user='username',
        password='password',
        db='database_name',
        charset='utf8mb4',
        cursorclass=pymysql.cursors.DictCursor
    )

    return conn

위의 코드에서는 pymysql 라이브러리를 사용하여 MySQL 데이터베이스에 연결하고 있습니다.

2. 트랜잭션 사용

Flask-RESTful에서는 flask_sqlalchemy 라이브러리를 사용하여 트랜잭션을 처리할 수 있습니다. 이를 위해 먼저 Flask 애플리케이션에 SQLAlchemy를 설정해야 합니다.

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/database_name'

db = SQLAlchemy(app)

다음으로, 트랜잭션을 필요로 하는 함수에서 db.session.transaction() 데코레이터를 사용하여 트랜잭션을 시작하고 commit() 또는 rollback() 메서드를 사용하여 트랜잭션이 성공적으로 완료되거나 실패했을 때의 동작을 정의할 수 있습니다.

from flask_restful import Resource

class ExampleResource(Resource):
    def post(self):
        with db.session.transaction():
            # 트랜잭션 작업 수행
            # commit() 또는 rollback() 호출

        return {'message': 'Success'}, 200

위의 예제에서는 post() 메서드 내에서 트랜잭션을 시작하고, 트랜잭션 작업이 수행되고 나서 반환되는 응답을 정의하고 있습니다.

3. 에러 핸들링

트랜잭션 중에 오류가 발생할 수 있으므로 이를 적절히 처리해야 합니다. try-except 문을 사용하여 예외가 발생한 경우 rollback() 메서드를 호출하여 트랜잭션을 롤백할 수 있습니다.

from flask_restful import Resource

class ExampleResource(Resource):
    def post(self):
        try:
            with db.session.transaction():
                # 트랜잭션 작업 수행
                # commit() 또는 rollback() 호출

            return {'message': 'Success'}, 200
        except:
            db.session.rollback()
            return {'message': 'Error'}, 500

위의 예제에서는 예외가 발생한 경우 rollback() 메서드를 호출하고, 에러 응답을 반환하고 있습니다.

결론

Flask-RESTful에서 트랜잭션을 처리하는 방법을 살펴보았습니다. 데이터베이스 연결 설정, 트랜잭션 시작과 완료, 예외 처리 등을 통해 트랜잭션을 안전하게 처리할 수 있습니다. 이를 통해 Flask-RESTful 애플리케이션에서 데이터베이스 작업을 원자적으로 수행할 수 있으며 데이터의 일관성과 안전성을 유지할 수 있습니다.

참고 자료