개발/FastAPI

FastAPI 시리즈 4화 - 요청(Request)과 응답(Response) 데이터 핸들링: Pydantic 모델 이해하기

B컷개발자 2025. 5. 3. 09:50

FastAPI에서 Pydantic을 활용한 데이터 검증과 직렬화 처리 방식을 다룹니다. 요청 바디, 응답 스키마, 필드 유효성 검사까지 실전 예제를 중심으로 설명합니다.

 


 

FastAPI는 왜 Pydantic을 선택했을까?

 

FastAPI가 다른 Python 웹 프레임워크와 가장 뚜렷하게 다른 지점은 데이터 모델링에 Pydantic을 채택했다는 점입니다.

Pydantic은 단순한 데이터 클래스가 아니라 유효성 검사, 직렬화/역직렬화, 문서화까지 책임지는 핵심 엔진입니다.

 

즉, FastAPI는 “Pydantic 없이는 설명할 수 없는 프레임워크”입니다.

 


 

1. 요청 데이터 처리 – 

BaseModel

 사용법

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    name: str
    age: int
    email: str

@app.post("/users")
def create_user(user: User):
    return {"message": f"User {user.name} created", "user": user}

 

▶ 클라이언트 요청 JSON 예시

{
  "name": "Alice",
  "age": 25,
  "email": "alice@example.com"
}

 

▶ 주요 특징

 

  • User 클래스는 BaseModel을 상속받아 Pydantic 모델로 정의
  • FastAPI는 이 모델을 기준으로 요청 바디를 자동 파싱하고 유효성 검사
  • 타입 오류나 누락 필드가 있으면 자동으로 422 Unprocessable Entity 응답 반환

 


 

2. 필드 기본값과 선택 필드 처리

from typing import Optional

class User(BaseModel):
    name: str
    age: int = 18  # 기본값 설정
    email: Optional[str] = None  # 선택 필드

 

  • Optional[str] = None: email은 생략 가능
  • age = 18: 값이 없을 경우 기본값 18 자동 설정

 

이처럼 FastAPI는 **Pydantic 모델을 통해 데이터 계약(contract)**을 선언적으로 표현할 수 있습니다.

 


 

3. 응답(Response) 모델 지정

class UserOut(BaseModel):
    name: str
    email: str

@app.post("/users", response_model=UserOut)
def create_user(user: User):
    return user

 

  • 클라이언트가 받는 응답 구조는 UserOut을 따름
  • 서버 내부에서는 더 많은 필드를 다룰 수 있지만, 클라이언트에게는 필요한 필드만 노출

 

 

▶ 장점

 

  • 보안성: 민감한 필드(예: 패스워드, 내부 ID 등)를 응답에서 제거 가능
  • 가독성: 문서화 시 반환 구조가 명확해짐

 


 

4. 중첩 모델(Nested Models) 처리

class Address(BaseModel):
    city: str
    zip_code: str

class User(BaseModel):
    name: str
    address: Address

 

  • Pydantic은 중첩 구조도 자연스럽게 지원
  • 클라이언트 요청은 다음과 같이 구성됨
{
  "name": "Bob",
  "address": {
    "city": "Seoul",
    "zip_code": "12345"
  }
}

 

 


 

5. 유효성 검사와 예외 처리

from pydantic import Field

class Product(BaseModel):
    name: str
    price: float = Field(..., gt=0, description="Must be greater than zero")

 

  • Field(..., gt=0): 필수 입력값이며 0보다 커야 함
  • Swagger 문서에 조건과 설명이 자동 반영됨

 

💡 참고: FastAPI는 모든 유효성 검사 실패를 자동으로 잡아주고 422 오류로 반환합니다.

 


 

요약: Pydantic은 단순 검증 도구가 아니다

기능설명

유효성 검사 타입/범위/조건 기반 자동 필터링
문서화 연동 Swagger, Redoc에 API 스펙 자동 반영
중첩 모델링 복합 JSON 구조 자연스럽게 표현
응답 필터링 민감 정보 제거 및 외부용 응답 모델 구성 가능

FastAPI에서 Pydantic은 단순 보조가 아닌 중심 기술입니다.

모든 데이터 입출력 구조를 명세서처럼 선언하고, 검증하고, 문서화하는 흐름이 가능합니다.

 


 

다음 글 예고

 

FastAPI 시리즈 5화 - Swagger UI와 ReDoc: 자동 문서화의 힘

에서는 FastAPI가 어떻게 개발자의 손을 거의 거치지 않고도

완전한 API 문서 시스템을 자동으로 구성하는지,

Swagger UI와 ReDoc 활용법을 중심으로 다룹니다.

LIST