데이터가 없을 때 200인가 404인가?

HTML 프로토콜의 명세 중에는 요청에 대한 응답의 형태를 구분할 수 있는 HttpStatusCode가 있습니다. 이를 보고 클라이언트는 어떤 응답을 받게 되는지 판단을 할 수 있게 되죠. 이때, 없는 데이터를 요청한 경우에 대해서 응답의 HttpStatusCode를 무엇으로 전달해야 할지에 대한 글이 있어 저의 생각과 함게 공유하려 합니다. 사실 이 글을 보기 전 비슷한 시점에 스터디 하고 있는 분들과 동일한 이야기가 나왔었는데 거기서 나온 이야기도 잠깐 첨언하고요.

여기서 이야기하는 명제는 "데이터가 없을 때"였습니다. 2xx는 정상, 3xx는 리다이렉트, 4xx는 클라이언트의 잘못된 요청, 5xx는 서버의 에러 응답을 이야기하는데 "데이터가 없다"라는 어느 범주에 속하게 될까요? 마침 스터디방에서 "Get 이면 404, Find 면 204"라는 꽤 인사이트가 있는 말씀을 해주셨는데요. 거기에 "200 OK로 내려주게 되면 사용하는 쪽에서 예상하기 어려운 부분이 있다."라는 말과 함께요. 저의 생각도 동일합니다. 있어야 할 데이터를 요청한 건지, 있을지 없을지 모르는 상황에서 요청을 한 건지에 따라 결정이 될 것 같습니다. 그렇게 되면 클라이언트는 HttpStatusCode만을 가지고 처리할 수 있게 되죠. 이를 다른 측면으로 이야기하면 응답 값(body)에 대한 처리 의존성이 줄어드는 효과도 있어 보입니다. (반대로, HttpStatusCode에만 의존하게 되는)

그래서 위의 물음에는 "204"가 되야 한다고 생각합니다.

물론, 이러한 부분은 정답이 없는 부분입니다. 그래서 팀 내에서 적당한 타협(협의)을 하고 결정해야 할 문제이죠. 응답을 받고 처리하는 클라이언트 입장과, 해당 요청을 받고 응답을 내려주는 서버 입장은 '닭이 먼저냐 계란이 먼저냐' 급의 각 입장 차이가 있기 때문입니다. 그리고 무엇보다 중요한 건 그러한 컨벤션을 정했으면 앞으로의 개발은 당연하게도 정해진 방향대로 되고 이미 개발된 부분들에 대해서도 점진적으로 고쳐져야 한다는 점을 명심해야 합니다.


https://techblog.yogiyo.co.kr/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B0%80-%EC%97%86%EC%9D%84-%EB%95%8C-200%EC%9D%B8%EA%B0%80-404%EC%9D%B8%EA%B0%80-f1c8c39ca9df

데이터가 없을 때 200인가 404인가?

Medium

데이터가 없을 때 200인가 404인가?

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2023년 12월 9일 오전 12:21

 • 

저장 199조회 42,090

댓글 5

  • 오.. 저도 글에 적진 않았지만 204가 명확한 거 아닌가 하는 생각도 들었어요. BFF 가 구성되어 있다면 FE 입장에서의 상태값만 고려하면 될 것 같은데 타협과 선택의 문제라 생각합니다.

    @고진영 정답이 없는 문제인데 글 작성해 주셔서 다시한번 고민 해볼수 있었던것 같아 좋았어요 ㅎ 글 공유 감사합니다!

  • 리소스가 없다 = 404 리소스는 있는데 알맹이가 없다 = 204 이렇게 구분하면 쉽지 않을까요? e.g. - 네이버 지도 저장 리스트 - 리스트는 있으나 저장된 항목이 하나도 없음 = 204 - 리스트 자체가 없음 = 404 - 블로그 글 - 해당 article 가 있으나 본문이 empty = 204 - 해당 article 자체가 없음 = 404 일반적으로 http status에서 2xx 류는 성공을, 4xx 류는 에러를 의미합니다.

  • 저도 204, 200 을 선호합니다. 저에게 404는 “내가 존재하지 않는 자원경로(API)를 호출했나?” 라고 여겨져서 사용하지 않는 것 같아요. 4xx 대 응답은 결국 클라이언트의 실수로 비롯되는 것인데, 클라이언트가 호출한 자원경로는 올바르나 그 자원 자체가 존재하지 않을 때 404 를 내려주는 건 부자연스럽게 느껴지네요.

  • 데이터가 없는건 200번대 영역이라고 생각합니다. 이게 웹의 역사를 이해하면 쉬운데, 과거에는 100~500번대 정한 초기에는 주소 입력 후 그 라우팅된 결과로 전달할 페이지나, 오디오, 비디오 파일이 있느냐였습니다. 즉, 데이터가 없는 경우도 <div>데이터가 없습니다.<div> 소스가 있는 html 페이지 결과를 같이 주었기 때문에 200번대였습니다. 그리고 2000년대 들어서 REST API가 발의되고 ajax라는 기술이 만들어지면서 페이지가 아닌 데이터만 왔다갔다하며 페이지를 변화시키면서 상태코드의 정의가 애매해지기 시작한겁니다. 과거에는 html를 요청했는데 데이터가 없어도 html이 왔네? 200이지! 라고 한다면 지금에는 데이터를 요청했는데 데이터가 안왔네? 라는 개념이 되어 각자 이해에 맞게 사용되고 있는 것입니다. 하지만 저 개인적으로도 위 상황에서 서버가 클라이언트가 보낸 API url 사양을 가지고 있으면 설령 데이터가 없이 없더라도 200번대 맞고 API url 사양 자체가 서버에 없을 경우에만 404를 주는게 맞다고 생각합니다.

함께 읽은 게시물

노션 템플릿들을 만들면서 적는 회고

... 더 보기

🎯 유튜브에 100번째 코딩 테스트 문제 풀이 영상을 올렸습니다!

... 더 보기

달레의 코딩 테스트

www.youtube.com

달레의 코딩 테스트

 • 

댓글 1 • 저장 26 • 조회 3,861


나는 가끔 조합형 한글의 아름다움에 대해 생각한다.


그 아름다움은 단순히 예쁜 글꼴이나 정갈한 종이 위의 자소 배열에서 끝나지 않는다. 진짜 매력은, 정밀한 정보 구조와 이산 수학적 규칙성 속에 숨어 있다.


... 더 보기

defer, 에러 핸들링과 비동기에서 어떻게 활용할까?

d

... 더 보기

defer (async throwing contexts)

iOYES

defer (async throwing contexts)


< '네이버 다녀요'라는 말에 아무도 무슨 일을 하는지는 묻지 않았다 >

1

... 더 보기