First Toy Proejct[Westagram][20210827]
Wecode에 들어와서 3주간 Python의 기본 문법 & Django의 기능에 대해 배웠고, 드디어 간단한 Toy Project를 시작하게 되었다. 이번에는 이와 관련하여 블로그를 작성해 보려고 한다.
<목차>
1. 모델링
2. 회원가입 기능 구현
3. 마무리...
1. 모델링
모델링을 진행하기 앞서, 프로젝트를 위한 기본 셋팅이 필요하다. 이와 관련된 내용은 8월 13일에 작성한 초기 셋팅 관련 블로그를 참고하면 된다.
이번 프로젝트 진행은 각 기능별로 개별의 Branch를 생성하여 진행할 예정이며, Git Hub에 Push & Pull 도 활용해 볼 예정이다.
- User Branch 생성
$ git checkout main # 브랜치 생성은 꼭 main에서 해야 한다.
$ git branch 'branch 이름'
$ git checkout 'branch 이름'
- User App 생성
$ python manage.py startapp users # manage.py가 위치한 폴더에서 실행해야 함.
- User table 생성
우리는 이번 Toy project에서는 간단한 회원가입 & 로그인 기능만 구현할 예정이기 때문에, 아래와 같은 정보만 있으면 기능 구현에 충분하다.
- 이름
- 이메일
- 비밀번호
- 연락처(휴대폰)
- 주소
User 앱의 models.py에 입력한 코드는 아래와 같다.
$ from phonenumber_field.modelfields import PhoneNumberField
$ from django.db import models
$ class User(models.Model):
name = models.CharField(max_length=50)
email = models.EmailField(max_length=50)
password = models.CharField(max_length=500)
phone_number = PhoneNumberField(unique = True)
address = models.TextField()
class Meta:
db_table = 'users'
세부적인 설명을 덧붙이자면, 전화번호와 이메일의 경우에는 전용 Field를 사용하였다.
위와 같은 모델링을 한 후에 migration을 하고 데이터를 입력하게 되면 Table의 출력값은 아래와 같다.
위에서 말했던 것과 같이 이번 Toy Project는 각 기능별로 branch를 생성해서 진행했기 때문에, git hub에 Push 및 PR(Pull Request)를 해야한다.
# git push
$ git add .
$ git commit -m "Add : message"
$ git push origin 'branch 이름'
이후에 Git Hub에 방문하여 Pull Request를 해줘야 한다.
Pull Request를 하는 이유는 모델링은 sub branch에서 진행되었기 때문에 main branch에는 존재하지 않는다. 따라서, 모델링 진행한 내용을 main branch에 적용하기 위해서 PR을 하는 것이다.
PR을 하는 방법은 아래와 같다.
Git Hub에 접속하여 내가 Push한 Repository로 이동하여 위의 사진에 표시되어 있는 버튼을 클릭하여 접속한다. 화면에 접속하게 되면 내가 최근에 push한 내용을 확인할 수 있으며, 해당 Push를 PR 할 수 있다.
그 후에 Repository 관리자가 PR을 승인하면 Pull을 하는 것이 가능하다.
2. 회원가입 기능 구현
이번에 진행한 Toy Project는 Django에서 지원하는 기능을 많이 사용하지 않고, Json 타입의 데이터를 직접 입력하는 방식으로 회원가입 기능을 구현하였다.
작성한 코드는 아래와 같다.
import json
import re
from django.views import View
from django.http import JsonResponse
from users.models import User
class UserView(View):
def post(self, request):
data = json.loads(request.body)
email_regex = re.compile(r'^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')
password_regex = re.compile(r'^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z])(?=.*[!@#$%^*+=-]).{8,}$')
try:
name = data['name']
email = data['email']
password = data['password']
phone_number = data['phone_number']
address = data['address']
if User.objects.filter(email = data['email']).exists():
return JsonResponse({"message" : "EXIST USER"}, status = 400)
elif not email_regex.match(data['email']):
return JsonResponse({"message" : "INVALID_EMAIL"}, status = 400)
elif not password_regex.match(data['password']):
return JsonResponse({"message" : "INVALID_PASSWORD"}, status = 400)
User.objects.create(
name = data['name'],
email = data['email'],
password = data['password'],
phone_number = data['phone_number'],
address = data['address'],
)
return JsonResponse({"message" : "SUCCESS"}, status = 201)
except KeyError:
return JsonResponse({"message" : "KEY_ERROR"}, status = 400)
먼저, 구현하고자 했던 기능들은 아래와 같다.
- 이메일 or 패스워드가 입력되지 않았을 경우, {"message": "KEY_ERROR"}, status code 400 메시지 반환
- 이메일 주소에는 @와 '.'이 반드시 포함되어야 함.(정규식 사용) 아닐 경우 {"message" : "INVALID_EMAIL"}, status = 400 메시지 반환
- 비밀번호는 8자리 이상, 문자, 숫자, 특수문자의 복합이어야 함. (정규식 사용) {"message" : "INVALID_PASSWORD"}, status = 400 메시지 반환
- 입력된 이메일이 중복되어 입력되었을 경우, {"message" : "EXIST USER"}, status = 400 메시지 반환
Django의 내장 함수인 Post 메서드를 사용하여 입력된 데이터를 Json형식으로 받았다. (아래 코드 참고)
data = json.loads(request.body)
그리고 이메일과 패스워드의 조건을 만족하기 위해 정규식을 활용하였으며, 사용한 정규식은 아래와 같다.
email_regex = re.compile(r'^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')
password_regex = re.compile(r'^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z])(?=.*[!@#$%^*+=-]).{8,}$')
정규식의 구성이 어떤 이유로 위와 같이 구성되었는지에 대한 설명은 링크에 접속하여 확인 할 수있다.
위에서 언급하였던 조건들을 만족하기 위한 코드로 나는 if & elif 구문을 사용하였으나 굳이 if elif 구문이 아닌 모두 if 구문으로 사용해도 로직에는 큰 차이가 없다는 사실을 확인했다. 물론 컴퓨터 시스템적으로는 시간복잡도가 약간 다를 수도 있을 것 같지만 계산을 직접 해보진 않았다.
try:
name = data['name']
email = data['email']
password = data['password']
phone_number = data['phone_number']
address = data['address']
if User.objects.filter(email = data['email']).exists():
return JsonResponse({"message" : "EXIST USER"}, status = 400)
elif not email_regex.match(data['email']):
return JsonResponse({"message" : "INVALID_EMAIL"}, status = 400)
elif not password_regex.match(data['password']):
return JsonResponse({"message" : "INVALID_PASSWORD"}, status = 400)
User.objects.create(
name = data['name'],
email = data['email'],
password = data['password'],
phone_number = data['phone_number'],
address = data['address'],
)
return JsonResponse({"message" : "SUCCESS"}, status = 201)
except KeyError:
return JsonResponse({"message" : "KEY_ERROR"}, status = 400)
터미널에서 서버를 작동 시킨 후 Post 메서드를 통해 데이터를 입력하게되면 아래와 같이 데이터가 입력 되는 것을 확인 할 수 있다.
3. 마무리...
사실 첫 번째로 만들어 보는 기능이기도 하고, Toy project이기 때문에 예외처리에 많은 신경은 쓰지 못했다. 위의 코드에서도 보다 시피 key error만 잡아주었는데, 앞으로 진행할 프로젝트에서는 많은 고민을 하여 다양한 예외를 잡아줄 수 있도록 해야될 것 같다.
요즘 '개발바닥' 이라는 유튜브를 보고 있는데, 클론코딩을 진행함에 있어서 단순히 많은 기능을 구현하는 것은 정말 메리트가 없다는 영상을 봤다. 한 가지 기능을 구현하는 데도 있어서 개발한 사람의 고민이 녹아 있는지 없는지가 중요하다는 내용이었다. 본인도 영상을 시청한 후에 곰곰히 생각해본 결과, 개발이라는 일을 업으로 삼게 된다면, 앞으로 주구장창 많은 도전을 해야할 상황에 놓이게 될텐데 남들이 한 그대로만 따라서 하는 것은 큰 의미가 없을 것 같다고 생각을 하게 되었다. 따라서, 앞으로 진행할 클론 프로젝트에서는 많은 기능을 구현하지 못하더라도 왠만한 경우에는 문제가 발생하지 않도록 하는 코드를 짜는 방향으로 노력해야겠다.
Author And Source
이 문제에 관하여(First Toy Proejct[Westagram][20210827]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hollibleling/First-Toy-ProejctWestagram20210827저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)