오류 응답과 상태 코드 테스트
14강. 오류 응답과 상태 코드 테스트
1. 이번 강의에서 해결할 문제
게임 기록·랭킹 API를 테스트하면서 의도적인 실패 요청으로 오류 상태와 JSON 형식을 검증하는 문제를 해결합니다. 수동으로 한 번 성공하는 데서 끝내지 않고 같은 결과를 다시 확인할 수 있는 요청으로 남깁니다.
2. 학습 목표
3. 핵심 개념
좋은 API는 성공뿐 아니라 오류도 일관된 계약을 가집니다. 400은 일반적인 잘못된 요청, 401은 인증 필요·실패, 403은 인증됐지만 권한 부족, 404는 리소스 없음, 409는 상태 충돌, 422는 입력 검증 실패에 주로 사용됩니다. 실제 API 계약이 우선이며 메시지 전문보다 안정적인 코드와 구조를 검증합니다.
실패 상황을 상태 코드에 연결하기
| 상황 | 기대 상태 | 클라이언트의 다음 행동 |
|---|---|---|
| score 필드 누락·타입 오류 | 422 | 해당 입력 필드 안내 |
| 인증 토큰 없음·유효하지 않음 | 401 | 로그인 또는 토큰 갱신 |
| 로그인했지만 관리자 기능 접근 | 403 | 권한 부족 안내, 재로그인 반복 금지 |
| 존재하지 않는 player_id | 404 | 목록으로 돌아가거나 대상 갱신 |
| 이미 존재하는 nickname 생성 | 409 | 다른 닉네임 입력 안내 |
| 처리 중 예상하지 못한 서버 오류 | 500 | 일반 오류 안내와 서버 로그 조사 |
오류 JSON의 가장 작은 계약
{
"error": {
"code": "PLAYER_NOT_FOUND",
"message": "플레이어를 찾을 수 없습니다."
}
}
테스트는 번역이나 문구 수정에 자주 바뀌는 message 전문보다 status, error.code, 필수 필드 구조를 우선 검증합니다. 사용자에게는 안전한 메시지를 주고, 스택·SQL·서버 파일 경로 같은 내부 진단 정보는 서버 로그에만 남깁니다.
4. 단계별 실습
실습 경로: C:\dev\game-ranking-api-tests
실행 전 상태: 성공 요청이 먼저 통과해야 합니다. 테스트용 로컬 DB와 계정을 사용하고, 실패 요청이 실제 운영 데이터나 계정을 변경하지 않는지 확인합니다.
90 Error Cases에 누락 필드 422, 없는 ID 404, 중복 닉네임 409 요청을 저장합니다.- 각 요청 이름에 기대 상태를 적습니다.
- 응답에
detail또는 프로젝트 표준error.code,error.message가 있는지 확인합니다. - 내부 스택·SQL·파일 경로가 노출되지 않는지 검사합니다.
구체적인 실패 결과 예
GET /players/999999
예상: 404
본문: detail 또는 PLAYER_NOT_FOUND 구조
금지: SQL SELECT 문, C:\... 서버 경로, Python stack trace
POST /records with {"game_name":"Rule Break"}
예상: 422 (필수 score 누락)
본문: 어느 필드 검증이 실패했는지 식별 가능
금지: 요청을 일부 저장하거나 500으로 처리
상태 코드만 맞아도 본문이 HTML 오류 페이지이거나 내부 정보가 노출되면 계약 통과가 아닙니다. 반대로 메시지 문장만 달라졌지만 안정적인 오류 코드와 구조가 같다면 테스트를 불필요하게 깨지 않도록 설계합니다.
try {
Invoke-RestMethod -Uri "http://127.0.0.1:8000/players/999999"
} catch {
Write-Host "status:" $_.Exception.Response.StatusCode.value__
Write-Host "message:" $_.ErrorDetails.Message
}
PowerShell 결과 읽기
- 존재하지 않을 가능성이 매우 높은 테스트 ID를 요청합니다.
- PowerShell은 4xx를 catch로 보내므로
StatusCode와ErrorDetails.Message를 각각 읽습니다. - status가 기대한 404인지, body가 JSON인지, 내부 정보가 없는지 별도로 판정합니다.
- API가 실제로 200을 반환한다면 테스트 데이터에 그 ID가 생겼는지 먼저 확인하고 임의로 기대값을 바꾸지 않습니다.
Postman의 버튼·탭 이름은 버전에 따라 달라질 수 있습니다. 메뉴가 다르면 설치된 앱의 도움말과 Postman 공식 문서를 먼저 확인합니다.
5. 요청과 응답이 동작하는 이유
FastAPI는 라우팅과 Pydantic 검증 단계에서 표준 오류를 만들 수 있고, 애플리케이션 예외 처리기가 도메인 오류를 통일합니다. 클라이언트는 상태 코드로 큰 범주를, JSON 오류 코드로 세부 원인을 구분합니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
다음 강의 연결
실패 계약을 구분했으므로 15강. Bearer JWT에서 인증 없음 401과 인증됐지만 권한 부족 403을 실제 헤더 조건으로 검증합니다.
오류 응답과 상태 코드 테스트 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.