데이터가 없을때 HTTP 응답은 무엇이 맞을까

YJ·2023년 12월 20일
0
post-thumbnail

API calls and HTTP Status codes. Why you shouldn't use status 200 for… | by  Jose I Santa Cruz G | ITNEXT

우리가 알고있는 HTTP의 상태코드는 위의 사진과 같이 큰 틀로 볼 수 있다.

여기서 내가 들었던 의문 + 이 글을 쓰게 된 계기를 소개하려한다!

  1. 처음 참여했던 프로젝트에서는 데이터가 없을 시, 백엔드에서 무조건 400이나 404에러로 응답이 왔다.
  2. 내가 백엔드로 참여한 다른 프로젝트에서는, 모든 응답 처리에 성공할 시 200의 빈 페이로드로 응답했다.

딱 봐도 1번과 2번의 싱크가 맞지 않았고, 뭐가 맞는지 궁금해졌을 찰나에 나와 같은 의문점을 가지고 해결한 글을 보았다.

HTTP Status Code

우선 위의 이미지를 아래와 같이 요약할 수 있다. 다같이 한번 짚고 넘어가자!

  • 1xx(정보) : 요청을 받았으며 프로세스를 계속 진행합니다.
  • 2xx(성공) : 요청을 성공적으로 받았으며 인식했고 수용하였습니다.
  • 3xx(리다이렉션) : 요청 완료를 위해 추가 작업 조치가 필요합니다.
  • 4xx(클라이언트 오류) : 요청의 문법이 잘못되었거나 요청을 처리할 수 없습니다.
  • 5xx(서버 오류) : 서버가 명백히 유효한 요청에 대한 충족을 실패했습니다.

204 No Content

여기서 나의 의문점을 특히 자극했던 상태코드를 짚어 말한다면 204 No Content이다.
그리고 앞으로 등장할 상태코드들의 설명도 읽어보자!

204 No Content: 요청에 대해서 보내줄 수 있는 콘텐츠가 없지만, 헤더는 의미있을 수 있습니다. 사용자-에이전트는 리소스가 캐시된 헤더를 새로운 것으로 업데이트 할 수 있습니다.
400 Bad Request: 서버가 클라이언트 오류(예: 잘못된 요청 구문, 유효하지 않은 요청 메시지 프레이밍, 또는 변조된 요청 라우팅) 를 감지해 요청을 처리할 수 없거나, 하지 않는다는 것을 의미합니다.
404 Not Found: 서버가 요청받은 리소스를 찾을 수 없다는 것을 의미합니다. 404 페이지를 띄우는 링크는 대체로 브로큰 링크(broken link) 또는 데드 링크(dead link)라고 부르며, link rot 대상일 수도 있습니다.

의문점을 되짚어보면

  1. 없는 데이터를 4XX 코드로 응답하기에는 4XX코드는 '클라이언트 오류'를 뜻한다.

    나는 올바른 요청을 보냈고 데이터가 없는 경우라면 클라이언트 오류가 아니지 않나?

  2. 이 상태코드의 설명에 따르면, 데이터 요청을 했을 때 보내줄 데이터가 없다면 204 코드와 함께 데이터가 없다는 것으로 응답을 해야 맞다고 생각했다.

그래서 요리조리 다른 개발자들은 어떻게 하고있는지 찾아본 결과, 여기 데이터 없음에서의 데이터가 어떤 데이터인지에 따라 204인지 여부가 달라진다.

예시

이해를 돕기위해 여기서부터는 예시를 들어 설명하겠다!


예시는 사진과 같다.

user1이라는 사용자가 있고
user1사용자가 작성한 게시글이 user1 post1
그리고 user1사용자가 작성한 게시글 user1 post1에 달린 댓글들을 post1 comment + 숫자라고 생각해보자
(설명 편의상 user와 post를 붙인것이니 너무 불편해하지마시길...)

200 OK

자, 여기서 comment 목록을 호출하는 API가 있다고 가정해보자.
그림과 같은 상태라면, 200 OK코드와 함께 post1 comment1, post1 comment2, post1 comment3의 정보 응답하는 것이 맞다!

204 No Content

그렇다면 여기서 조회할 comment가 없는 상황이라면 어떨까?

이 경우에는, 조회할 comment가 없으므로 204 No Content로 응답한다.

404 Not Found

그럼 마지막으로, 내 의문점을 해결한 상황을 설명하겠다.

이 그림을 보면, post1 comment도 없지만, 사실상 user1 post1가 없기 때문에 post1 comment가 없는 것이 당연한 상황이다.
이럴 경우에는 잘못된 요청으로 분류되기때문에 4XX 클라이언트 오류를 반환한다.
그 중에서도 404 Not Found인 이유는 서버가 요청받은 리소스를 찾을 수 없다 (= 해당 링크가 존재하지 않는다)로 해석되기 때문이다.

마무리

나와 같은 의문점을 가진 글은 요기요 기술블로그에서 프론트앤드개발자가 작성한 글이였다.

정리를 위해 그 글을 요약해보자면...
사장님이 주문조회하는 API에서 주문이 없을 때 400이 반환되고있는 상황을 파악해보니
주문이 없는 것이 아닌, 주문을 조회할 가게가 없을 때 400이 반환되고 있었다.

주문리스트를 조회하는 API입장에서는 주문을 조회할 가게가 없기 때문에 400 Bad Request라고 판단했지만,
논의에 걸처 404 Not Found로 처리하기로 하였다고 한다.

(회고? ㅎㅎ)
내가 참여했던 프로젝트는 위와 같은 자세한 상황을 고려하지 않고 200코드에 빈값 또는 400/404코드로 응답했다.
글을 다 작성한 시점에서 돌이켜보았을 때 이는 코드를 유지보수하거나 운영하는데에 지장을 준다고 생각한다.
그리고 백엔드와 프론트엔드 사이 명확한 소통을 위해서 이런 부분이 있다면 짚고 넘어가는 것이 좋을 것 같다!

참고

0개의 댓글