터칭 데이터

장고(Django) 에러 방어 본문

장고 (Django)

장고(Django) 에러 방어

터칭 데이터 2023. 11. 3. 21:25

 

 

 

 

투표를 고민하는 와중에 선택지사 삭제되었다면?

 

 

 

우리가 지난 시간 아무 것도 선택하지 않을 때는 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까지 같이 볼 수 있게 됩니다.