본문으로 건너뛰기
백엔드 기초집: Python FastAPILESSON 06

Pydantic 모델과 요청 검증

난이도초급
예상 시간35분
선수지식이전 강의

6강. Pydantic 모델과 요청 검증

1. 이번 강의에서 해결할 문제

클라이언트가 빈 게임 이름이나 음수 점수를 보낼 수 있습니다. 요청 본문을 신뢰하지 않고 서버 진입점에서 검증합니다.

2. 학습 목표

3. 핵심 개념

Pydantic 모델은 타입 힌트를 실행 시점의 검증 규칙과 JSON Schema로 바꿉니다. v2에서는 model_dump(), model_validate() 같은 model_ 접두사 API를 사용합니다. 기본적으로 일부 값을 변환할 수 있으므로 점수처럼 엄격한 입력이 필요하면 strict=True를 지정합니다.

4. 단계별 코드 예시

파일 경로: game-ranking-api/app/schemas.py

app/schemas.py
from typing import Annotated

from pydantic import BaseModel, Field, field_validator


class RecordCreate(BaseModel):
game_name: Annotated[str, Field(min_length=1, max_length=80)]
score: Annotated[int, Field(ge=0, le=1_000_000, strict=True)]

@field_validator("game_name")
@classmethod
def normalize_game_name(cls, value: str) -> str:
normalized = " ".join(value.split())
if not normalized:
raise ValueError("game_name은 공백일 수 없습니다")
return normalized

파일 경로: game-ranking-api/app/main.py

app/main.py
from fastapi import FastAPI, status

from app.schemas import RecordCreate

app = FastAPI(title="Game Ranking API")


@app.post("/records", status_code=status.HTTP_201_CREATED)
def create_record(payload: RecordCreate) -> dict[str, object]:
return {"id": 1, **payload.model_dump()}

실행 위치: game-ranking-api/

python -m uvicorn app.main:app --reload
Invoke-RestMethod -Method Post http://127.0.0.1:8000/records -ContentType 'application/json' -Body '{"game_name":" Rule Break ","score":1200}'
Invoke-WebRequest -Method Post http://127.0.0.1:8000/records -ContentType 'application/json' -Body '{"game_name":"","score":-1}' -SkipHttpErrorCheck

5. 코드가 동작하는 이유

FastAPI가 JSON을 읽어 RecordCreate 생성에 전달합니다. Field 제약과 validator가 성공한 뒤에만 함수가 실행됩니다. model_dump()는 검증된 모델을 dict로 직렬화하며 정규화된 게임 이름도 반영합니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

Pydantic 모델과 요청 검증 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“Pydantic 모델과 요청 검증” 작업 전 검토에서 채택해야 할 안전 기준은 무엇인가요?
  2. 문제 2‘ORM 모델을 요청 모델로 그대로 씁니다.’ 상태에 관한 “Pydantic 모델과 요청 검증” 본문의 설명으로 가장 알맞은 것은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

6강. Pydantic 모델과 요청 검증 미완료 상태