[python] Tornado와 데이터베이스 마이그레이션

웹 애플리케이션을 개발하다보면 데이터베이스의 스키마를 수정해야 할 때가 있습니다. 이때 데이터베이스 마이그레이션은 필수적인 작업입니다. 이번 글에서는 Tornado 웹 프레임워크와 데이터베이스 마이그레이션의 기본 개념과 예제를 알아보겠습니다.

1. Tornado 소개

Tornado는 Python으로 개발된 비동기 웹 프레임워크입니다. Tornado는 단일 프로세스에서도 많은 연결을 동시에 처리할 수 있도록 설계되어 있으며, 서비스의 확장성과 성능 향상을 위해 잘 알려져 있습니다.

2. 데이터베이스 마이그레이션

데이터베이스 마이그레이션은 데이터베이스의 스키마 변경을 관리하는 과정입니다. 스키마 변경은 데이터베이스 테이블의 생성, 수정 또는 삭제를 의미합니다. 데이터베이스 마이그레이션은 데이터베이스의 변경 사항을 업데이트하고, 애플리케이션이 새로운 스키마를 정상적으로 사용할 수 있도록 도와줍니다.

일반적으로 데이터베이스 마이그레이션은 스크립트 또는 마이그레이션 도구를 사용하여 수행됩니다. 이러한 도구를 사용하면 다양한 버전의 스키마를 관리하고, 롤백이 가능하며, 애플리케이션의 배포 시 데이터베이스를 자동으로 업데이트할 수 있습니다.

3. Tornado와 데이터베이스 마이그레이션 예제

Tornado에서 데이터베이스 마이그레이션을 수행하기 위해 대표적으로 사용되는 라이브러리는 Alembic입니다. Alembic은 SQLAlchemy를 기반으로 작성된 마이그레이션 도구로, 데이터베이스 스키마 변경을 관리할 수 있습니다.

다음은 Tornado와 Alembic을 사용하여 데이터베이스 마이그레이션을 수행하는 예제입니다.

# main.py
import tornado.ioloop
import tornado.web
from sqlalchemy import create_engine
from alembic.config import Config
from alembic import command

DATABASE_URL = "sqlite:///mydb.db"

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, Tornado!")

if __name__ == "__main__":
    engine = create_engine(DATABASE_URL)
    alembic_cfg = Config("alembic.ini")
    command.upgrade(alembic_cfg, "head")
    
    app = tornado.web.Application([
        (r"/", MainHandler),
    ])
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()
# alembic.ini
[alembic]
script_location = alembic
# alembic/env.py
from myapp.models import Base

target_metadata = Base.metadata

위 예제에서는 Tornado 애플리케이션을 실행하기 전에 alembic 명령을 사용하여 데이터베이스 마이그레이션을 수행합니다. alembic.ini 파일에서 마이그레이션 스크립트의 위치를 설정하고, alembic/env.py 파일에서 데이터베이스 모델의 메타데이터를 설정합니다.

이후 tornado.web.Application을 초기화하여 웹 애플리케이션을 실행합니다. 이때 create_engine 함수를 사용하여 데이터베이스 연결을 설정한 다음, command.upgrade를 통해 데이터베이스 마이그레이션을 수행합니다.

이처럼 Tornado와 Alembic을 함께 사용하면 편리하게 데이터베이스 마이그레이션을 수행할 수 있습니다.

4. 참고 자료