TIL django keyerror와 커스텀 예외처리 우선순위

0

TIL

목록 보기
18/29
post-thumbnail

위의 제목처럼 지었지만 사실 어떻게 요약해서 제목으로 적을지 가늠이 안가서 위와 같이 아무도 몰라보게 작성한 것 같다.

궁금한게 뭐야?

정리하고 싶은 문제의 핵심은 http 메시지를 다음과 같이 키의 값을 비워서 보낼 때 http post localhost:8000/blahblah name=kevin pw= 발생하는 경우가 key가 입력이 안되는 keyerrorcustom invalid response에 어디에 속하는지에 대한 궁금증에서 시작했다.
(이렇게 적어놓고보니 제목만큼이나 이해가 안가네)

부딪혀 보자! 경우의 수 2가지

우선 로그인 기능을 구현한 api에서 테스트를 진행하기로 했다.

키는 입력하지만 값은 입력안하는 경우 -1번경우

우선은 위와 같은 메시지를 발송하는 경우가 한가지가 있다. password 라는 키를 적어주지만 그 값은 비워놓고 요청을 보내는 것이다.

보낸 결과는 "INVALID_USER" response를 받았다.


키를 아예 입력안한 경우- 2번경우


그리고 다음은 위와 같이 key값을 아예입력은 안한 경우가 있다.


그 결과는 "INVALID_KEY" response를 받았다.

왜 차이가 나는지 출력값으로 비교해보기

조금 더 확실히 차이가 왜 일어나는 지 확인해보기 body의 담긴 데이터의 출력값을 확인해보기로 했다. 요청값은 동일하게 password=으로 비워두고 요청을 보냈다.


우선 default값을 설정하기 위해서 단순히 check라는 문구만 출력을 해보았다.

그 결과는 당연하게도 check만 서버결과에 찍힌다.



이제 비교하기위해서 body의 담긴 데이터의 출력값을 check와 같이 출력해보았다.


결과는 위와 달리 check 앞에 공간이 있다! (기둥 옆에 공간 있어요)

결론은??

결과를 해석을 해보면 키는 있지만 빈칸으로 보낸 결과는 완벽한 빈칸이 아니라 space 한 칸(?) 으로 잡히게 된다. 즉 키에 대한 값은 있지만 그게 공백(정확한 의미의 공백이 아닌 space 한 칸)인 것이다.

둘의 차이를 정리하면 HTTP 요청을 보낼 때 필요한 key를 아예 입력하지 않으면 key error가 발생하고 key를 입력했지만 그 키에 맞는 값을 빈칸으로 보내면 space 1칸으로 입력이 되어 예외처리로 전달된다.


정의부터 다시 접근해보자!

딕셔너리에서 발생하는 KeyError라는 것 자체가 "키"에서 발생하는 에러기 때문에 위와같은 문제가 발생했다. KeyError는 딕셔너리에 "없는" 키에 접근할 때 발생한다. 따라서 위와같이 password라는 키는 딕셔너리에서 조회가능한 키이고(다만 값이 없을 뿐) 그래서 keyerror는 발생하지 않는다!
반면에 요청 자체에서 password라는 키를 넣어주지 않으면 data["password"]라는 키(!) 로 값을 찾는 요청에서 당연히 키에러가 나게 된다.


사실 의미를 제대로 이해했다면 당연한 결과였다..... 한 번 더 개념을 제대로 이해하는 것에 중요성을 느끼는 사례였다.

profile
기록을 통해 한 걸음씩 성장ing!

0개의 댓글