FastAPI — 타입이 곧 계약이다 · 계약과 수명 · 실습
새는 필드와 멈추는 루프
목표
실무에서 FastAPI 로 가장 자주 터지는 두 가지를 직접 일으키고 고칩니다.
- 응답에 비밀 필드가 새는 것 (3 → 4단계)
async def안의 블로킹이 서버 전체를 멈추는 것 (7단계)
규칙
- 파일은 전부
/root/work/api에 만듭니다. - 앱 인스턴스 이름은 반드시
app, 저장소 의존성 이름은get_store로 - 채점기는 여러분의
app.py를 직접 불러와 요청을 넣어 봅니다.
하세요. 채점기가 그 이름으로 불러옵니다.
uvicorn 이 떠 있지 않아도 채점됩니다(1단계만 예외 — 실제로 띄워야 합니다).
서버 띄우기
cd /root/work/apiuvicorn app:app --host 0.0.0.0 --port 8000 > /tmp/uv.log 2>&1 &curl -s localhost:8000/healthz--reload 는 쓰지 마세요. 파일을 고쳤으면 kill %1 후 다시 띄우는 편이
무엇이 돌고 있는지 분명합니다.
단계
1. /healthz → 01-healthz.txt
2. Pydantic 검증, 422 → 02-422.json
3. 일부러 유출 → 03-leak.json
4. response_model 로 차단
5. HTTPException 404
6. Depends(get_store)
7. async def vs def → 07-block.txt · 07-unblock.txt
8. dependency_overrides 테스트
9. 정리 → 09-notes.md
참고
검증 코드를 손으로 쓰지 마세요. if not isinstance(...) 를 쓰고 있다면
타입 힌트가 할 일을 뺏은 것입니다.
단계 9개
- 서버를 띄운다
- 잘못된 입력을 거절시킨다
- 비밀 필드를 일부러 흘려 본다
- 출력 모델로 막는다
- 없는 것에는 404 를 준다
- 의존성으로 저장소를 주입한다
- 이벤트 루프를 멈춰 보고 고친다
- 의존성을 갈아 끼워 테스트한다
- 두 사고를 요약한다