✔️ Django 웹 개발
우리 costory 프로젝트에서 작성한 뷰를 한번 보자!
post_detail 의 이 부분...
post_update 의 이 부분...
그리고 post_delete 의 이 부분...
이 세 부분에서 포스트 데이터를 가져올 때 아이디를 사용해서 조회를 하고 있습니다.
그런데 만약 데이터베이스에 없는 아이디를 조회할려고 하면 어떻게 될까?
한 번 확인해보면...
서버를 실행하고 웹 페이지로 가보면...
화살표로 가리킨 게시글을 클릭하면 posts/6 인데
http://127.0.0.1:8000/posts/6/
이걸 수정해서 데이터베이스에 없는 아이디인 1000을 들어가면...
http://127.0.0.1:8000/posts/1000/
이런 식으로 에러가 발생한다.
웹 서비스를 개발할 때는 이렇게 의도하지 않은 접근 등으로 인한 다양한 에러 상황을 처리해 줘야 한다.
지금과 같은 경우에는 사용자에게 404 에러 즉 이러한 접근에 대해서는 제공할 페이지가 없다 뭐 잘못된 접근이다라는 에러 메시지를 보여주는게 좋다.
그럼 한번 구현해보겠다.
다시 views.py 로 가서 post_detail 에 에러를 처리해 주는 코드를 작성해보겠다.
우선 try 문을 사용하고 그리고 아까전에 하이라이트 된 부분을 넣어준다.
이 코드 같은 경우에는 try 문은 예외가 날만 한 코드를 적고 try 는 시도한다는 뜻이다.
그래서 단어 뜻 그대로 try 문안에 있는 로직을 일단 시도해보자는 뜻이다.
이 때, 만약에 우리가 원하는 데이터를 가지고 오지 못한다면 그러니까 우리가 요청한 post_id 에 해당하는 데이터가 데이터베이스에 없다면 Post.DoesNotExist 라는 오류가 나게 된다.
Exist 이니까 포스트가 존재하지 않다는 오류이다.
그럴 때 except 해주고 Post.DoesNotExist 를 해주고 그 다음에 raise Http404() 해서 이 Http404() 에러를 띄워주도록 하겠다.
이 Http404() 에러를 띄울려면 위쪽에 import 를 해줘야한다.
자 다음에 post_detail 로 다시 가서 코드를 한 번 더 설명해보겠다.
이 try 같은 경우에는 일단 해보라 이런 의미를 가지고 있는데 오류가 날 수도 있는 코드를 다음과 같이 넣어주고...
이 코드에서 Post.DoesNotExist() 라는 오류가 났을 때는 특정 행동을 하도록 하는 코드이다.
그리하여 에러가 없다면 context 에 우리가 들고 온 post 를 넘겨준다.
그리고 Http404 는 에러가 발생했을 때 django 가 내부적으로 가지고 있는 404 에러에 대한 뷰를 호출해서 기본 에러 페이지를 렌더 한 다음 유저에게 보여주게 된다.
한 번 서버를 실행해서 확인해보자!
다시 posts/1000 을 넘겨주면...
http://127.0.0.1:8000/posts/1000/
이런 식으로 Page not found (404) 가 보이게 된다.
그런데 이렇게 뷰 안에 이런 식으로...
데이터베이스로부터 어떠한 조건의 특정 데이터를 가져오는 일은 웹 서비스를 개발할 때 매우 자주 일어나는 일이다.
그리하여 django 는 이렇게 데이터를 조회했는데 해당 데이터가 없을 경우에는 404 에러까지 발생시키는 일련의 과정을 하나의 함수로 제공한다.
그래서 한 번 해보도록 하겠다.
import 를 하나 해줘야 하는데 get_object_or_404 를 맨 위에 넣어준다.
밑에 있는 하이라이트 된 코드 부분을 바꿔줄 것 인데 다 지우고...
post= 한 다음에 get_object_or_404() 그리고 인자로 Post 그리고 id=post_id 이렇게 변경해주도록 해준다.
그리고 다시 서버를 실행해서 확인해본다.
아까처럼 없는 거 posts/1000 으로 가보면...
http://127.0.0.1:8000/posts/1000/
똑같이 에러 메시지가 잘 출력된다.
만약에 이런 식으로 에러에 대한 처리를 해주지 않으면 지금처럼 404 에러가 아닌 500 에러 즉 서버 에러를 발생시키게 된다.
서버 에러란?
그리하여 500 에러는 어디서 발생한 에러인지 알 수 없지만 404 에러 같은 경우에는 요청에 대한 표시를 할 때 페이지가 없다는 말로 서버에 문제가 있다는게 아니라 내가 요청한 페이지가 없는 페이지구나라는 인식을 할 수 있게 된다.
앞으로 뷰에서 get 으로 데이터를 조회할 때는 get_object_or_404 를 사용해보자!
나머지 update 와 delete 도 바꿔준다.
그리고 맨 위에 import 를 한 Http404 는 지워주도록 해준다.
끝으로 :