Westagram Clone: 회원가입

1. 요구사항

  1. 데이터베이스에 테이블을 구성할 models.py작성
  2. views.py를 통한 회원가입 로직 구성
  3. 회원가입시, 동일한 사용자가 가입하지 않도록 처리
  4. 이메일이 유효한 이메일인지 처리
  5. 비밀번호는 8자 이상이도록 처리
  6. urls.py작성

2. 모델 구성

완성된 모델은 다음과 같다.

최초 모델은 email과 password가 따로 테이블을 구성하였고, foreignkey로 연결되어 있었다. 그러나 이 경우 사용자 정보를 모아 저장할 수 없어 적절하지 못한 구성이었고, 테이블을 사용자로 통합한 후 정보들을 추가해주었다. 또한, 사용자 정보가 하나씩만 존재하도록 데이터베이스에도 제한을 걸었다. 이 과정에서 생긴 오류들의 종류는 마지막에 정리하고자 한다.

3. views.py

프론트에서 들어온 요청을 처리하는 파일로, 다음과 같이 작성하였다.

이 파일에서 동일한 사용자가 가입을 시도하지 않는지 처리해야 했고, 비밀번호 또한 처리해야 했다. 회원가입은 하나의 독자적인 기능이기 때문에 class를 작성하였고, 프론트에서 데이터를 보내는 것이기 때문에 post메소드로 처리했으며, 요청의 body에 데이터가 존재하지 않는 경우 except로 예외처리를 하여 key error를 반환하도록 하였다.
그리고 이메일에 '@'와 '.'가 반드시 존재하도록 검사하기 위해 조건문을 작성하였다. 동일한 사용자가 회원가입을 시도하였을 때 에러메세지를 반환하도록 조건문을 작성하였다. 마지막으로, 입력한 비밀번호의 길이가 부족할 경우 또한 조건문으로 처리하였다.
상기한 조건문들을 모두 통과하였을 경우에 한하여, 데이터베이스에 사용자 정보를 추가하도록 하였다. 이때, 비밀번호를 암호화하기 위해 bcrypt를 사용하였는데, 이 부분에서 미처 생각치 못했던 부분이 생겨 차후에 수정하였다. 그 부분 또한 하단에서 다루고자 한다.

4. urls.py

메인 urls.py에는 user앱의 urls.py로 이동하도록 경로를 작성하였고 user앱의 urls.py에는 /signup으로 회원가입을 진행하도록 작성하였다.

오류 정리

  1. 모델 구성
    데이터베이스에 데이터가 이미 추가된 상태에서, 생성 시간 정보와 수정 시간 정보를 추가하려하자 디폴트값이 설정되어 있지 않다는 오류가 발생하였고, 값을 잘 못 입력하자 makemigrations가 된 상태에서 migrate가 되지 않았다. 그 상태에서 models.py를 수정하고 makemigrations를 다시하자, makemigrations버전과 migrate된 데이터베이스 상태에 차이가 발생하면서 먹통이 되었다. 이를 위해 migration을 리셋했다. 명령어는

    ```find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
    find . -path "*/migrations/*.pyc" -delete```

    였다. 이는 그동안 진행한 migration절차기록을 모두 지워 초기화하는 것으로, 이때 init파일은 migration을 실행할 때 필요한 정보들이 들어있기 때문에 지워선 안된다. 그 이후 데이터베이스도 지우고 다시 생성한 뒤 migration을 진행하자 최종 모델로 생성되었다.

  2. 암호화
    bcrypt를 이용한 암호화 과정에서, hashpw/encode/gensalt까지만 입력하고 저장을 했었다. 그러자 로그인을 구현하는 과정에서 비밀번호를 비교할 수 없는 문제가 생겼는데, 이는 평문을 encode하면 byte타입으로 변환되고, 이것이 바로 데이터베이스에 저장된다. 그 경우 비밀번호를 로그인 과정에서 비교할 때, 복호화를 위해 다시 encode해야하는데, 이 과정에서 문제가 생긴 것으로 파악하였다. 이를 막기 위해서, 처음에 데이터베이스에 저장을 할 때 byte타입이 아닌 str타입으로 저장을 할 필요가 있으며, 이는 암호화 코드에 decode('utf-8')을 더해주는 것으로 해결이 가능했다.

좋은 웹페이지 즐겨찾기