예상 실패와 server bug를 다른 가지로 보낸다

모든 RuntimeException을 400으로 숨기지 않고 client가 고칠 수 있는 실패와 운영자가 조사할 결함을 분리한다.

이 실패의 원인과 복구 주체는 누구인가?
MISSING

404 Not Found

요청한 resource가 현재 존재하지 않는다.

STATE

409 Conflict

resource의 현재 상태와 command가 충돌한다.

INPUT

400 Validation

client가 수정 가능한 field 오류를 반환한다.

BUG

500 + request ID

내부 정보는 숨기고 원인 로그와 trace를 남긴다.

핵심: 상태 코드는 예외 클래스 이름이 아니라 실패 의미와 다음 행동을 표현해야 한다.