위의 제목처럼 지었지만 사실 어떻게 요약해서 제목으로 적을지 가늠이 안가서 위와 같이 아무도 몰라보게 작성한 것 같다.
정리하고 싶은 문제의 핵심은 http 메시지를 다음과 같이 키의 값을 비워서 보낼 때 http post localhost:8000/blahblah name=kevin pw=
발생하는 경우가 key가 입력이 안되는 keyerror와 custom invalid response에 어디에 속하는지에 대한 궁금증에서 시작했다.
(이렇게 적어놓고보니 제목만큼이나 이해가 안가네)
우선 로그인 기능을 구현한 api에서 테스트를 진행하기로 했다.
우선은 위와 같은 메시지를 발송하는 경우가 한가지가 있다. password
라는 키를 적어주지만 그 값은 비워놓고 요청을 보내는 것이다.
보낸 결과는 "INVALID_USER"
response를 받았다.
그리고 다음은 위와 같이 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"]
라는 키(!) 로 값을 찾는 요청에서 당연히 키에러가 나게 된다.
사실 의미를 제대로 이해했다면 당연한 결과였다..... 한 번 더 개념을 제대로 이해하는 것에 중요성을 느끼는 사례였다.