[python] FastAPI에서 효율적인 쿼리 작성하기

FastAPI는 Python으로 작성된 고성능 웹 프레임워크로, 쿼리 작성에 있어서도 효율적인 방법을 제공합니다. 이번 포스트에서는 FastAPI에서 효율적인 쿼리 작성에 대해 알아보겠습니다.

1. 쿼리 파라미터 활용하기

FastAPI는 쿼리 파라미터를 사용하여 API 엔드포인트에서 필요한 데이터를 요청할 수 있습니다. 이를 통해 클라이언트가 필요한 정보를 세밀하게 필터링할 수 있으며, 서버 측에서는 해당 필터를 활용하여 DB에서 효율적으로 데이터를 조회할 수 있습니다. 예를 들어, 다음과 같은 코드를 사용하여 쿼리 파라미터를 정의할 수 있습니다.

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

위의 코드에서 skiplimit는 쿼리 파라미터로 정의되었습니다. 클라이언트는 /items/?skip=0&limit=10과 같이 요청을 보낼 수 있으며, 서버는 해당 파라미터를 활용하여 데이터를 조회합니다.

2. 데이터베이스 쿼리 최적화하기

FastAPI는 SQLAlchemy와 함께 사용될 때 특히 장점을 발휘합니다. SQLAlchemy는 데이터베이스 쿼리 작성에 중점을 두고 있는 ORM(Object Relational Mapping) 라이브러리로, 데이터베이스와의 상호작용을 추상화하고 효율적인 쿼리를 작성할 수 있게 도와줍니다. 예를 들어, 다음과 같이 SQLAlchemy를 사용하여 데이터를 조회하는 코드를 작성할 수 있습니다.

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

app = FastAPI()

engine = create_engine("sqlite:///mydatabase.db")
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 10):
    db = SessionLocal()
    stmt = select()
    stmt = stmt.offset(skip).limit(limit)
    results = db.execute(stmt).fetchall()
    return {"items": results}

위의 코드에서는 SQLAlchemy를 사용하여 mydatabase.db에 접속하고, 세션을 생성한 후 offsetlimit를 활용하여 데이터를 조회하고 반환합니다. 이를 통해 데이터베이스에서 효율적으로 필요한 데이터를 가져올 수 있습니다.

3. 쿼리 결과 캐싱하기

FastAPI에서는 데이터베이스의 쿼리 결과를 캐싱하여 불필요한 쿼리 실행을 방지할 수 있습니다. 이를 통해 서버의 부하를 줄이고 응답 시간을 단축시킬 수 있습니다. 예를 들어, cachetools라이브러리를 사용하여 쿼리 결과를 캐싱할 수 있습니다. 다음은 예시 코드입니다.

from fastapi import FastAPI
from fastapi_cache import make_cache_decorator
from cachetools.keys import hashkey
from cachetools import TTLCache

app = FastAPI()
cache = TTLCache(maxsize=100, ttl=300)

make_cache = make_cache_decorator(cache, key_builder=hashkey)

@app.get("/items/{item_id}")
@make_cache
async def read_item(item_id: int):
    # Here, you would normally query the database for the item
    # For the sake of simplicity, we'll just return a dummy item
    return {"item_id": item_id, "name": "Item " + str(item_id)}

위의 코드에서 read_item 함수는 item_id에 따라 아이템을 조회하는 엔드포인트입니다. make_cache 데코레이터를 사용하여 쿼리 결과를 캐싱하고, 일정 시간 동안 캐시를 유지할 수 있습니다.

결론

FastAPI에서 효율적인 쿼리 작성을 위해 쿼리 파라미터를 활용하고, 데이터베이스 쿼리를 최적화하며, 쿼리 결과를 캐싱하는 방법을 알아보았습니다. 이를 통해 빠르고 효율적인 API를 개발할 수 있습니다. FastAPI 공식 문서와 SQLAlchemy 문서를 참고하여 더 많은 기능을 탐색해보세요.

참고자료