- Mood you : 당신의 오늘의 집중하겠다.
- 모듀 : 모두의 감정에 집중하겠다.
- movie, mood, emotion에 모두 포함된 알파벳인 M과 O를 살려서 네이밍
- 팀장 : 김주아 : UX/UI 생성 및 Vue Components 구조 생성, axios로 백엔드와 통신, 프론트엔드 화면 구현
- 팀원 : 유은겸 : ERD 구성 및 백엔드 로직 생성, axios로 백엔드와 통신
목표 서비스
-
초기 component 구조
-
사용자
- 로그인/로그아웃
- 회원가입/탈퇴
- 팔로우/팔로잉
- 프로필
-
커뮤니티
- 게시글 조회
- 게시글 작성/수정/삭제
- 게시글 댓글
-
영화
- 영화 목록 조회
- 영화 상세 조회
- 영화 좋아요 버튼
-
추가 기능
- 사용자 개인의 감정 기록
- 다른 사람의 프로필 방문
- 영화 검색
- 감정을 바탕으로 하는 영화 추천
실제 구현 서비스
-
최종 component 구조
-
사용자 : simple jwt 토큰을 사용하여 로그인이 필요한 기능 이용 시 headers에 담아 전송
- 로그인/로그아웃
- 회원가입 기능 생성
- 팔로우/팔로잉 기능 생성
- 프로필 기능 생성
-
커뮤니티
- 게시글 조회
- 게시글 작성/수정/삭제
-
영화
- 영화 목록 조회
- 영화 상세 조회 : 영화의 타이틀, 개봉일, 인기도, 평균 점수, 투표 수, 장르, 줄거리, 유튜브 예고편에 대한 정보 제공
- 영화 좋아요 버튼 : 좋아요를 누른 유저 수에 대한 정보 제공
- 영화 내 댓글 생성/삭제 : 댓글은
-
추가 기능
- 영화 : 영화 검색, 감정을 바탕으로 하는 영화 추천 기능 생성
- 사용자 : 게시글의 작성자를 누르면 해당 작성자의 프로필로 이동하는 기능 생성
- 오늘의 기분을 선택하면, 미리 설정한 장르에 맞는 영화를 추천해준다.
- 인간이 느끼는 대표적인 감정 6개 (happy, sad, soso, angry, joy, depressed)를 기반으로 영화를 추천한다.
- 각각의 감정에 따라 필수적으로 포함되는 장르의 아이디를 accept_ids에 담고, 예외할 장르의 아이디를 except_ids에 담는다.
- filter를 통해 Movie model에 담겨 있는 영화들 중 accept_ids가 genres안에 있는 영화들만 골라 movies에 저장한다.
- movies를 직렬화(serializer)한 뒤, for문을 통해 serializer.data로 영화 하나씩의 정보를 확인한다.
- 각 영화에는 장르 아이디가 여러 개 들어있는데, 그 또한 for문을 통해 장르 아이디만 list로 담는다.(gen)
- 장르 아이디를 각각 확인하면서, 제외하고자 했던 영화 장르를 담은 아이디 값이 list안에 모두 없으면 그 영화를 filtered_data에 담는다.
- 모두 담은 영화 중 10개를 랜덤으로 뽑아 반환한다.
-
코드
# 영화 추천 알고리즘 @api_view(['GET']) @permission_classes([IsAuthenticated]) # [1] def recommend_movie(request, emotion): # happy, sad, soso, angry, joy, depressed if emotion == 'happy': # 판타지, 가족, 애니메이션, 스릴러, TV 영화 (except 공포, 스릴러, 범죄) accept_ids = [14, 10751, 16, 53, 10770] except_ids = [27, 53, 80] elif emotion == 'sad': # 애니메이션, 코미디, 모험, 음악, 가족 (except 전쟁, 로맨스, 범죄) accept_ids = [16, 35, 12, 10402, 10751] except_ids = [10752, 10749, 80] elif emotion == 'soso': # 공포, SF, 다큐멘터리, 역사, 음악 (except 전쟁, 로맨스) accept_ids = [27, 878, 99, 36, 10402] except_ids = [10752, 10749, 16] elif emotion == 'angry': # 액션, 모험, 애니메이션, 코미디 (except 범죄, 다큐멘터리, 로맨스) accept_ids = [28, 12, 16, 35, 878] except_ids = [80, 99, 10749] elif emotion == 'joy': # 모험, SF, 미스터리, 판타지, 음악 (except 공포, 전쟁, 로맨스) accept_ids = [12, 878, 9648, 14, 10402] except_ids = [10752, 27, 10749] elif emotion == 'depressed': # 코미디, 음악, 판타지, 드라마, 액션 (except 전쟁, 로맨스, 범죄) accept_ids = [35, 10402, 14, 18, 28] except_ids = [10752, 27, 10749] # [2] movies = Movie.objects.filter(genres__in = accept_ids) # [3] serializer = MovieSerializer(movies, many=True) filtered_data = [] for data in serializer.data: # [4] gen = [gen['id'] for gen in data['genres']] # data안의 장르들을 for문으로 가져오고, 그들의 id를 list화 # [5] if all(g not in except_ids for g in gen): # gen의 g를 돌면서 g가 모두 except_ids에 포함되지 않으면 filtered_data.append(data) # [6] ran_filtered_data = random.sample(filtered_data, 10) return Response(ran_filtered_data)
-
-
커뮤니티 기능을 갖춘 영화 추천 웹 서비스
-
감정에 따라 영화를 추천하는 웹 서비스
-
모듀(MoodU)는 사용자의 감정에 따라 영화를 추천 받을 수 있는 커뮤니티 서비스를 구현한 프로젝트입니다. 일상 속에서 영화를 보게 되는 상황은 다양합니다. 영화를 통해 이전의 감정을 새로운 감정으로 덮을 수도 있고, 기존의 감정을 더 깊게 느낄 수 있는 계기가 될 수도 있습니다. 저희는 이 점에 집중해 프로젝트를 기획했습니다.
우리는 하루가 힘들었을 때, 감정을 전환하기 위한 방법을 찾습니다. 취미 혹은 주변 사람들을 통해 감정을 위로 받을 수도 있지만, 그렇지 못한 경우에는 감정을 억누르거나 해당 감정에 잠겨있게 됩니다. 저희 모듀는 사용자가 위로 받고, 다시 시작할 힘을 얻었으면 합니다.
기쁘고 행복한 상황은 영화와 함께 더 좋은 기억으로, 좋지 못한 상황에서는 영화와 함께 내일을 위한 감정을 새로 느낄 수 있게 만들고 싶습니다.
- 아쉽게도 서버 배포는 하지 못했습니다. 다음에 기회가 된다면, 꼭 해보고 싶네요!
😄 주아
쉽지 않다는 걸 예상하고 시작한 프로젝트였는데, 생각보다 훨씬 더 쉽지 않았다. 분명 배운 대로 진행했는데, 내 마음대로 구현되지 않는 상황에서 확실히 시험보다 더 빠르고, 정확하게 나의 부족한 부분을 확인해볼 수 있었다. 분명 초반에 확실하게 준비하고 기획했다고 생각했는데, 수많은 수정과 함께 계속 업데이트 되는 기존 계획들을 볼 때마다 앞으로 배워야 할 점이 차고 넘친다고 생각했다. 교수님이 강조하신 기획, 계획의 중요성을 체감할 수 있었다. 너무 디테일한 부분에 신경 쓰느라, 오히려 가장 중요한 부분을 놓친 것 같아 아쉽다. 지금까지는 참신한 아이디어를 내는 수준에서 그쳤는데, 내가 직접 구현하면서 아이디어를 내는 게 다가 아니라는 점을 다시 한 번 느꼈다. 2학기에는 새로운 프로그래밍 툴로 새로운 사람들과 프로젝트를 진행하게 될텐데, 기대되기도 하면서 걱정도 된다. 지금의 경험을 바탕으로 2학기 프로젝트도 열심히 해보겠습니다!