[WatchaPedia Clone] Day 3. App 구성, models.py 리뷰, 회원가입/로그인 구현

jaylight·2020년 12월 16일
0

WatchaPediaClone

목록 보기
3/7
post-custom-banner

models.py 리뷰

어제 user App에 몰아서 작성해 둔 models.py가 migrate 되는지 확인하면서 일부 수정하고 git에 PR을 올렸지만, 모든 모델을 작성해서 하나에 올린 것부터 잘못되어서 바로 branch를 삭제하고 user,content, archive, review, collection으로 App을 나누어서 models라는 branch로 새로 작성해서 올렸다.

잠깐만 생각해보면 위 상태로 App을 나눈 뒤 models를 구성하고 리뷰 후 main에 merge되어야 각 조원이 pull해와서 각자 작업을 할 수 있는 것을 생각하면 이 방법이 훨씬 효율적이고 올바른 방법인 것 같다.

App을 나누라는 피드백을 빠르게 반영해서 다시 PR을 올린 뒤 몇 가지 피드백을 받았다.

[archive.models]

  • create_timecreated_at
  • db_table = 'archivetypes'db_table = 'archive_types'

[collection.models]

  • created_at = models.TimeFieldcreated_at = models.DateTimeField

[content.models]

  • class SubCategoryclass Category와 연결되어 있지 않은데 의도한 것인지?
    SubCategory는 책 장르(소설, 판타지, 수필 등)을 나타내는 것으로 Category 전체 유형을 커버하지 않으므로, 연결하지 않았다. 책 설명을 담은 BookOverview에만 연결하였다. 어휘에 혼동이 있을 수 있을 것 같아 BookCategory로 클래스명을 수정함
  • photo = models.CharField(max_length=1000)photo_url = models.URLField()
  • PeopleJob 테이블과 StaffJob 테이블 간 혼돈
    해당 인물의 직업, 작품 내 직업(역할)을 각각 별도의 테이블로 ManyToMany 관계로 연결하였는데, 굳이 그렇게 하지 않고 피드백에 따라 하나의 테이블에 작품 - 인물 - 역할(직업)을 연결하여 해당 인물의 직업 정보와 작품 내에서의 역할(직업)을 한꺼번에 알 수 있도록 테이블을 수정하였다.

[user.models]

  • db_table = 'disclosure'db_table = 'disclosures'
  • email = models.CharFieldemail = models.EmailField
    email 데이터에 대해 EmailField를 활용
  • profile_image = models.CharField(~)profile_image_url = models.URLField(~)
    background_image = models.CharField(~)background_image_url = models.URLField(~)

위 사항에 대한 피드백 반영 후 드디어 main에 merge 후에 조원과 각각 content와 user에 관한 API를 작성했다.

user SignIn / SignUp 구현

회원가입 및 로그인에 관해서는 인스타그램 클론 프로젝트 과정에서 한번 구현한 경험이 있어서 (그렇지만 잊어버린게 많아 기존 코드를 참고하면서) 조금 더 쉽게 구현할 수 있었다.

마침 아람님이 회원가입 로그인 페이지 작업까지 마무리해주셔서 서버를 열어 실제 붙여보았고 다행히 데이터가 잘 들어오고 로그인 후 액세스 토큰까지 건네주는 것을 확인했다.

이후 바로 리뷰 작성이나 별점 평가 등을 작업해야하나 하다가 액세스 토큰으로 유저 신원을 확인하는 데커레이터를 미리 작성해두어서 main에 merge 시켜두면 다른 App을 만드는 과정이 훨씬 수월할 것 같아서 우선적으로 작성했다.

하지만 일단 만들어둔 데커레이터가 제대로 작동하는지 확인하는 과정에서 기존에 신원을 확인하고 리뷰를 작성하는 기능도 따로 구현하지 않았고, 리뷰를 작성할 데이터도 지금 없다는 것을 알고 어떡하나 하다가 결국 임시로 리뷰 작성 기능과 리뷰 작성을 위한 영화 데이터까지 임시로 입력했다. 이거에 시간이 너무 많이 들어갔고, 로그인/회원가입/인증 데이커레이터만 PR을 올리기 위해 위 과정에서 작성한 리뷰 작성 클래스 등은 없던 상태로 되돌렸다. (..)

import jwt
import json
from functools import wraps

from django.http import JsonResponse

from user.models import User
from my_settings import SECRET_KEY, ALGORITHM

def id_auth(func):
    @wraps(func)
    def decorated_function(self, request, *args, *kwargs):
        try:
            access_token = request.headers.get('Authorization')
            payload      = jwt.decode(access_token, SECRET_KEY, algorithm=ALGORITHM)
            login_user   = User.objects.get(id = payload['user_id'])
            request.user = login_user

            return func(self, request, *args, **kwargs)

        except jwt.exceptions.DecodeError:
            return JsonResponse({"message": "INVALID_TOKEN"}, status = 401)
        except User.DoesNotExist:
            return JsonResponse({"message": "INVALID_USER"}, status = 401)
    return decorated_function

처음에 request의 head에서 access_token을 가져오는 키 이름을 access_token으로 통일시키는 것이 좋지 않을까 하고 바꿔서 요청을 보내니 아예 access_token이 들어가질 않아서 결국 다시 Authorization으로 바꿨더니 아래 결과와 같이 사용자 인증 과정이 원활히 넘어가고 리뷰 작성이 되었다.

post-custom-banner

0개의 댓글