[python] Marshmallow와 FastAPI를 함께 사용하여 빠른 웹 애플리케이션 개발하기

FastAPI와 Marshmallow는 둘 다 파이썬으로 작성된 강력한 웹 프레임워크와 직렬화 라이브러리입니다. 이 두 가지를 함께 사용하면 빠른 웹 애플리케이션을 개발할 수 있습니다. FastAPI는 강력한 성능과 인터페이스 문서 자동 생성 기능을 제공하며, Marshmallow는 데이터 직렬화와 유효성 검사를 담당합니다.

Marshmallow란 무엇인가요?

Marshmallow는 파이썬 직렬화 라이브러리입니다. 이 라이브러리를 사용하면 어플리케이션의 데이터를 다른 형식(예: JSON, CSV)으로 변환하거나 다른 형식의 데이터를 어플리케이션에서 사용할 수 있는 형식(예: 객체, 딕셔너리)으로 변환할 수 있습니다. 또한 Marshmallow는 데이터 유효성 검사 기능을 갖추고 있어 잘못된 데이터가 들어오는 것을 방지할 수 있습니다.

FastAPI와 Marshmallow를 함께 사용하기

FastAPI는 자체적으로 데이터 직렬화와 유효성 검사 기능을 제공하지만, Marshmallow를 함께 사용할 경우 더욱 강력한 기능을 사용할 수 있습니다.

먼저, FastAPI와 Marshmallow를 설치합니다:

$ pip install fastapi
$ pip install marshmallow

다음으로, FastAPI에서 사용할 모델과 스키마를 생성합니다. 모델은 데이터베이스와 상호 작용하는데 사용되고, 스키마는 데이터를 직렬화하고 유효성을 검사하는데 사용됩니다.

from fastapi import FastAPI
from pydantic import BaseModel
from marshmallow import Schema, fields
from typing import Optional

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    description: Optional[str] = None

class ItemSchema(Schema):
    name = fields.String(required=True)
    price = fields.Float(required=True)
    description = fields.String()

위의 코드 예제에서 Item 클래스는 FastAPI에서 사용할 모델입니다. ItemSchema 클래스는 Marshmallow 스키마입니다.

이제 FastAPI 엔드포인트를 생성하고 스키마를 사용하여 데이터 직렬화와 유효성 검사를 수행합니다.

@app.post("/items/")
async def create_item(item: Item):
    # 아이템 생성 로직
    return {"success": True}

@app.get("/items/{item_id}")
async def get_item(item_id: int):
    # 아이템 조회 로직
    return {"item_id": item_id}

# 스키마 사용
item_schema = ItemSchema()

@app.post("/items/with-schema/")
async def create_item_with_schema(item: Item):
    # 스키마를 사용하여 데이터 유효성 검사
    errors = item_schema.validate(item.dict())
    if errors:
        return {"errors": errors}
    # 아이템 생성 로직
    return {"success": True}

위의 코드 예제에서 /items/with-schema/ 엔드포인트에서는 스키마를 사용하여 데이터 유효성을 검사하고, 잘못된 데이터가 있는 경우 오류를 반환합니다.

마무리

FastAPI와 Marshmallow는 각각 웹 애플리케이션 개발과 데이터 직렬화, 유효성 검사를 위한 강력한 도구입니다. 이 두 가지를 함께 사용하면 더욱 강력한 웹 애플리케이션을 더 빠르게 개발할 수 있습니다.

FastAPI와 Marshmallow의 자세한 사용법은 공식 문서를 참조하시기 바랍니다: