백엔드 기초집: Python FastAPILESSON 07
응답 모델과 상태 코드
난이도초급
예상 시간35분
선수지식이전 강의
7강. 응답 모델과 상태 코드
1. 이번 강의에서 해결할 문제
서버 내부 dict를 그대로 반환하면 나중에 비밀 필드가 응답에 섞일 수 있습니다. 클라이언트가 받을 출력 계약과 상태 코드를 명시합니다.
2. 학습 목표
3. 핵심 개념
응답 모델은 문서용 타입만이 아니라 실제 출력 필터입니다. 서버 코드가 예상하지 못한 필드를 포함해도 선언한 필드만 JSON에 남습니다. 반환값이 모델과 맞지 않으면 서버 구현 오류로 취급되므로 계약 위반을 일찍 발견할 수 있습니다.
4. 단계별 코드 예시
파일 경로: game-ranking-api/app/schemas.py
app/schemas.py
from datetime import datetime, timezone
from pydantic import BaseModel, ConfigDict
class RecordCreate(BaseModel):
game_name: str
score: int
class RecordRead(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: int
game_name: str
score: int
created_at: datetime
파일 경로: game-ranking-api/app/main.py
app/main.py
from datetime import datetime, timezone
from fastapi import FastAPI, status
from app.schemas import RecordCreate, RecordRead
app = FastAPI(title="Game Ranking API")
@app.post("/records", response_model=RecordRead, status_code=status.HTTP_201_CREATED)
def create_record(payload: RecordCreate) -> dict[str, object]:
return {"id": 1, **payload.model_dump(), "created_at": datetime.now(timezone.utc), "internal_note": "숨김"}
@app.delete("/records/{record_id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_record(record_id: int) -> None:
return None
실행 위치: game-ranking-api/
python -m uvicorn app.main:app --reload
Invoke-WebRequest -Method Post http://127.0.0.1:8000/records -ContentType 'application/json' -Body '{"game_name":"Rule Break","score":1200}' | Select-Object StatusCode, Content
Invoke-WebRequest -Method Delete http://127.0.0.1:8000/records/1 | Select-Object StatusCode, Content
5. 코드가 동작하는 이유
response_model=RecordRead가 반환 dict를 검증하고 internal_note를 제거합니다. ConfigDict(from_attributes=True)는 다음 ORM 단계에서 객체 속성도 읽게 합니다. 204 응답은 본문을 가지지 않으므로 함수가 None을 반환합니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
MINI QUIZ
0 / 2응답 모델과 상태 코드 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
LESSON STATUS
7강. 응답 모델과 상태 코드 미완료 상태학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.