404에러로 바꾸는 이유가 뭔가요? 'get_object_or_404'

조회수 1192회

장고를 공부중입니다. 강의에서 그리고 인터넷에서 모두들 'get_object_or_404'를 이용해서 DoesNotExist를 안나오게 해야한다고 가르칩니다.

둘다 오류인데 500에러(서버오류)를 404에러(클라이언트오류)로 바꾸는 이유가 궁금합니다.

  1. 서버의 오류는 아니다.
  2. client 오류이니 client가 제대로 다시 입력해라

이걸 알려주려는 것인가요?

위키를 보니 404는, “클라이언트가 서버와 통신할 수는 있지만 서버가 요청한 바를 찾을수 없다는 것을 가리키는 HTTP 표준 응답 코드이다.” 이렇게 설명합니다. 그렇다면 다른 오류(200번대, 300번대, 500번대)가 발생하면 서버와 통신이 불가능한가요?

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 바꾸는 이유는 말씀하신게 맞습니다. 클라이언트 입장에서 생각하면 상태 코드에 따라 예외 처리를 해야 할 경우도 있고 API요청이 실패했을 경우 무엇이 잘못되었는지 바로 알 수 있어야 하므로 정확한 코드 리턴이 필요합니다. 귀찮은 작업일 수 있지만 이것이 잘 된 API는 robust하고 사용자 친화적이라고 볼 수 있죠. 그리고 마지막에 물어보신건, 일단 어떤것이든 응답 코드를 받았다는건 서버와의 통신은 있었다는 의미입니다. 다만 서버에서 유효성을 판단했을 때, 예외적이거나 잘못된 접근 혹은 어뷰징을 막기 위해 에러코드를 내려서 차단하는 것이죠. doodoji 2018.10.14 15:48
  • '사용자 친화적'이라는게 큰 포인트군요..! 마지막 질문까지 놓치지 않고 대답해주신 점 정말 감사해요! 알 수 없는 사용자 2018.10.15 01:16

1 답변

  • 관련 공식 문서를 보니 그건 철학이라고 하네요.

    상위 계층에서 ObjectDoesNotExist 예외를 자동으로 잡아 내는 대신 get_object_or_404() 도움 함수를 사용하거나, ObjectDoesNotExist 예외를 사용하는 대신 Http404 를 사용하는 이유는 무엇일까요? 왜냐하면, (그것들은) model 계층을 view 계층에 연결하는 방법이기 때문입니다. (하략)

    무슨 말인가를 조금 생각해 보았는데 아마 이런 말인 거 같아요. NGINX+PHP 스택의 예를 들면, 500 에러가 떨어질 때 가장 기본적인 처리는 대략 이런 것입니다.

    이미지

    하지만 고작 (모델 계층에서) DB 쿼리 하나 실패했다고 해서 이런 식으로 "어쩌라는거냐" 싶은 웹서버 수준의 처리를 (뷰 계층에) 보여주는 것은 좋지 않죠. 그래서 Laravel 같은 괜찮은 PHP 프레임워크는 이런 식으로 그 에러를 핸들링합니다. 문제가 있다고 알려주고, 그 문제에 대한 정보를 필요한 만큼만 제공하는 겁니다.

    이미지

    아마 대부분의 강좌가 ObjectDoesNotExist 에러를 직접 떨구지 말라는 것은 그런 이유인 것 같습니다. 사용자에게 그 에러를 보내줄 수는 있겠지만, 그건 아마도 사용자에게 "이거뭐 날더러 어쩌라는거지" 같은 불필요하게 부정적이고 정보값 없는 경험을 준다는 거겠죠. 그럴 바에는 속편하게 "이거 404입니다"라고 알려주고 지나가라는 의미인 것 같습니다.

    django를 써보신 다른 분이 답변을 올리시면 이 글은 지웁니다.

    • '철학'이라는 것에 확 와닿네요. ! 그게 아니라면 딱히 큰 이유가 생각나지 않는군요.. 친절하고 빠른 답변 감사합니다 !!! 알 수 없는 사용자 2018.10.15 01:14

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)