[Watcha Classic] 보고 싶어요 기능 구현 (+ 문제점)

이태권 (Taekwon Lee)·2022년 7월 2일
0

[Project] Watcha Classic

목록 보기
5/6
post-thumbnail

6. 보고 싶어요 구현

🖥 Code

urls.py

endpoint는 '보고 싶어요' 기능에 맞게 watchlist로 구성했다

from django.urls import path

from users.views import SignUpView, SignInView, WatchListView, UserView
urlpatterns = [
...
    path('/watchlist', WatchListView.as_view()),
]

views.py

get_or_created 메서드

직관적인 코드를 위해 get_or_create 메서드를 사용하였다.
열심히 구글링 하다가 이번에 처음 알게된 메서드인데,
좋아요 기능을 구현할 떄 매우 유용하다.

get_or_create

  • return 할 때는 (object, is_created)의 tuple 형식으로 반환한다.
  • object는 검색하고자 하는 모델의 인스턴스이다.
  • is_created는 위의 인스턴스가 생성 되었는지/아닌지 알려주는 불리언 타입의 flag이다.

users/models.py

WatchList 클래스는, FilmUser의 외부 키를 갖고 있는 상태이다.

class WatchList(models.Model):
    film = models.ForeignKey(Film, on_delete=models.CASCADE)
    user = models.ForeignKey('User', on_delete=models.CASCADE)

    class Meta:
        db_table = 'watch_lists'

users/views.py

그래서 실제 WatchList 모델에 적용하여,
해당 필드에 user_idfilm_id 없으면 생성하고, 있으면 삭제하는 식이다.

from django.http            import JsonResponse
from django.views           import View

from users.models     import WatchList
from films.models     import Film
from core.utils       import token_decorator

class WatchListView(View):
    @token_decorator
    def post(self, request):
        try:
            data = json.loads(request.body)

            if not Film.objects.filter(id = data['film_id']).exists:
                return JsonResponse({'message' : 'FILM_DOES_NOT_EXIST'}, status = 404)

            film = Film.objects.get(id = data['film_id'])
            user = request.user

            wish, is_created = WatchList.objects.get_or_create(film = film, user = user)

            if not is_created:
                wish.delete()
                return JsonResponse({'message' : 'WATCH_LIST_DELETED'}, status = 204)

            return JsonResponse({'message' : 'SUCCESS'}, status = 201)

        except KeyError:
            return JsonResponse({'message' :'KEY_ERROR'}, status = 400)

🖥 실습

로그인 후 토큰 발급

1. ip 주소 확인

ipconfig getifaddr en0를 통해 ip 주소 확인

2. 서버 열기

python manage.py runserver 0:8000로 해당 ip 주소로 서버 열기

3. 로그인, 토큰 발급

로그인하여 토큰 발급

보고 싶어요 구현

4. 토큰을 Headers에 추가

5. Body에 보고 싶어요에 담고 싶은 id 추가

예시로 film_id를 23을 넣었다.

6. Send를 눌러 생성/삭제 확인

보고 싶어요 생성

로그인한 계정의 user_id가 1인데, 성공적으로 잘 저장 되었다

mysql> select * from watch_lists;
+-----+---------+---------+
| id  | film_id | user_id |
+-----+---------+---------+
...
| 156 |      11 |      50 |
| 157 |      25 |      50 |
| 159 |      23 |       1 |
+-----+---------+---------+
37 rows in set (0.00 sec)

보고 싶어요 삭제

삭제 확인 완료

mysql> select * from watch_lists;
+-----+---------+---------+
| id  | film_id | user_id |
+-----+---------+---------+
...

| 156 |      11 |      50 |
| 157 |      25 |      50 |
+-----+---------+---------+
36 rows in set (0.00 sec)

❗️ 문제점

  • 프로젝트 중에 문제점이 발생하였다...
  • 회원/비회원에 대한 보고 싶어요의 기능에 대하여 boolean 타입을 판별해야 한다.
  • 프론트에서 실현이 되었던 거는 목데이터로 WatchList에 대한 boolean 타입을 True로 넣어 놨다...
    • 사실은 API로 판단을 해야 한다.
      1. 회원인가? 비회원인가?
      1. 회원이면 그 회원이 영화에 좋아요를 눌렀나? 안 눌렀나?
  • 결국 문제점은 상세페이지를 들어갈 때, 항상 목데이터로 True가 되어 있기 때문에 상세페이지를 새로 고침할 때마다 항상 기호가 + 로 항상 나.온.다.

Watcha Classic 영상 링크, 3분 10초부터

아래 사진에서 해당 회원은 이미 영화 '미망인'을 보고 싶어요를 누른 상태이다.

그러나 미망인을 클릭할 경우 목데이터로 default 값이 True이기에 담겨 있어도 + 기호로 되어 있다.

Database 상에는 문제가 없으나 client는 그것을 모르기에, 문제가 된다.

하... 이거는 도저히 11일 동안의 프로젝트 후반부이기에 구현하지 못했다...😭😭😭

🔖참고 자료

profile
(Backend Dev.) One step at a time

0개의 댓글