[python] FastAPI에서 ORM 자동 생성 도구 사용하기

FastAPI는 강력한 웹 프레임워크로서 데이터베이스와의 상호작용을 쉽게 처리할 수 있도록 ORM(Object Relational Mapping)을 지원합니다. 이를 통해 데이터베이스 스키마와 파이썬 코드를 매핑해주어 SQL 쿼리를 직접 작성하는 번거로움을 줄여줍니다. 이번 글에서는 FastAPI에서 ORM 자동 생성 도구를 사용하는 방법에 대해 알아보겠습니다.

1. SQLAlchemy 설치하기

FastAPI에서 ORM을 사용하기 위해 먼저 SQLAlchemy를 설치해야 합니다. pip를 이용하여 다음 명령어를 실행하여 SQLAlchemy를 설치합니다.

pip install SQLAlchemy

2. 모델 정의하기

FastAPI에서 ORM을 사용하기 위해서는 데이터베이스 테이블에 매핑되는 모델을 먼저 정의해야 합니다. 아래와 같이 모델을 정의합니다.

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    email = Column(String)

위 코드에서 User 클래스는 데이터베이스 테이블에 매핑되는 모델을 정의한 것입니다. __tablename__ 속성은 해당 테이블의 이름을 지정하며, 각 열은 Column 객체로 정의합니다.

3. 데이터베이스 연결 설정하기

FastAPI에서 ORM을 사용하기 위해서는 데이터베이스 연결 설정을 해주어야 합니다. 아래와 같이 데이터베이스 URL을 설정합니다.

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

위 코드에서는 SQLite 데이터베이스를 사용하도록 설정하였습니다. 실제 프로덕션 환경에서는 다른 데이터베이스를 사용할 수도 있습니다.

4. 데이터베이스에 테이블 생성하기

모델을 정의하고 데이터베이스 연결 설정을 완료한 후에는 실제 데이터베이스에 테이블을 생성해야 합니다. 아래와 같이 Base.metadata.create_all() 메서드를 호출하여 테이블을 생성합니다.

Base.metadata.create_all(bind=engine)

5. 데이터베이스 세션 사용하기

ORM을 사용하여 데이터베이스를 조작하기 위해서는 세션을 사용해야 합니다. FastAPI에서는 데코레이터를 사용하여 각각의 API 핸들러 함수에서 세션을 만들어 사용할 수 있습니다. 예를 들어 아래와 같이 get_user 함수에서 사용자 정보를 조회하는 경우입니다.

from fastapi import Depends
from sqlalchemy.orm import Session

def get_user(user_id: int, db: Session = Depends(get_db)):
    user = db.query(User).filter(User.id == user_id).first()
    return user

위 코드에서 get_db 함수는 데이터베이스 세션을 생성하여 반환하는 함수입니다.

마치며

이제 FastAPI에서 ORM 자동 생성 도구를 사용하는 방법을 알아보았습니다. ORM을 사용하면 SQL 쿼리 작성의 번거로움을 줄여줄 뿐만 아니라, 데이터베이스와의 상호작용을 보다 쉽게 처리할 수 있습니다. FastAPI와 SQLAlchemy의 강력한 조합을 통해 보다 효율적인 웹 개발을 할 수 있습니다.

참고 자료: