220208 TIL

klucas·2022년 2월 8일
0

TIL DAY 173

오늘 배운 일

✔️ Django 웹 개발

1. 가져올 데이터가 존재 하지 않는다면?

우리 costory 프로젝트에서 작성한 뷰를 한번 보자!

post_detail 의 이 부분...

views.py

post_update 의 이 부분...

그리고 post_delete 의 이 부분...

이 세 부분에서 포스트 데이터를 가져올 때 아이디를 사용해서 조회를 하고 있습니다.

그런데 만약 데이터베이스에 없는 아이디를 조회할려고 하면 어떻게 될까?

한 번 확인해보면...

서버를 실행하고 웹 페이지로 가보면...

http://127.0.0.1:8000/posts/

화살표로 가리킨 게시글을 클릭하면 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 문을 사용하고 그리고 아까전에 하이라이트 된 부분을 넣어준다.

views.py

이 코드 같은 경우에는 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 는 지워주도록 해준다.

끝으로 :

  • 오늘은 get 을 사용할 때 발생할 수 있는 예외 처리 방법을 알아보았다.
  • 데이터베이스에서 데이터를 조회할 때는 데이터가 없을 수도 있기 때문에 get 을 이용해서 조회할 때는 get_object_or_404 를 사용해보자!
profile
하루를 의미있게 살자!

0개의 댓글