
0. 204 No Content vs. 404 Not Found
최근 존재하지 않는 리소스를 삭제하라는 요청이 들어왔을 때 204(No Content)와 404(Not Found) 중 어떤 상태 코드를 반환할지 고민한 적이 있다.
처음에는 DELETE 메서드는 멱등성을 가져야 하기 때문에 항상 같은 상태 코드를 반환할 수 있는 204가 적합하다고 생각했다.
그러나 리서치를 진행하면서 내가 멱등성에 대해 오해를 하고 있었다는 사실을 알게 되었다.
Dave Callan의 포스팅을 기반으로 적절한 상태 코드 선택 방법과 멱등성에 대한 오해를 풀어보겠다.
1. DELETE 요청 후 상태 코드 선택
이미 삭제된 항목에 대해 두 번째 혹은 이후의 DELETE 요청이 들어왔을 때, 204(No Content)와 404(Not Found) 중 무엇이 적합한지에 대해서는 의견이 다양하다.

LinkedIn 설문조사 결과
LinkedIn에서 이 주제를 가지고 설문조사가 진행된 적이 있다.
삭제된 리소스에 대한 반복적인 DELETE 요청 시 어떤 응답을 반환할지 묻는 설문에서 약 57%가 404를 선택했다.
RFC에서도 이 문제에 대한 명확한 지침을 제공하지 않아서인지 댓글에서도 의견이 갈렸다.
2. 각 상태 코드의 타당한 근거
사실 두 상태 코드 모두 적절한 근거가 있다.
204 응답: 이미 목적을 달성했음을 의미
우선 204(No Content)를 선택하는 입장은 DELETE 요청의 목적이 서버에서 항목을 제거하는 것이므로, 이미 그 항목이 존재하지 않는다면 요청의 목적이 이미 달성된 상태라는 점을 강조한다.
404 응답: 존재하지 않음을 명확히 알림
반대로 리소스가 이미 존재하지 않거나 처음부터 존재하지 않았다는 점을 강조하며 404 응답을 선택하는 의견도 있다.
클라이언트가 삭제 여부 자체보다 항목이 존재하지 않는 이유를 알아야 할 필요가 있다면 404 응답이 더 도움이 된다.
3. 멱등성과 상태 코드 오해
이 주제에서 멱등성(Idempotency)을 근거로 항상 204를 반환해야 한다고 주장할 수도 있다.
DELETE 요청은 멱등적이므로 첫 번째 요청과 이후 요청에서 응답 코드가 같아야 한다는 논리이다.
그러나 이는 멱등성에 대한 오해이다. 멱등성은 **“동일한 요청을 여러 번 반복해도 서버에 대한 의도된 효과가 동일한 것”**을 의미한다.
서버 상태가 동일하게 유지되는 것만을 의미할 뿐이지, 응답 코드가 항상 같아야 한다는 뜻은 아니다.
실제로 Mozilla Developer Network(MDN)에서도 DELETE 메서드는 멱등적이지만, 첫 번째 요청은 200(또는 204)을 반환하고, 이후 요청은 404를 반환할 수 있다고 명확히 설명하고 있다.
To be idempotent, only the state of the server is considered. The response returned by each request may differ: for example, the first call of a DELETE will likely return a 200, while successive ones will likely return a 404. 멱등성은 서버의 상태만을 기준으로 판단됩니다. 동일한 요청을 여러 번 보내더라도 서버 상태에 변화가 없다면 멱등한 것으로 간주합니다. 다만 각 요청의 응답 결과는 달라질 수 있습니다. 예를 들어 DELETE 요청의 첫 번째 호출은 일반적으로 200을 반환하지만, 이후 호출은 해당 리소스가 이미 삭제된 상태이므로 404를 반환할 수 있습니다. — MDN Web Docs
4. 상황에 맞는 선택
204와 404 중 어떤 응답을 선택할지는 클라이언트의 요구와 API 설계 목적에 따라 달라질 수 있다.
클라이언트가 리소스 존재 여부 자체보다 서버에 리소스가 없다는 최종 상태에 관심을 둔다면 204가 적합할 수 있다.
리소스가 이전에 삭제되었다는 사실을 명시적으로 알릴 필요가 있다면 404가 더 명확하다.
정답은 존재하지 않고 팀 내부 협의를 통해 프로젝트에 적합한 상태 코드를 고른다면 그것이 좋은 해결 방법이 될 것이다.
