0. 204 No Content vs. 404 Not Found
최근 존재하지 않는 리소스를 삭제하라는 요청이 들어왔을 때 204(No Content)와 404(Not Found) 중 어떤 상태 코드를 반환할지 고민한 적이 있다.
처음에는 DELETE 메서드는 멱등성을 가져야 하기 때문에 항상 같은 상태 코드를 반환할 수 있는 204가 적합하다고 생각했다.
그러나 리서치를 진행하면서 내가 멱등성에 대해 오해를 하고 있었다는 사실을 알게 되었다.
Dave Callan의 포스팅을 기반으로 적절한 상태 코드 선택 방법과 멱등성에 대한 오해를 풀어보겠다.
In a REST API should we return 204 (No Content) or 404 (Not Found) for a HTTP DELETE request when the item to delete is already
I took polls on my LinkedIn and X asking about what we should do in the scenario where we have … Continue reading In a REST API should we return 204 (No Content) or 404 (Not Found) for a HTTP DELETE request when the item to delete is already deleted?
davecallan.com
1. DELETE 요청 후 상태 코드 선택
이미 삭제된 항목에 대해 두 번째 혹은 이후의 DELETE 요청이 들어왔을 때, 204(No Content)와 404(Not Found) 중 무엇이 적합한지에 대해서는 의견이 다양하다.
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가 더 명확하다.
정답은 존재하지 않고 팀 내부 협의를 통해 프로젝트에 적합한 상태 코드를 고른다면 그것이 좋은 해결 방법이 될 것이다.
'공부' 카테고리의 다른 글
SQLAlchemy와 Session (0) | 2025.05.05 |
---|---|
FastAPI에서 다형성 요청 처리하기 (0) | 2025.04.19 |
FastAPI에서 StreamingResponse 활용 시 DB 세션 관리 (0) | 2025.03.30 |
Triton Inference Server와 비동기 gRPC로 통신하기 (0) | 2025.02.11 |
FastAPI의 페이지네이션 성능 개선기 (0) | 2025.01.30 |
댓글