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