MathJax.Hub.Register.MessageHook("Math Processing Error",function (message) { alert("Math Processing Error: "+message[1]); }); MathJax.Hub.Register.MessageHook("TeX Jax - parse error",function (message) { alert("Math Processing Error: "+message[1]); });
29 Jan 2021

회원가입 및 로그인 기능 구현

로그인 기능을 구현하기 앞서 여러 방법으로 구현할 수 있다는걸 구글링하면서 알게됐는데
비교적 최근 기술이면서 많이 들어본걸로 선택했다. Django restful API 서버 만들기라는 글을 참고했다.
파이참에선 서버를 돌리고, 안드로이드 스튜디오에서는 구현된 로그인 또는 회원가입 페이지에 있는 정보들을
json 파일로 만들어 POST로 HttpResponse를 보내는 방식으로 했다. 물론 DB나 체크 방법은 파이참에서 처리되도록 했다.

먼저 파이참에서의 코드는 다음과 같다.

serializers.py
views.py
settings.py
urls.py


가이드를 따라 models.py에도 내용을 추가했었으나 로그인할 때 쓰이는 authenticate 함수가 변경된 모델에서는
정상적으로 적용이 되질 못했다. 정확히는 모델을 새로 정의한 후 이용하면 DB가 기존 것과 분리되는데
authenticate는 기존 DB에만 적용이 되고 새 모델과 연동되는 DB에는 연동이 되질 않았다.
새 DB에 연결이 가능한지는 모르겠으나 방법을 찾지 못했고 딱히 커스텀할 필요성을 느끼지 못해서 기본 모델을 사용했다.
따라서 입력받는 내용은 username과 password뿐이며, models.py는 공란으로 두었다.

서버 실행 과정은 다음과 같다.
파이참 터미널에서 ../venv/Scripts로 이동한 후 activate를 치면 가상 환경으로 진입이 가능하다. (dir, cd 활용)
(터미널 내의 내용이 모두 지워지고 경로 맨 앞에 (venv)가 나타났다면 성공적으로 진입한 상태)
이후 원래 경로(../{프로젝트명})으로 돌아가서 python manage.py 0.0.0.0:8000을 치면 서버가 실행된다.
여기서 0.0.0.0은 내 PC의 IPv4 주소를, 8000은 포트를 의미한다.

파이참에서 삽질했던 에러들을 정리하면

  • 에러메시지를 나타내야하는 상황일 때 HttpResponse를 400 등으로 처리하려고 했는데
    그렇게 처리하면 code, msg가 정상적으로 전달이 되질 않았다. 때문에 200, 201 등으로 처리하도록 설정했다.

  • 로그인 과정에서 response가 항상 ‘통신 실패’인 경우가 있었는데 컴퓨터와 휴대폰이
    같은 인터넷을 사용하고 있어야 한다. Wi-Fi를 같은 걸 쓰도록 해주니 해결됐다.
    (통신 실패는 아래에 있는 안드로이드 스튜디오 코드에 언급돼 있다)

  • 모델을 설정했다면 다음 명령어를 입력해줘야 한다.
    python manage.py makemigrations : 변경사항이 있는지 탐색한 후 적용대기 상태 유지
    python manage.py migrate : 변경사항을 실제로 적용
    

    이걸 해주지 않으면 연결이 되어있지 않아 처리가 정상적으로 이뤄지지 않는다.
    변경사항은 migrations/0001_initial.py 등의 형식으로 파일이 추가되며 등록이 된다.

  • 가이드에서는 원하는 값을 request.POST.get()으로 받아 처리하던데 이것저것 건드리다보니 에러가 난무했다.
    일단 request.POST.get()는 못쓰는 상태였는데 stackoverflow에서 @api_view(['POST'])를 쓰라는 조언을 얻었다.
    근데 "detail": "Authentication credentials were not provided.“라는 에러가 등장했다!
    권한이 없다는 말인데, settings.py에서 REST_FRAMEWORK ~ ‘DEFAULT_PERMISSION_CLASSES’ 부분에
    'rest_framework.permission.DjangoModelPermissionsOrAnonReadOnly‘가 추가돼 있었다.
    비인증 요청에서는 읽기 권한만 허용한다는 말이므로 'rest_framework.permissions.AllowAny'로 바꿔줬고
    그제서야 값을 정상적으로 읽어올 수 있었다.

    실제로 서비스한다면 권한이 없는 사람이 무분별한 가입을 방지하기 위해서 제한을 걸어둬야 하겠지만
    다음 단계로 넘어가는게 일단 문제였기 때문에 제한을 풀어놓는걸로 결정했다.

    안드로이드 스튜디오에서의 코드는 여기를 참고.
    DiaryApp/app/src/main/java/com/example/newProject에서
    LoginPage.kt, SignUpActivity.kt 그리고 db/Login.kt만 보면 된다.

Location

Icheon, KR

Email

iteratively@naver.com

Social

-->