프로덕션 백엔드 API 캡스톤 · HTTP와 리소스 보안 · 이론
함수가 아니라 실행 중인 HTTP 경계를 시험하라
한 줄 요약
API는 호출 가능한 파이썬 함수가 아니라 네트워크에서 메서드, 경로, 헤더, JSON, 상태 코드와 응답 본문으로 약속하는 프로토콜이다. 테스트는 서버를 실제 포트에 띄우고 이 경계를 통과해야 한다.
왜 순수 함수 테스트만으로 부족한가
create_order()가 올바른 딕셔너리를 반환해도 라우터가 POST 경로에 연결되지 않았거나, 인증 헤더를 읽지 않거나, 예외가 모두 500으로 변환될 수 있다. 본문 길이와 JSON 디코딩, 콘텐츠 타입, 대소문자 없는 헤더 처리도 함수 호출에서는 보이지 않는다. 그래서 독립 채점기는 임의의 루프백 포트를 확보해 app.py --host 127.0.0.1 --port ...를 기동하고 실제 HTTP 요청을 보낸다.
생성 성공은 201, 같은 명령의 재생은 200, 인증 없음은 401, 신원은 있지만 권한이 없으면 403, 잘못된 금액은 400으로 구분한다. 응답에는 생성된 정수 ID와 소유자·조직·금액·상태가 있어야 한다. 모든 응답의 X-Trace-Id는 요청을 로그와 연결하는 손잡이다. 상태 코드만 맞추고 빈 본문을 보내는 구현도, 항상 같은 정적 JSON을 돌려주는 가짜 서버도 후속 요청에서 드러난다.
현장에서 만드는 회귀 증거
테스트는 서버 준비를 /healthz로 기다리고 제한 시간 안에 준비되지 않으면 실패한다. 생성 후 같은 키와 다른 금액으로 재시도해 원래 ID와 금액이 유지되는지 본다. 생성한 리소스를 소유자가 읽고 취소할 수 있는지, 같은 조직의 다른 사용자와 다른 조직의 관리자가 거부되는지도 실제 경로로 호출한다. 프로세스 종료 후 stdout과 stderr에서 인증 값이 새지 않았는지 검사한다.
실무 판단 기준
모킹은 외부 결함을 격리할 때 유용하지만 프로토콜 계약의 유일한 증거가 될 수 없다. 빠른 정책 단위 테스트와 실제 HTTP 행동 테스트를 함께 둔다. 다음 레슨에서는 이 경계가 누가 어떤 리소스에 무엇을 할 수 있는지 판단하도록 인증과 인가를 분리한다.