[python] FastAPI에서 ORM 사용하기

FastAPI는 Python의 강력한 웹 프레임워크 중 하나입니다. 이 프레임워크는 성능이 우수하며 타입 힌팅과 함께 사용할 수 있어 개발자들에게 많은 장점을 제공합니다. 이번 블로그 포스트에서는 FastAPI와 함께 ORM(Object-Relational Mapping)을 사용하는 방법에 대해 알아보겠습니다.

ORM이란?

ORM은 객체와 관계형 데이터베이스 간의 매핑을 처리하기 위한 기술입니다. 이를 통해 개발자는 SQL 쿼리를 직접 작성하지 않고도 Python 객체를 사용하여 데이터베이스에 액세스할 수 있습니다. ORM은 데이터베이스 스키마를 객체로 표현하고, 객체 간의 관계를 확인하고, 데이터를 조회하거나 수정하는 작업을 추상화합니다.

FastAPI에서 ORM 사용하기

FastAPI는 SQLAlchemy와 함께 사용하면 강력한 ORM 기능을 사용할 수 있습니다. SQLAlchemy는 Python에서 가장 인기 있는 ORM 라이브러리 중 하나로, 다양한 데이터베이스에 대한 지원을 제공합니다. MySQL, PostgreSQL, SQLite 등의 데이터베이스를 사용할 수 있습니다.

1. FastAPI와 SQLAlchemy 설치하기

FastAPI와 SQLAlchemy를 사용하기 위해 다음과 같이 필요한 패키지들을 설치해야 합니다.

$ pip install fastapi sqlalchemy

2. SQLAlchemy 모델 정의하기

SQLAlchemy를 사용하여 데이터베이스 테이블과 관련된 모델을 정의합니다. 예를 들어, User 모델을 정의해보겠습니다.

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)
    username = Column(String(50))
    email = Column(String(100))

위 코드에서 User 클래스는 SQLAlchemy의 Base 클래스를 상속받습니다. __tablename__ 속성은 해당 모델이 연결될 데이터베이스의 테이블 이름을 지정합니다. 나머지 속성들은 테이블의 열을 정의하는데 사용됩니다.

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

FastAPI에서 SQLAlchemy를 사용하려면 데이터베이스 연결을 설정해야 합니다. 예를 들어, SQLite 데이터베이스에 연결하는 방법을 알아보겠습니다.

from fastapi import FastAPI
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

app = FastAPI()

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

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

위 코드에서 SQLALCHEMY_DATABASE_URL은 사용할 데이터베이스의 URL을 지정합니다. create_engine 함수를 사용하여 데이터베이스와의 연결을 설정하고, sessionmaker를 사용하여 세션을 관리합니다. 이렇게 설정된 데이터베이스 연결 정보는 FastAPI 앱 객체에서 사용됩니다.

4. API 엔드포인트에서 데이터베이스 사용하기

이제 FastAPI의 API 엔드포인트에서 SQLAlchemy를 사용하여 데이터베이스에 액세스할 수 있습니다. 예를 들어, GET /users API 엔드포인트를 작성해보겠습니다.

from fastapi import Depends, HTTPException
from sqlalchemy.orm import Session

@app.get("/users")
def get_users(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
    users = db.query(User).offset(skip).limit(limit).all()
    return users

위 코드에서 get_users 함수는 Session 객체를 매개변수로 받습니다. 이 세션은 get_db 함수를 통해 요청마다 생성됩니다. db.query(User)를 사용하여 User 테이블에서 데이터를 조회한 후, 해당 데이터를 반환합니다.

이렇게 FastAPI에서 ORM을 사용하여 데이터베이스에 액세스할 수 있습니다. 이를 통해 간결하고 효율적인 코드를 작성할 수 있으며, 데이터베이스 작업에 대한 복잡성을 추상화할 수 있습니다.

더 많은 FastAPI와 SQLAlchemy에 대한 정보와 기능은 공식 문서를 참조하시기 바랍니다.