완성된 결과는 약 200~300줄의 Python 코드로 구성된 단정한 REST 서비스가 된다. 이 퀘스트의 모든 트랙을 한 번씩 직접 적용하는 종합 연습이다.
품질 기준
엔드포인트가 동작하면 다음 기준으로 구현을 점검한다.
curl -v로 엔드포인트를 하나씩 호출하고 상태 코드가 명세와 일치하는지 확인한다.
같은 Idempotency-Key로 POST를 두 번 보내 항목이 하나만 생성되는지 확인한다.
오래된 ETag와 최신 ETag로 조건부 GET을 보내 200과 304가 정확히 구분되는지 확인한다.
오래된 If-Match로 PUT을 보내 412가 반환되는지 확인한다.
잘못된 본문을 보내 구조화된 오류 응답에 code, message, request_id가 모두 포함되는지 확인한다.
/docs에서 Swagger UI가 모든 엔드포인트와 타입을 올바르게 표시하는지 확인한다.
의도적으로 rate limit을 초과해 Retry-After 헤더가 반환되는지 확인한다.
지원이 중단된 route를 호출해 Sunset 헤더가 반환되는지 확인한다.
각 확인 과정은 프로토콜이 설계한 대로 동작한다는 사실을 직접 검증하는 단계다. 이 경험이 쌓이면 개별 개념이 실무적인 감각으로 연결된다.
이 종합 과제는 단순한 프로젝트가 아니라 설계 반사 신경을 만드는 훈련이다. 하나의 서비스에 Location, ETag, If-Match, 412, correlation ID, 구조화된 오류 응답, OpenAPI, Sunset 헤더를 직접 연결하면 각 개념의 역할이 선명해진다. 이후 REST API를 설계할 때는 모든 바이트와 헤더의 의도를 설명할 수 있게 된다.
추가 도전 과제
기본 명세를 완성한 뒤에는 다음 확장을 선택적으로 시도할 수 있다.
불투명한 토큰 대신 JWT 추가. PyJWT로 검증하되 알고리즘을 명시적으로 고정하고, claims에 sub와 exp를 포함한다.
SSE 엔드포인트 추가 항목이 생성될 때 이벤트를 스트리밍한다.
WebSocket 엔드포인트 추가 양방향 협업 편집을 구현한다.
메모리 저장소 대신 Redis를 Idempotency-Key 중복 제거 저장소로 사용한다.
OpenTelemetry traceparent 전파 추가 분산 추적 정보를 전달한다.
OpenAPI 명세에서 TypeScript SDK를 생성해 작은 React 프런트엔드에서 사용한다.
각 확장은 관련 트랙을 한 단계 더 깊이 연습하는 선택 과제다. 종합 과제의 필수 조건은 아니며, 필요한 영역을 골라 확장하면 된다.
동작하는 참고 사례로서의 cwkPippa
구현 중 막히는 부분이 있다면 cwkPippa 소스 코드를 동작하는 사례로 참고할 수 있다. FastAPI 미들웨어 순서는 backend/main.py, 스트리밍 응답은 backend/adapters/claude.py, 복구와 멱등성은 backend/store/conversations.py에서 살펴볼 수 있다. 구체적인 질문이 생겼을 때는 입문서를 처음부터 다시 읽기보다 실제 운영 코드를 확인하는 편이 효과적이다. 코드를 그대로 복사하기보다 패턴이 현실에서 어떻게 연결되는지 분석하는 것이 목적이다.
Code
종합 과제 scaffold — 인증, CORS, ETag 계산, 201과 Location·python
FastAPI로 종합 과제의 /items 서비스를 구현한다. curl -v로 모든 엔드포인트를 호출하고, 각 상태 코드와 헤더(ETag, Location, Cache-Control, Vary, Retry-After, Sunset, X-Request-ID, WWW-Authenticate)가 올바르게 반환되는지 확인한다. 보너스 과제로 각 엔드포인트를 호출하고 응답 형태를 검사하는 작은 자동화 test suite를 작성한다. 이 suite는 이후 변경으로부터 동작을 보호하는 회귀 test가 된다. 추가 보너스 과제로 OpenAPI 명세에서 TypeScript SDK를 생성하고, 그 SDK를 처음부터 끝까지 사용하는 작은 클라이언트 script를 작성한다.
Hint
코드 블록의 FastAPI scaffold에서 시작해 기능을 하나씩 확장한다. 모든 기능을 한 번에 작성하지 말고, 다음 기능을 추가하기 전에 curl로 현재 구현을 검증한다. 자동화된 test suite는 명세를 언제든 다시 실행할 수 있는 검사로 바꾼다. TypeScript SDK 예제까지 완성하면 OpenAPI 명세에서 타입이 지정된 클라이언트와 동작하는 앱으로 이어지는 전체 흐름을 확인할 수 있다.
Progress
Progress is local-only — sign in to sync across devices.