📌 이 포스팅에서는 평균 평점 기준으로 영화 리스트를 제공하는 API를 만드는 과정에 대해 정리하였습니다.
✔️ 영화 상세페이지에 들어가면, 해당 영화를 찜목록에 넣을 수 있도록 toggle 버튼이 있는데, Post를 통해서 등록과 삭제를 구현하고, Get을 통해 사용자가 담아 둔 보고싶어요 리스트를 볼 수 있는 API를 구현해볼께요.
✔️ 로그인을 하지 않으면, 보고싶어요 목록이 의미가 없어요. 해당 사용자가 현재까지 담은 보고싶어요 리스트들이 존재하기 때문이에요.
✔️ 이에 사용자가 로그인했는지 확인하기 위해 데코레이터가 필요합니다.
✔️ 데코레이터는 아래와 같이 headers에서 Authoriztion에 담긴 token값을 복호화하여, 이를 기준으로 다시 사용자의 객체를 찾아 반환하는 역할을 해줍니다.
✔️ 이렇게 데코레이터를 작성해두면, 같은 로직을 매번 여기저기서 작성할 필요가 없기 때문에 유지보수가 편해요.
✔️ 또한 사용자 정보가 필요한 함수 위에 장식함으로써, 사용자 정보는 별도로 요청받을 필요가 없게되죠! JWP token을 통해 확인 가능합니다.
import json, re from django.http import JsonResponse from django.conf import settings from users.models import User def login_decorater(func): def wrapper(self, request, *args, **kwargs): try: access_token = request.headers.get("Authorization", None) payload = jwt.decode(access_token, settings.SECRET_KEY, settings.ALGORITHM) user = User.objects.get(id=payload["user_id"]) request.user = user except jwt.exceptions.DecodeError: return JsonResponse({"message": "INVALID_TOKEN"}, status=400) except User.DoesNotExist: return JsonResponse({"message": "INVALID_USER"}, status=400) return func(self, request, *args, **kwargs) return wrapper
✔️ 하나의 버튼으로 Post 요청이 오는데, 이미 존재하면 이를 삭제하고 존재하지 않으면 생성하는 로직이 필요하겠죠.
✔️ 이 과정에서 Django에서 제공하는 get_or_create 매서드를 사용했는데, 이는 매서드는 2개의 값을 반환합니다.
✔️ 첫번째는 해당 객체를, 두번째는 Boolean값이에요. 즉, 해당 매서드가 존재하지 않아 생성하였다면 True를 반환하고 이미 존재해서 get해왔다면 False를 반환해요.
✔️ 따라서, False라면 이미 존재하기 때문에 가져온 객체를 삭제해주면되고, True라면 생성했기 때문에 잘 생성되었다는 응답메시지만 반환하면 됩니다.
✔️ Get 매서드는 사용자가 프로필 페이지에서 자신이 찜목록한 리스트를 볼 수 있도록 get요청이 들어올 때 해당 정보를 반환할 수 있도록 처리하였어요.
class WishListView(View): @login_decorater def post(self, request): data = json.loads(request.body) movie_id = data["movie_id"] wishlist_obj, created = WishList.objects.get_or_create(movie_id=movie_id, user_id=request.user.id) if not created: wishlist_obj.delete() return JsonResponse({"message": "WISHLIST_DELETE_SUCCESS"}, status=200) return JsonResponse({"message": "WISHLIST_CREATE_SUCCESS"}, status=201) @login_decorater def get(self, request): wishlists = WishList.objects.filter(user_id=request.user.id) result = [ { "id": wishlist.movie.id, "title": wishlist.movie.title, "poster_url": wishlist.movie.poster_image_url, } for wishlist in wishlists ] return JsonResponse({"message": result}, status=200)
✔️ 이를 바탕으로 API명세서를 만든 결과는 아래와 같아요!