the banchan.co.kr 클론 코딩 프로젝트
팀 별 학습과 저작권 문제로 인해 theMeat으로 컨셉을 바꿔, 육류 전문 판매 사이트로 개편하여 클론 코딩 진행.
프론트엔드 : 3명 / 벡엔드 : 3명
app은 총 3개가 나왔으며, 각각 product / cart+order / user로 구성
user app을 담당하였으며, 그 안에 데코레이터 등을 작성
지금까지 해왔던 내용을 복습하기 위해, 그리고 추가로 데코레이터 구현, address, review 등을 구현해보려고 하였음. 하지만 실력 부족으로 review는 작성하지 못하였다.
우선 모델링 과정도 매우 어려웠었고, 다대다 관계를 이해하지 못해서 시간을 효율적으로 사용하지 못한 것 같다. views.py에 대해 몇 번의 수정 과정을 거치면서 조금 더 깊게 이해할 수 있게 되었다.
# import
import json
import re # 정규표현식 사용을 위한 import
import bcrypt # 암호화 관련
import jwt # 암호화 관련
from django.http import JsonResponse
from django.views import View
from .models import User, UserRank, Address
from orders.models import Order
from .utils import LoginDecorator
사실 프로젝트 전까지 기계적으로 import를 하고 시작하는 경향이 있었다.. 하지만 이제는 조금 왜 사용하는지 알고 사용하는 단계이다.
# 정규표현식
p_email = re.compile('^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')
p_password = re.compile('^[a-zA-Z0-9]*$')
p_phone_number = re.compile('[0-9]')
p_name = re.compile('^[가-힣]*$')
자주 사용되는 정규표현식에 대해 공부하고, 이를 회원 검증 시 적용해보았다.
# 암호화
encoded_pw = password.encode('utf-8')
hashed_pw = bcrypt.hashpw(encoded_pw, bcrypt.gensalt())
user = User.objects.create(
password = hashed_pw.decode('utf-8')
)
암호화에 대해 이해하고, 회원 가입 및 로그인 시 이를 적용해보았다.
In [10]: password = '12341234'
In [11]: encoded_pw = password.encode('utf-8')
In [12]: encoded_pw
Out[12]: b'12341234'
In [14]: hashed_pw = bcrypt.hashpw(encoded_pw, bcrypt.gensalt())
In [15]: hashed_pw
Out[15]: b'$2b$12$qOY6fE3IeXQaidxaLM2OEuMENBqnkFHbYiem.m3LcE1111khtA7Ke'
In [16]: hashed_pw.decode('utf-8')
Out[16]: '$2b$12$qOY6fE3IeXQaidxaLM2OEuMENBqnkFHbYiem.m3LcE1111khtA7Ke'
이런 식으로 공부하였다.
class LoginView(View):
def post(self, request):
data = json.loads(request.body)
print(data)
email = data['email']
password = data['password']
try:
if User.objects.filter(email=data['email']).exists():
user_email = User.objects.get(email=data['email'])
if bcrypt.checkpw(data['password'].encode('utf-8'), user_email.password.encode('utf-8')):
access_token = jwt.encode({'id': user_email.id}, 'secret', algorithm='HS256')
return JsonResponse({"token": access_token, "message": "SUCCESS"}, status=200)
else:
return JsonResponse({"message": "INVALID_PASSWORD"}, status=401)
else:
return JsonResponse({"message": "INVALID_EMAIL"}, status=401)
except KeyError:
return JsonResponse({"message": "KEY_ERROR"}, status=400)
로그인 views.py 작성
class AddressView(View):
@LoginDecorator
def post(self, request):
try:
data = json.loads(request.body)
address = data['address']
user = request.user
if Address.objects.filter(address=data['address']).exists():
return JsonResponse({"message": "ADDRESS_ERROR"}, status=401)
Address.objects.create(
address = data['address'],
user = request.user
)
return JsonResponse({'message' : 'SUCCESS'}, status=200)
except KeyError:
return JsonResponse({"message": "KEY_ERROR"}, status=400)
여기서 중요한 부분은 데코레이터를 거쳐서 나온, request.user 저 부분을 이해하는데 힘들었었다.
프로젝트 내내, 코드를 작성하느 것 말고도 데이터 넣기, aws 배포하기, 모델링 수정하기, github, slack 관리 등 매우매우매우매우 중요하고 번거로운... 일들이 동시에 진행되었다. 나는 내가 맡은 부분에 대한 공부, 구현 등에만 신경을 썼기 때문에 프로젝트 외 프로젝트를 위한 추가 사항들에 대해서는 굉장히 소극적으로 임했던 것 같다(팀원들께 매우매우 죄송한 마음이다). 사실 여유를 가지기 힘든 상황은 모두에게 해당이 되었을텐데, 나만 유난히 민감하게 반응을 했었던 것 같아서.. 이 부분이 매우 아쉽다.
또한 실력 부족으로 review를 작성하지 못한 것도 아쉽다!
agile 방식의 회의, 프로젝트 진행에 대한 흐름을 경험한 것.
미약하게 나마 프로젝트의 일원으로 참여하여 팀원들과 소통하며 결과물을 만들어낸 것.