python / / 2024. 8. 16. 13:38

[fastapi] jsonable_encoder 사용하기

FastAPI의 강력한 점 중 하나는 Pydantic 모델을 사용하여 데이터 검증 및 직렬화를 쉽게 수행할 수 있다는 것이다. 이와 관련하여 jsonable_encoder는 FastAPI에서 JSON 직렬화와 관련된 중요한 기능을 제공한다.

1. jsonable_encoder란?

jsonable_encoder는 FastAPI에서 제공하는 함수로, Pydantic 모델이나 다른 데이터 구조를 JSON 직렬화 가능한 형태로 변환해준다. 이 함수는 특히 FastAPI에서 반환할 데이터를 JSON 형식으로 변환할 때 유용하다. 데이터가 JSON 직렬화 가능하지 않은 경우(예: 날짜, Enum 등), 이를 올바른 형태로 변환하여 직렬화할 수 있도록 도와준다.

2. 기본 사용법

FastAPI에서 jsonable_encoder를 사용하는 기본적인 방법은 다음과 같다:

from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
from typing import List

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    is_active: bool

@app.post("/items/", response_model=Item)
async def create_item(item: Item):
    json_compatible_item_data = jsonable_encoder(item)
    print("type(item)", type(item))  # Item
    print("type(json_compatible_item_data)", type(json_compatible_item_data))  # dict

    return json_compatible_item_data

위코드에서 Item 모델을 정의하고, FastAPI의 엔드포인트인 /items/에서 아이템을 생성한다. jsonable_encoder를 사용하여 item 인스턴스를 JSON 직렬화 가능한 형식으로 변환한 후 반환한다.

위의 예에서 item은 Item 타입으로 매핑이 되는데 이를 JSON 타입으로 변환하는데 jsonable_encoder를 사용한다. 아래에 type을 출력한 내용을 보면 다음과 같다.

print("type(item)", type(item))  # Item
item["name"] # 오류 발생

print("type(json_compatible_item_data)", type(json_compatible_item_data))  # dict
json_compatible_item_data["name"] # 정상

3. jsonable_encoder를 사용하는 이유

  1. 복잡한 데이터 구조: Pydantic 모델 이외의 복잡한 데이터 타입도 지원한다. 예를 들어 datetime, Enum, UUID와 같은 유형의 데이터를 쉽게 직렬화할 수 있다.
  2. 가독성: JSON 직렬화에 필요한 변환 과정을 간소화해준다. 이를 통해 코드의 가독성이 높아지고, 개발자는 더 적은 양의 코드를 작성할 수 있다.
  3. 유연성: 기본적으로 지원되지 않는 커스텀 타입이나 복잡한 데이터 구조를 처리할 때 유용하다.

4. 예제: 복잡한 데이터 구조

다음은 jsonable_encoder의 유용성을 보여주는 예시이다. 여기서는 날짜 정보를 포함한 복잡한 데이터 구조를 직렬화하는 방법을 보여준다.

from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
from datetime import datetime

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    created_at: datetime

@app.post("/items/")
async def create_item(item: Item):
    json_compatible_item_data = jsonable_encoder(item)
    return json_compatible_item_data

이 예제에서 created_at 필드는 datetime 타입이다. 일반적으로 JSON으로 직렬화할 수 없는 날짜 정보도 jsonable_encoder를 사용하여 적절하게 변환할 수 있다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유