[Watcha Classic] 메인 페이지 구현 (세 줄)

이태권 (Taekwon Lee)·2022년 6월 28일
0

[Project] Watcha Classic

목록 보기
3/6

4. 메인 페이지 구현 (2)

🎉🎉 왓챠 클래식 세 줄 구현 성공

0:8000/films?genre=드라마&country=미국&time=100

어제 활용한 코드를 활용하여 첫 페이지의 세 줄을 구현하였다.

📝 메인 페이지 View 코드

수정 사항

  1. 현재 URI는 /films/main으로 되어 있다.
localhost:8000/films/main
  • 메인 페이지에서 보여주는 데이터라고 생각하여 main을 추가 하였으나, 이를 제외하라는 피드백을 받았다.
  • 이유는 RESTful API 설계 방식으로 endpoint를 만들 때는 항상 자원(데이터) 기준으로 만들어야 하기 때문이다.
  • 그러므로 /films/main이 아닌 /films로 수정했다.

코드

사실 어제 만든 코드를 재활용 한 거기에, 불필요하게 코드가 길어졌다...
지금은 양이 적으니 상관 없으나 유지, 보수 차원에서 너무 비효율적이다.
이게 무슨 일이니

class FilmView(View):
    def get(self, request):
        try:
            genre            = request.GET.get('genre')
            country          = request.GET.get('country')
            running_time_min = int(request.GET.get('time'))

            genre_of_films    = Film.objects.filter(genres__name = genre)
            country_of_films  = Film.objects.filter(countries__name = country)
            min_below_hundred = Film.objects.filter(running_time_min__lte = running_time_min)

            results = {
                'drama' : [{
                    'id'               : film.id,
                    'name'             : film.name,
                    'release_date'     : film.release_date.year,
                    'image_url'        : film.image_url,
                    'country'          : [country.name for country in film.countries.all()],
                    'running_time_min' : film.running_time_min,
                } for film in genre_of_films[:10]],
                'america' : [{
                    'id'               : film.id,
                    'name'             : film.name,
                    'release_date'     : film.release_date.year,
                    'image_url'        : film.image_url,
                    'country'          : [country.name for country in film.countries.all()],
                    'running_time_min' : film.running_time_min,
                } for film in country_of_films[:10]],
                'running_time_below_hundred' : [{
                    'id'               : film.id,
                    'name'             : film.name,
                    'release_date'     : film.release_date.year,
                    'image_url'        : film.image_url,
                    'country'          : [country.name for country in film.countries.all()],
                    'running_time_min' : film.running_time_min,
                } for film in min_below_hundred[:10]]
            }
            return JsonResponse({'results': results}, status = 201)
        except KeyError:
            return JsonResponse({'message': 'KEY_ERROR'}, status = 400)

🖥 HTTP 요청/응답 확인

  • 예시로 장르는 드라마, 국가는 미국, 러닝타임은 100 이하인 영화를 각각의 딕셔너리에 담아 한번에 가져 왔다.
  • 너무 길어 각각의 조건에 하나만 담았다.


❗️ 문제점

  1. 유지, 보수 측면에서 코드가 비효율적이다.
    q 객체를 활용하면 된다는데, 아직 쓸 줄 모르니 답답하다...
  2. 그리고 불필요하게 URI가 너무 길어졌다. 3개여서 망정이지, 10개라면? 100개라면? 어우...
localhost:8000/films/main?genre=드라마&country=미국&running_time_min=100
profile
(Backend Dev.) One step at a time

0개의 댓글