TIL 29 | Westagram Model & SignUp Review

임종성·2021년 7월 24일
1

Django

목록 보기
10/17
post-thumbnail

Westagram project를 진행하며 github으로 협업하기 위한 초기 개발환경 세팅을 완료한 후 Modeling을 통해 Database에 Tabel을 생성하고 회원가입 기능을 SignUpView로 구현했다. 작업과정을 돌아보며 새롭게 배운 것들과 유용한 Review들을 기록해봤다.

Modeling

사용자(User)를 관리할 Class를 생성하고, 생성한 Table을 통해 회원가입 기능과 로그인 기능등을 작성하게 된다. 다음과 같은 사용자의 정보를 포함하는 User Class를 작성하자.

  • 이름
  • 이메일
  • 비밀번호
  • 연락처(휴대폰)
  • 그 외 개인정보(나이)

Class는 다음과 같이 작성했다.

from django.db import models

# Create your models here.

class User(models.Model):
    name         = models.CharField(max_length=45)
    email        = models.CharField(max_length=200, unique=True)
    password     = models.CharField(max_length=200)
    phone_number = models.CharField(max_length=45)
    age          = models.PositiveIntegerField()

    class Meta:
        db_table = 'users'

    def __str__(self):
        return self.name

Useful Reviews

모든 동기들이 Model에 대해 연우님께 리뷰를 받았는데, 기억하면 좋을 리뷰 내용들을 모아봤다.

  • import models에서 대부분의 fieldmethod들을 제공받기에 따로 field를 import하지 않아도 된다.
  • TextField는 게시판의 게시글처럼 받아야 할 데이터가 큰 경우 사용된다. 따라서 유저 정보는 단순 문자열로 CharField로 작성하는 것이 좋다.
  • IntegerField의 경우 숫자가 0으로 시작하면 누락하고 저장하기 때문에(011->11) 01038902027 같은 휴대폰번호 양식은 보통 CharField 문자열로 관리한다.
  • 테이블명과 속성명만 봐도 데이터를 유추할 수 있도록 직관적이고 구체적으로 작성하는 것이 좋다.
  • 불필요하게 Table을 늘리는 것은 경제적으로 좋지 않다.(회원가입 정보처럼 보통 한번에 불러오는 Table은 나누지 않는다.)
  • max_length는 여유있게 지정해준다.

다른 동기분이 휴대폰 번호에 PhoneNumberField를 사용하셨는데, 따로 패키지를 받아 import해야 해서 현재 프로젝트에서는 굳이 사용하지 않았다. 알아두면 나중에 유용할 것 같다.

SignUp View

모델링을 완료하고 회원가입 기능 View를 구현했다. 회원가입을 위한 View 기능은 다음과 같다.

  • 사용자 정보는 Model의 Field들을 포함한다.(이름, 이메일, 비밀번호, 연락처, 그 외 정보)
  • 이메일이나 패스워드가 전달되지 않을 경우 {"message": "KEY_ERROR"}, status code 400 을 반환한다.
  • 이메일에는 @와 .이 필수로 포함된다. 조건을 만족하지 못하면 에러를 반환한다.
  • 비밀번호는 8자리 이상, 문자, 숫자, 특수문자의 복합이어야 한다. 조건을 만족하지 못하면 에러를 반환한다.
  • Email, Password Validation과정에서 정규표현식을 사용한다.
  • 회원가입시 이메일이 중복되지 않도록 적절한 에러를 반환한다.
  • 모든 조건을 만족하여 회원가입에 성공하면 Success 메시지를 출력한다.

조건들을 만족하며 작성한 View는 다음과 같다.

import json, re

from django.http     import JsonResponse
from django.views    import View

from users.models    import User

class SignUpView(View):
    def post(self, request):
        try:
            data                = json.loads(request.body)
            email_validation    = re.compile("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$")
            password_validation = re.compile("^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$")

            if data['email']=="" or data['password']=="":
                return JsonResponse({"Message":"NO_INPUT_DATA"}, status=400)
            
            if (email_validation.match(data['email']) is None) or (password_validation.match(data['password']) is None):
                return JsonResponse({"MESSAGE":"INVALID_FORMAT"}, status=400)

            if User.objects.filter(email = data['email']).exists():
                return JsonResponse({"MESSAGE":"EMAIL_ALREADY_EXIST"}, status=400)

            User.objects.create(
                name            = data['name'],
                email           = data['email'],
                password        = data['password'],
                phone_number    = data['phone_number'],
                age             = data['age']
            )
            return JsonResponse({"MESSAGE":"SUCCESS"}, status=201)
        except KeyError:
            return JsonResponse({"MESSAGE":"KEY_ERROR"}, status=400)

정규표현식

이메일의 @,. 포함 여부나 비밀번호의 문자, 특수문자 복합 등 데이터의 값이 타당하고 유효한지 판단하는 것을 Validation이라 한다. 만약 Form, Template을 사용한다면 Model에서 Django Validator를 이용하는 것이 좋을 수 있지만, Westagram에서는 사용하지 않으므로 View에서 Email, Password Validation을 정규표현식을 이용해서 수행했다.

파이썬에서는 정규 표현식 모듈 re를 지원하므로 이를 이용해 특정 규칙이 있는 텍스트 데이터를 빠르게 정제할 수 있다. re 모듈에서 지원한 함수중 다음 2가지를 사용했다.

  • re.compile
    정규표현식을 컴파일하여 파이썬에게 전달하는 역할을 한다.
  • re.match
    문자열의 처음부터 시작하여 패턴이 일치되는 것이 있는지 확인하고, 일치하지 않는다면 None을 return한다.

Email 정규표현식은 .이후에는 2~6개의 영대소문자를 사용하여 co.kr와 같은 이메일 주소에도 대응할 수 있도록 했다. Password는 8자리 이상 문자, 특수문자, 숫자의 복합이다. 알맞은 정규표현식을 토대로 먼저 re.compile을 통해 파이썬이 인식할 수 있는 정규표현식 패턴을 만든다.

email_validation    = re.compile("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$")
password_validation = re.compile("^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$")

만든 패턴을 이용해 re.match에 적용해 None을 return하면 data가 validation을 통과하지 못했다는 의미이므로 Invalid Format 에러를 반환한다.

if (email_validation.match(data['email']) is None) or (password_validation.match(data['password']) is None):
                return JsonResponse({"MESSAGE":"INVALID_FORMAT"}, status=400)

정규표현식의 문법이 많이 복잡하고 어렵지만 앞으로도 유용하게 사용할 수 있으니 조금씩 배워가야겠다.

Useful Reviews

  • Import에도 순서가 존재한다. 파이썬 자체 모듈 -> 장고 모듈 -> 내가 만든 클래스 순서로 Import 해주자.
  • Object Value가 None인 경우 ==operator 보다 isoperator를 사용한다.
profile
어디를 가든 마음을 다해 가자

0개의 댓글