터칭 데이터
장고(Django) 에러 방어 본문
투표를 고민하는 와중에 선택지사 삭제되었다면?

우리가 지난 시간 아무 것도 선택하지 않을 때는 KeyError가 일어나니 이를 try~except로 방어해줬었습니다.
그런데 Choice.DoesNotExist도 같이 에러 방어 코드로 작성해줬는데 왜 그랬을까요?
question의 상세 페이지에 들어가 투표할 때는 무조건 존재하는 choice들만이 선택지로 제공될텐데 굳이 저렇게 Choice.DoesNotExist까지 방어 코드로 작성할 필요가 있을까 의문이 드실 수도 있습니다. 그런데 한 가지 상황을 가정해 보겠습니다.
만약 우리가 위와 같이 선택지를 고민하고 있는 와중에 커피라는 선택지가 DB에서 삭제된다면 어떻게 될까요?
그리고 그 상황에서 우리가 커피를 선택하고 Vote 버튼을 눌러 투표를 했다면 어떤 상황이 벌어질까요?
만약에 그런 상황에 더해 우리가 DoesNotExist 방어 코드를 작성하지 않았다면

위와 같이 DoesNotExist 에러가 뜹니다.
하지만 방어 코드를 잘 작성했다면

우리가 커피를 선택하고 제출하는 그 사이에 커피 choice가 사라졌어도 위와 같이 polls/detail.html 로 가며 그 사이 다시 한번 상세 페이지가 그려졌기 때문에 선택이 없습니다 + 선택지가 녹차만 뜨게 됩니다.
브라우저가 엉뚱한 값을 전달할 때 조금 더 명확한 에러 메세지 전달하기

원래 녹차의 ID였던 13대신 이번 학습에 존재할리없는 99999가 value로 전달되는 경우를 가정하겠습니다.
그런 경우가 있겠냐고 물으시겠지만 브라우저가 늘 정확한 값만을 전달한다는 보장이 없는 것도 사실입니다.
이렇게 엉뚱한 값이 전달되었을 때 어떤 ID가 전달되어서 에러가 발생했는지 메세지를 명확하게 띄워주는 방어 코드를 미리 작성해둔다면 훗날 문제가 발생해 디버깅을 할 때에 크게 도움이 될 것입니다.

뷰에서 위와 같이 작성하면

어떤 choice의 id가 무엇이었기에 선택이 없었는지 id까지 같이 볼 수 있게 됩니다.
'장고 (Django)' 카테고리의 다른 글
장고(Django) 결과(result) 조회 페이지 (0) | 2023.11.03 |
---|---|
장고 (Django) 에러 방어하기 2 (0) | 2023.11.03 |
장고(Django) 폼(Forms) (0) | 2023.11.03 |
장고(Django) 404 에러 처리하기 (0) | 2023.11.03 |
장고(Django) 상세(detail) 페이지로의 링크 추가하기 (0) | 2023.11.03 |