Django 회원가입, 로그인

14593 단어 djangoTILTIL

westagram project를 진행하면서 mission1,2단계인 초기개발세팅과 모델링을 완료하였다. 이제 3,4단계인 회원가입과 로그인 기능을 구현해볼 차례인데 각종 잘못된 접근에 따른 에러 메시지를 반환하고 일정 조건을 만족해야만 성공 메시지를 반환하도록 view를 작성해보자.


1)  회원가입


User Model

# users/models.py

class User(models.Model):
    name         = models.CharField(max_length=30)
    email        = models.EmailField(max_length=50, unique=True)
    password     = models.CharField(max_length=120)
    phone_number = models.CharField(max_length=20)

    class Meta:
        db_table = 'users'

email은 중복 생성이 불가능하므로 unique속성을 넣어주었다.

validation 파일

import re

from django.core.exceptions import ValidationError

def validate_email(email):
    regex_email    = '^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$'

    if not re.match(regex_email, email):
        raise ValidationError('INVALID_EMAIL')

def validate_password(password):
    regex_password = '^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!#%*?&]{8,18}$'

    if not re.match(regex_password, password):
        raise ValidationError('INVALID_PASSWORD')

내장모듈은 re를 import해주어 정규표현식을 사용할 수 있다. email과 password에 따른 정규표현식을 사용하여 유효성 검사를 하는데 match함수를 사용하여 조건에 맞지않으면 ValidationError를 발생시킨다.

원래는 regex변수에 re.compile함수를 사용하여 변수에 할당하였는데 자주 사용되는 경우가 아니라면 compile함수를 사용하지 않고 match함수만 사용하도록 공식문서에서 추천하고 있다. 그러니 자주 사용할 것 같은 정규표현식에만 compile함수를 사용하도록 하자.

View Class

# users/views.py

class SignUpView(View):
    def post(self, request):
        try:
            data            = json.loads(request.body)
            name            = data['name']
            email           = data['email']
            password        = data['password']
            phone_number    = data['phone_number']

            validate_email(email)
            validate_password(password)

            if User.objects.filter(email=email).exists():
                return JsonResponse({'message':'EMAIL_EXIST'}, status=400)

            User.objects.create(
                name         = name,
                email        = email,
                password     = decode_password,
                phone_number = phone_number
            )

            return JsonResponse({'message':'SUCCESS'}, status=201)

        except KeyError:
            return JsonResponse({'message':'KEY_ERROR'}, status=400)

        except ValidationError as e:
            return JsonResponse({'message':(e.message)}, status=400)

validations.py에서 작성한 validate_email, validate_password 함수를 가져와서 유효성 검사를 할 수 있게 한다. 조건에 match되지않으면 ValidationError가 발생하는데 as e로 에러 메시지를 가져와서 email error와 password error를 구분할 수 있다.

email이 이미 존재하는 경우 statuscode 400 error, keyerror일 경우 except에서 error message를 반환한다.

조건을 모두 만족할 경우 회원가입이 성공하고 statuscode 201을 반환한다.



2)  로그인


View Class

class SignInView(View):
    def post(self, request):
        try:
            data     = json.loads(request.body)
            email    = data['email']
            password = data['password']

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

            return JsonResponse({'message':'SUCCESS'}, status=200)

        except KeyError:
            return JsonResponse({'message':'KEY_ERROR'}, status=400) 

회원가입을 해서 DB에 넣은 email과 password의 정보와 일치하지 않으면 401코드를 반환한다.

email, password가 DB의 정보와 200코드를 반환한다.


회원가입, 로그인 미션 후기


아마 회원가입 미션을 수행할 때가 내 멘탈이 가장 깨져있을 때가 아닌가 싶다. 정규표현식이라는 처음 보는 개념을 사용해서 코드를 짜보려니 처음에는 뭔가 막막한 기분이 들었고 ValidationError는 공식문서에서 봐도 이해가 되지않아서 여러군데에서 정보를 찾아봐도 정리가 되지 않아 자괴감이 들 정도였다.

한번 멘탈이 깨지기 시작하니 온갖 잡생각이 밀려들어와 진행이 힘든 상황이었는데 휴식을 충분히 취하고나서 쓸데없는 생각을 하지않고 차근차근 할 수 있는것들을 해가니 여차저차 코드를 완성시킬 수 있었다.
(그 후로도 무한 피드백을 들었지만...)

가장 충격적이었던건 내가 알고있었다고 생각했던 부분이 멘토님께 피드백을 듣고나니 전혀 아니었다는것을 깨닫게 된 부분이다. 멘토님이 코드한줄마다 왜 이런 코드가 작성되었는지 개념을 하나하나 이해하고 넘어가지 않으면 나중에 남는 것이 없을 수 있다고 따끔하게 지적해주셨는데 아무생각없이 완성시키기에 급급한 코딩을 하던 나의 안 좋은 학습 습관을 반성하게 되었다.

회원가입의 난관을 넘고나니 로그인 코드는 생각보다 빨리 짤 수 있었다. 로그인 코드가 회원가입 부분보다 짧은것도 있지만 역시 개념을 제대로 이해하고 모르고의 차이가 생각보다 큰 것 같다.

회원가입, 로그인 미션시기는 단순히 기능을 구현하게 된 것보다 새로운 마음가짐을 얻을 수 있는 시간이었다. 무엇보다 멘탈관리의 중요함을 절실히 느낄 수 있었는데 나름 멘탈이 약하지않다고 생각했었지만 한번 멘탈이 나가니 감당할 수가 없었고 극복하기까지의 상당한 시간이 소요되었다. 아직 남은 과정들이 한참 남았고 쉽지않다는걸 알고있기에 미리 예방주사를 잘 맞은 느낌이 들었다. 이 경험 또한 개발자 커리어를 시작하기에 앞서 좋은 지양분이 되길 바란다.

좋은 웹페이지 즐겨찾기