반응형

다음과 같이 get method를 호출했다고 가정해보자.

http://example.com/request/animal?name=pig
http://example.com/request/animal?name=spider

 

pig라는 데이터는 존재하여 정상 response를 받지만
만약 spider이라는 데이터는 존재하지 않는다면

200 OK response와 empty body가 맞을까? 404 Not Found response가 맞을까? 🤔

 

결론부터 말해보자면 200과 400 중 어느 쪽이 무조건 옳다는 없다.
다만, 하나의 프로젝트에서 동일한 response를 뿌리기 위한 합의를 가지는 것은 필요해 보인다고 생각한다.

 

🚀 그렇다면 서로의 입장에 대해 파악해보자

 

✔️ 200으로 해야하는 이유

HTTP에서 이야기하는 resource를 서버에 있는 데이터와 엮지 않고 온전히 URI라고 생각을 해야한다.

즉, 서버에서 데이터 없음을 HTTP resouce와 엮지 않아야 하고 결국 URI path 자체는 존재하나 쿼리하고자 하는 값이 존재하지 않은 것이니 200 OK with empty body를 응답해야한다는 입장이다.

아래 쿠팡의 사례를 보면 좀 더 자세히 이해가 될 수 있다.

쿠팡 404 페이지 : https://www.coupang.com/vp/productsasdsasd
쿠팡 200 페이지 : https://www.coupang.com/vp/products/1229153213123123124124

 

✔️ 404로 해야하는 이유

404 NOT FOUND가 적절하다는 입장은, https://tools.ietf.org/html/rfc7231 에 근거하고 있다.

The target of an HTTP request is called a "resource"

즉, HTTP 요청의 대상이 리소스임을 생각해 본다면
서버가 정상적으로 동작함의 여부가 아니라 요청한 리소스가 정상적으로 응답이 오는가에 따라서 응답 코드를 판단해야 한다고 생각하다는 것으로, rfc7231문서에 정의된 Response Status Code 중 200과 204 두 상태 코드 모두 uri가 가리키는 resource가 존재하지 않는 경우의 상태를 나타내기는 어렵다는 주장이며, 404 상태 코드가 보다 명확하다는 입장이다.

200 status code

The 200 (OK) status code indicates that the request has succeeded.
The payload sent in a 200 response depends on the request method.

GET a representation of the target resource;

200은 요청이 성공했음을 나타내며 페이로드로 해당 resouce의 representation이 응답된다.

Aside from responses to CONNECT, a 200 response always has a payload, though an origin server MAY generate a payload body of zero length.
If no payload is desired, an origin server ought to send 204 (No Content) instead.

200은 항상 payload를 가지고 있어야 하고 응답이 없는 경우 204를 보내주어야 한다.

204 status code

The 204 (No Content) status code indicates that the server has successfully fulfilled the request and that there is no additional content to send in the response payload body.

204는 요청을 성공적으로 이행하고 응답 페이로드에 추가적으로 보낼 컨텐츠가 없는 경우를 나타낸다.

404 status code

The 404 (Not Found) status code indicates that the origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

404 응답은 서버가 타겟 리소스의 representation을 찾지 못하였거나 존재하는 사실을 밝히려 하지 않을때 사용한다.

반응형