1차 프로젝트 회고

유동헌·2021년 5월 4일
0

theMeat

개요

the banchan.co.kr 클론 코딩 프로젝트
팀 별 학습과 저작권 문제로 인해 theMeat으로 컨셉을 바꿔, 육류 전문 판매 사이트로 개편하여 클론 코딩 진행.

팀원 구성

프론트엔드 : 3명 / 벡엔드 : 3명

진행상황

app은 총 3개가 나왔으며, 각각 product / cart+order / user로 구성

user

user app을 담당하였으며, 그 안에 데코레이터 등을 작성

  • signin, signup, login decorator, address 부분
  • 정규표현식을 통해 회원가입 뷰 작성
  • 로그인 토큰 발행 - 데코레이터 사용으로 사용자 로그인 정보가 페이지 마다 유지될 수 있도록(구현되는 모습을 보고 싶었는데, 이 부분에서 살짝 꼬여서 작성만 해놓고 실행 확인은 하지 못하였음)
  • address 작성 유저 주소를 받는 부분

전체적 느낌

지금까지 해왔던 내용을 복습하기 위해, 그리고 추가로 데코레이터 구현, address, review 등을 구현해보려고 하였음. 하지만 실력 부족으로 review는 작성하지 못하였다.
우선 모델링 과정도 매우 어려웠었고, 다대다 관계를 이해하지 못해서 시간을 효율적으로 사용하지 못한 것 같다. views.py에 대해 몇 번의 수정 과정을 거치면서 조금 더 깊게 이해할 수 있게 되었다.

code_회원가입

# 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'

이런 식으로 공부하였다.

code 로그인

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 작성

address 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 방식의 회의, 프로젝트 진행에 대한 흐름을 경험한 것.
미약하게 나마 프로젝트의 일원으로 참여하여 팀원들과 소통하며 결과물을 만들어낸 것.

profile
지뢰찾기 개발자

0개의 댓글