어제 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_time
→ created_at
db_table = 'archivetypes'
→ db_table = 'archive_types'
[collection.models]
created_at = models.TimeField
→ created_at = models.DateTimeField
[content.models]
class SubCategory
가 class 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.CharField
→ email = models.EmailField
profile_image = models.CharField(~)
→ profile_image_url = models.URLField(~)
background_image = models.CharField(~)
→ background_image_url = models.URLField(~)
위 사항에 대한 피드백 반영 후 드디어 main에 merge 후에 조원과 각각 content와 user에 관한 API를 작성했다.
회원가입 및 로그인에 관해서는 인스타그램 클론 프로젝트 과정에서 한번 구현한 경험이 있어서 (그렇지만 잊어버린게 많아 기존 코드를 참고하면서) 조금 더 쉽게 구현할 수 있었다.
마침 아람님이 회원가입 로그인 페이지 작업까지 마무리해주셔서 서버를 열어 실제 붙여보았고 다행히 데이터가 잘 들어오고 로그인 후 액세스 토큰까지 건네주는 것을 확인했다.
이후 바로 리뷰 작성이나 별점 평가 등을 작업해야하나 하다가 액세스 토큰으로 유저 신원을 확인하는 데커레이터를 미리 작성해두어서 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으로 바꿨더니 아래 결과와 같이 사용자 인증 과정이 원활히 넘어가고 리뷰 작성이 되었다.