백엔드 기초집: 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
0 / 2Pydantic 모델과 요청 검증 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
LESSON STATUS
6강. Pydantic 모델과 요청 검증 미완료 상태학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.