Megabox Cloning Project - 2차 프로젝트 회고

This Is Empty.·2021년 10월 31일
0

Report

목록 보기
2/2
post-thumbnail

🔗 Front-end Github
🔗Back-end Github

🎬 1. 프로젝트 소개

Megabox 클론 프로젝트

MEGABOX(메가박스)’는 ‘엄청나게 큰, 거대한'이라는 뜻의 MEGA와 ‘상자'를 뜻하는 BOX의 결합으로,
큰 육면체 형태의 영화관을 영상화함과 동시에 고객들에게 크고 다양한 즐거움과 만족을 선사하고자 하는 의미가 담겨 있는 국내 영화 예매 사이트 입니다.

프로젝트 기한

2021.10.18 ~ 2021.10.29

👯‍♀️팀원 (megafox)

  • Front-end : 강단, 정찬영, 신혜리
  • Back-end : 김도훈, 이다빈

🛠 적용 기술

  • Front-end : React, sass
  • Back-end : Python@3.8.11, Django@3.2.8, MySQL@8.0.27
  • 배포 : AWS(RDS, EC2, ALB)

🛠 구현 기능 | Back-end

공통

  • 데이터베이스 모델링
  • django 모델링
  • CSV 테스트 데이터 작성
  • 예매에 필요한 데이터 필터링 API
  • 예매 데이터 POST

이다빈

  • 카카오 로그인 API를 이용한 소셜 로그인 & 회원정보 저장 구현, unit test 작성
  • 유저 권한 확인용 로그인 데코레이터 구현
  • 영화 실관람평 작성, 수정, 삭제
  • 영화 실관람평 데이터 불러오기 & 정렬 & 페이지네이션
  • AWS(EC2, RDS, ALB)통한 배포

김도훈

  • 영화 정보 정렬 & 필터링 & 페이지네이션, unit test 작성
  • 유저가 좋아요한 영화관, 영화, 리뷰정보 저장 & 삭제, unit test 작성

📋2. 프로젝트 진행 과정

필수 구현 사항

  1. 소셜 로그인
  2. 영화 예매 서비스
    1) 영화, 극장별 예매
    2) 극장, 날짜, 시간 (택 1) 가능 + 예매 완료 기능까지 한 페이지에
  3. 영화 관람평 기능 (최신순, 평점순, 좋아요 순) + 페이지네이션
  4. 영화 좋아요

추가 구현 사항

  1. 나만의 메가박스 등록 기능(자주 가는 극장 등록)
  2. 리뷰 좋아요

추가 구현 사항까지 Back-end의 API 구현은 모두 완료할 수 있었다. 생각보다 여유롭게 작업되어 10/28일에 배포까지 완료!

📝 ERD

Aquery Tools를 도훈님과 결제해서 사용했다. 지난 프로젝트때는 무료인 툴을 사용했는데 역시 유료가 편한맛이 있는 듯 하다😅 공동작업이 가능하고 사용하기 편리했다.

🖋 3. 기능

1. 소셜로그인


사용자가 카카오로 로그인을 하면 카카오에서 프론트 서버로 카카오 토큰을 보내주고, 그 토큰을 백엔드로 전달해 백엔드는 다시 카카오로 토큰을 전달해 유저의 정보를 보내준다.
해당 유저가 이미 존재하면 새로운 로그인 액세스 토큰(not kakao token)을 보내주고 존재하지 않는 유저면 카카오에서 보내준 정보를 저장하고 로그인 액세스 토큰을 발행한다.

유닛 테스트

이번 2차 프로젝트의 핵심은 unit test였던 것 같다.
일반 API는 작성이 수월했지만 외부 API를 쓰는 경우 유닛 테스트 작성이 살짝 까다롭다.

실제 해당 API를 호출 할 수 없으니 mocking한다.
@patch 데코레이터를 사용하면 특정 범위 내에서만 mocking이 가능하도록 해주고 mock객체를 테스트 메서드의 인자로 추가하게 된다.

  • @patch('users.views.requests')
    - 실제 네트워크 연동이 아닌 post()함수 내에 존재하는 requests 패키지의 get()함수를 patching한다.

2. 실 관람평 작성

이 부분은 프론트 구현이 안돼서 실제 사용은 못해봤다..(아쉬움)

영화 실 관람평은 다음을 기준으로 로직을 구성했다.

  • 영화를 본 사람만 작성할 수 있음
  • 관람일 기준 7일 이내 등록시 50p가 적립됨
  • 관람 포인트는 최대 2개 등록 가능함
  • 평가 점수는 1 ~ 10 사이의 정수만 등록 가능함

이 로직을 짜면서 알게된것은 datetime은 int형과 비교할 수 없다는 것이다.

time_diff = review.created_at - booking.movie_theater.screen_time
                                                        
            if time_diff <= datetime.timedelta(days=7):
                user.point += 50
                user.save()

이 부분에서 원래 7일 이내인지 비교하는 곳을 그냥 단순히 7로 비교하면 되겠다 싶었는데 에러를 반환했다. 멘토님의 도움을 받고 timedelta메소드를 이용해 로직을 구성할 수 있었다. 이때 사용한 timedelta는 다른 로직을 구성할때도 유용하게 쓰였다.

3. 예매에 필요한 데이터 필터링


참 길다..

Q객체를 사용해서 query string으로 들어온 필터링 조건을 검사하고 데이터베이스에서 필요한 데이터를 필터링해서 보내준다.

movie나 theater은 여러개 들어올 수 있으니 getlist로 받는다.

여기서 아쉬운점이 있다면..

  1. 유저가 로그인 한 상태에서만 예매창을 들어갈 수 있다.

이점은 비로그인 구현을 해보려고 했는데 멘토님들이 로그인은 소셜로그인 하나만 구현하고 다른 기능이나 인프라에 집중해보는게 어떻냐고 하셔서 일단은 이렇게 구현했다. 나중에 시간이 남으면 수정해볼 생각이다.

  1. 유저가 로그인 한 상태의 경우 선호극장에서 상영하는게 default로 보여야하기 때문에 다음과 같이 받았는데
theaters = request.GET.getlist('theater_id', list(user_like_theaters.values_list('theater_id', flat=True)))


⬆️ 실제 메가박스 화면

위에 gif를 보다보면 선호극장을 선택 해제 했음에도 옆에 데이터가 남아있는 모습을 볼 수 있다. query string에 값이 들어오지 않으면 default값을 사용하므로 저렇게 된 것.. 이 부분도 수정이 필요함을 느꼈다.

🎊 4. 두번째 프로젝트를 마무리 하며

이번에는 1차 프로젝트보다 난이도가 상승했지만 왜인지 모르게 1차보다는 훨씬 수월하게 끝났다. 물론 100%완벽하고 마음에 드는 결과물은 아니겠지만 내 스스로 성장했다고 느낀다.
기간 내에 원하는 기능을 소개할만큼 모두 구현했고 프로젝트 마무리 날 전에는 배포까지 했다. 배포 이후에 수정사항이 생겨서 배포 이후에 코드를 수정하는 hotfix도 경험해 볼 수 있었다.


멘토님이 Application Load Balancer도 알려주셔서 ec2컨테이너는 1개지만 Load Balancer도 붙여보는 경험을 해 볼 수 있었다.

내일부터는 원티드 프리온보딩 백엔드 코스를 한달동안 듣게된다. 더 더 성장할 수 있는 계기가 될거같아 힘들겠지만 벌써 기대가 된다😌 하면 할수록 재미있는 일을(물론 힘든것도 많지만) 할 수 있다는건 참 행복한 일인것 같다.

profile
Convinced myself, I seek not to convince.

0개의 댓글