FastAPI 애플리케이션의 성능을 개선하기 위해 많은 자료를 찾아보고 정리해봅니다.
예제 소개
다음은 FastAPI의 기본적인 엔드포인트 예제입니다. Product라는 Pydantic 모델을 정의하고, products 리스트를 반환하는 엔드포인트를 구현했습니다. 각 섹션에서 이 코드를 조금씩 최적화하며 개선해 보겠습니다.
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Product(BaseModel):
product_id: str
price: float
@app.get("/products/", response_model=list[Product])
def read_products():
products = [Product(product_id="Foo", price=42.0), Product(product_id="Bar", price=36.0)]
return [product.dict() for product in products]
최적화 시작!
1. 비동기 엔드포인트 사용
엔드포인트를 async def로 정의하면 FastAPI가 요청을 비동기로 처리할 수 있습니다. 특히 I/O 작업이 많은 경우 성능이 크게 향상됩니다.
@app.get("/products/", response_model=list[Product])
async def read_products():
products = [Product(product_id="Foo", price=42.0), Product(product_id="Bar", price=36.0)]
return [product.dict() for product in products]
2. 중복된 데이터 검증 방지
FastAPI는 응답 데이터를 response_model로 자동 검증합니다. 따라서 Pydantic 모델을 별도로 생성한 뒤 다시 검증하면 불필요한 작업이 발생합니다. 딕셔너리를 직접 반환하면 검증 단계를 줄여 성능을 개선할 수 있습니다.
@app.get("/products/", response_model=list[Product])
async def read_products():
return [{"product_id": "Foo", "price": 42.0}, {"product_id": "Bar", "price": 36.0}]
3. 빠른 직렬화를 위한 orjson 사용
JSON 직렬화 성능을 개선하려면 Rust로 작성된 빠른 JSON 라이브러리인 orjson을 사용하는 것이 좋습니다.
설치:
pip install orjson
기본 응답 클래스로 설정:
from fastapi.responses import ORJSONResponse
app = FastAPI(default_response_class=ORJSONResponse)
4. 응답 검증 생략 (주의 필요)
응답 데이터가 유효하다는 확신이 있다면 response_model을 사용하지 않고 Pydantic 모델을 직접 반환하여 검증 과정을 생략할 수 있습니다. 다만, 이 경우 중요한 안전성 검사를 포기하게 되므로 주의가 필요합니다.
@app.get("/products/")
async def read_products():
products = [Product(product_id="Foo", price=42.0), Product(product_id="Bar", price=36.0)]
return products
5. uvloop 사용
I/O 작업을 더 효율적으로 처리하려면 uvloop을 설치하세요. uvloop이 설치되어 있으면 Uvicorn이 자동으로 이를 사용합니다.
설치:
pip install uvloop
6. 접근 로그 비활성화 (주의 필요)
모든 요청을 로깅하면 성능에 영향을 줄 수 있습니다. 높은 부하에서 로깅이 불필요하다면 접근 로그를 비활성화하여 약 15%의 성능 향상을 기대할 수 있습니다.
실행:
uvicorn main:app --no-access-log
7. httptools 사용
httptools는 기본 HTTP 파서(H11)보다 빠릅니다. httptools를 설치하면 자동으로 성능이 개선됩니다.
설치:
pip install httptools
결론
FastAPI의 성능 최적화는 코드베이스를 크게 변경하지 않고도 가능합니다. uvloop, httptools와 같은 라이브러리를 활용하고, 엔드포인트 구현 방식을 개선하면 애플리케이션의 처리 속도를 눈에 띄게 향상시킬 수 있습니다. 🚀