TIL-14. westagram 로그인 구현(리뷰 추가)

2614 단어 TILWeCodeTIL

아직 리뷰 받기 전이라 수정사항이 생길 수 있다.

로그인 구현 부분이고 이메일과 패스워드 값을 받았을 때 값이 없다면 KEY_ERROR, 400 에러 반환,
이메일이나 패스워드가 잘못되었을 때 INVALID_ERROR, 401 에러 반환,
로그인에 성공했을 때 200 반환하는 것이 과제였다.

filter와 get으로 테이블에 접근해 값을 가져오는 부분에서 많이 헤맸다.
일단 들어온 값 중 이메일을 기준으로 작성했는데
post로 받은 이메일과 일치하는 값 자체가 db에 있는지 filter().exists()로 확인하고
일치하는 값이 있다면 거기서 get 메서드를 써서 해당 email의 password를
가지고 와 값을 비교했다.

이상하게 멀티플 에러가 나서 멘토님께 여쭤봤는데 프린트 문을 찍어서
어디쯤에서 오류가 나는지 확인한 후 테이블을 열어보자 해서 보니........
처음 회원가입 시 10명의 회원 모두 비밀번호를 같은 걸로 해 놓은 게 문제였다.

post로 날아온 비밀번호가 db에 존재하는지 확인하고 해당 비밀번호에 연결된 이메일을
가져오도록 get을 썼는데 비밀번호가 많으니 당연히 연결된 이메일도 많고
그런데 get 메서드로 가져오다 보니 오류가 나는 것이었다.

db의 비밀번호 값을 바꿔도 됐지만 원인을 알았으니 간단하게
뷰에서 이메일을 기준으로 패스워드를 검증하는 걸로 수정했다.
이메일은 유니크 키가 걸려 있고 중복 체크를 회원가입 단계에서 하기 때문에
get을 쓰기에 적당했기 때문이다.

정상적인 오류와 로그인 성공 값을 받은 후 깃에 올렸는데
어떤 리뷰를 주실지 기다리고 있다.


일단 첫 if문의 경우 data["email"] 이런 식으로 하면
에러가 raise 될 수 있다고 한다.

딕셔너리에 접근하는 방법은 두 가지 정도가 있는데
위 방법으로 접근하면 매칭되는 key 값이 없을 경우
except error로 빠지게 돼서 내 구문은 쓸모없게 된다고 한다.

그래서 다른 동기들 작업한 내용을 보니
try와 except를 썼던 것 같다.

나의 경우엔 data.get("email")로 접근한다면
만약 데이터가 비어 있어도 'None'을 반환하기 때문에
내 if문으로 들어가 KEY_ERROR를 반환할 수 있게 된다.

그리고 이메일과 비밀번호 일치하는지 확인하는 부분은
filter().exists()로 post 된 이메일과 같은 이메일이
존재하는지 체크하고 해당 이메일과 같은 로우의 패스워드를
get 하는 방식으로 처리했었는데 아래와 같이
심플하게 줄일 수가 있었다.

if not User.objects.filter(email=email, password=password):
	return JsonResponse({'message' : 'INVALID_USER'}, status=401)

filter로 이메일과 패스워드가 동시에 일치하는 조건을 찾으면
굳이 내가 한 중첩 if문처럼 하지 않아도
한번에 입력값과 db값의 비교가 가능해진다.

좋은 웹페이지 즐겨찾기