추가 데이터 타입
추가 데이터 타입 (Extra Data Types)
지금까지는 str, int, float, bool 같은 흔한 타입을 썼는데, FastAPI는 그것보다 훨씬 다양한 표준 Python 타입도 그대로 지원해요. 선언만 하면 나머지(에디터 지원, 요청 데이터 변환, 응답 데이터 변환, 데이터 검증, 자동 문서화)는 전부 FastAPI가 알아서 처리해요.
출처: 공식문서
다른 데이터 타입들 (Other data types)
FastAPI(정확히는 Pydantic)가 지원하는 추가 타입들을 살펴볼게요.
UUID: 표준 "범용 고유 식별자(Universally Unique Identifier)"로, 많은 데이터베이스와 시스템에서 ID로 흔히 쓰여요. 요청·응답에서는str로 표현돼요.datetime.datetime: Python의datetime.datetime. 요청·응답에서는 ISO 8601 형식의str로 표현돼요. 예:2008-09-15T15:53:00+05:00.datetime.date: Python의datetime.date. 요청·응답에서는 ISO 8601 형식의str로 표현돼요. 예:2008-09-15.datetime.time: Python의datetime.time. 요청·응답에서는 ISO 8601 형식의str로 표현돼요. 예:14:23:55.003.datetime.timedelta: Python의datetime.timedelta. 요청·응답에서는 총 초 수를 나타내는float로 표현돼요. Pydantic이 "ISO 8601 시간 차이 인코딩"으로도 표현할 수 있게 해 주는데, 자세한 내용은 Pydantic 문서에서 확인할 수 있어요.frozenset: 요청·응답에서set과 동일하게 취급돼요.- 요청에서는 리스트가 읽혀서 중복을 제거하고
set으로 변환돼요. - 응답에서는
set이list로 변환돼요. - 생성되는 스키마에서는
set값이 유일하다고(JSON Schema의uniqueItems) 명시돼요.
- 요청에서는 리스트가 읽혀서 중복을 제거하고
bytes: 표준 Pythonbytes. 요청·응답에서는str로 취급돼요. 생성되는 스키마에서는binary"형식(format)"의str로 명시돼요.Decimal: 표준 PythonDecimal. 요청·응답에서는float와 동일하게 처리돼요.
유효한 Pydantic 데이터 타입 전체 목록은 Pydantic 데이터 타입 문서에서 확인할 수 있어요.
예시 (Example)
이 타입들을 실제로 어떻게 쓰는지, 한 함수에 여러 타입을 섞어 본 예시를 볼게요:
from datetime import datetime, time, timedelta
from uuid import UUID
from fastapi import Body, FastAPI
app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
start_datetime: datetime = Body(),
end_datetime: datetime = Body(),
process_after: timedelta = Body(),
repeat_at: time | None = Body(default=None),
):
start_process = start_datetime + process_after
duration = end_datetime - start_process
return {
"item_id": item_id,
"start_datetime": start_datetime,
"end_datetime": end_datetime,
"process_after": process_after,
"repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}
함수 안의 파라미터는 자연스러운 데이터 타입 그대로예요. 그래서 예를 들어 평범한 날짜 연산을 바로 할 수 있어요.
start_process = start_datetime + process_after—datetime과timedelta를 더하면datetime이 나와요.duration = end_datetime - start_process— 두datetime을 빼면timedelta가 나와요.
사용자가 JSON으로 보낼 때는 이 값들이 위에서 설명한 형태(예를 들어 item_id는 UUID 문자열, 날짜는 ISO 8601 문자열)로 옵니다. FastAPI가 자동으로 변환해 주니 우리는 Python 타입 그대로 다루면 돼요.
이렇게 하면:
item_id는 경로 파라미터의UUID라서, 유효한 UUID가 아니면 오류가 나요.start_datetime,end_datetime은 ISO 8601 날짜 문자열로 받아datetime으로 변환돼요.process_after같은timedelta는 초 수(float)로 받아요.repeat_at은 시간 문자열로 받되None이 허용되는 선택값이에요.
즉 클라이언트는 item_id에 UUID 문자열, start_datetime·end_datetime에 ISO 8601 날짜 문자열, process_after에 초 수(float), repeat_at에 시간 문자열을 보내면, FastAPI가 이를 각각 UUID, datetime, timedelta, time 타입으로 변환해서 우리 코드에 넘겨줘요. 응답으로 내보낼 때도 반대로 변환해서 JSON으로 직렬화돼요.