Skip to content

Juahjoah/MoodU

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 

Repository files navigation

Readme.md

MoodU(모듀)

  • Mood you : 당신의 오늘의 집중하겠다.
  • 모듀 : 모두의 감정에 집중하겠다.
  • movie, mood, emotion에 모두 포함된 알파벳인 M과 O를 살려서 네이밍

1. 팀원 정보 및 업무 분담 내역

  • 팀장 : 김주아 : UX/UI 생성 및 Vue Components 구조 생성, axios로 백엔드와 통신, 프론트엔드 화면 구현
  • 팀원 : 유은겸 : ERD 구성 및 백엔드 로직 생성, axios로 백엔드와 통신

2. 목표 서비스 구현 및 실제 구현 정도

목표 서비스

  • 초기 component 구조

    Untitled

  • 사용자

    • 로그인/로그아웃
    • 회원가입/탈퇴
    • 팔로우/팔로잉
    • 프로필
  • 커뮤니티

    • 게시글 조회
    • 게시글 작성/수정/삭제
    • 게시글 댓글
  • 영화

    • 영화 목록 조회
    • 영화 상세 조회
    • 영화 좋아요 버튼
  • 추가 기능

    • 사용자 개인의 감정 기록
    • 다른 사람의 프로필 방문
    • 영화 검색
    • 감정을 바탕으로 하는 영화 추천

실제 구현 서비스

  • 최종 component 구조

    230525.png

  • 사용자 : simple jwt 토큰을 사용하여 로그인이 필요한 기능 이용 시 headers에 담아 전송

    • 로그인/로그아웃
    • 회원가입 기능 생성
    • 팔로우/팔로잉 기능 생성
    • 프로필 기능 생성
  • 커뮤니티

    • 게시글 조회
    • 게시글 작성/수정/삭제
  • 영화

    • 영화 목록 조회
    • 영화 상세 조회 : 영화의 타이틀, 개봉일, 인기도, 평균 점수, 투표 수, 장르, 줄거리, 유튜브 예고편에 대한 정보 제공
    • 영화 좋아요 버튼 : 좋아요를 누른 유저 수에 대한 정보 제공
    • 영화 내 댓글 생성/삭제 : 댓글은
  • 추가 기능

    • 영화 : 영화 검색, 감정을 바탕으로 하는 영화 추천 기능 생성
    • 사용자 : 게시글의 작성자를 누르면 해당 작성자의 프로필로 이동하는 기능 생성

3. 데이터베이스 모델링(ERD)

Untitled

4. 영화 추천 알고리즘에 대한 기술적 설명

💡 사용자의 감정을 기반으로 한 영화 추천 알고리즘
  • 오늘의 기분을 선택하면, 미리 설정한 장르에 맞는 영화를 추천해준다.
  • 인간이 느끼는 대표적인 감정 6개 (happy, sad, soso, angry, joy, depressed)를 기반으로 영화를 추천한다.
  1. 각각의 감정에 따라 필수적으로 포함되는 장르의 아이디를 accept_ids에 담고, 예외할 장르의 아이디를 except_ids에 담는다.
  2. filter를 통해 Movie model에 담겨 있는 영화들 중 accept_ids가 genres안에 있는 영화들만 골라 movies에 저장한다.
  3. movies를 직렬화(serializer)한 뒤, for문을 통해 serializer.data로 영화 하나씩의 정보를 확인한다.
  4. 각 영화에는 장르 아이디가 여러 개 들어있는데, 그 또한 for문을 통해 장르 아이디만 list로 담는다.(gen)
  5. 장르 아이디를 각각 확인하면서, 제외하고자 했던 영화 장르를 담은 아이디 값이 list안에 모두 없으면 그 영화를 filtered_data에 담는다.
  6. 모두 담은 영화 중 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)

5. 서비스 대표 기능에 대한 설명

  • 커뮤니티 기능을 갖춘 영화 추천 웹 서비스

  • 감정에 따라 영화를 추천하는 웹 서비스

  • 모듀(MoodU)는 사용자의 감정에 따라 영화를 추천 받을 수 있는 커뮤니티 서비스를 구현한 프로젝트입니다. 일상 속에서 영화를 보게 되는 상황은 다양합니다. 영화를 통해 이전의 감정을 새로운 감정으로 덮을 수도 있고, 기존의 감정을 더 깊게 느낄 수 있는 계기가 될 수도 있습니다. 저희는 이 점에 집중해 프로젝트를 기획했습니다.

    우리는 하루가 힘들었을 때, 감정을 전환하기 위한 방법을 찾습니다. 취미 혹은 주변 사람들을 통해 감정을 위로 받을 수도 있지만, 그렇지 못한 경우에는 감정을 억누르거나 해당 감정에 잠겨있게 됩니다. 저희 모듀는 사용자가 위로 받고, 다시 시작할 힘을 얻었으면 합니다.

    기쁘고 행복한 상황은 영화와 함께 더 좋은 기억으로, 좋지 못한 상황에서는 영화와 함께 내일을 위한 감정을 새로 느낄 수 있게 만들고 싶습니다.

6. 배포 서버 URL(배포한 경우에만)

  • 아쉽게도 서버 배포는 하지 못했습니다. 다음에 기회가 된다면, 꼭 해보고 싶네요!

7. 기타( 느낀 점, 후기 등)

😁 은겸 처음 시작할 때만 해도 완성본이 전혀 그려지지 않는 막막한 상태였는데 어떻게 하다 보니 웹사이트 하나가 만들어졌다. 좌절도 많이 했지만 그만큼 성장도 많이 한 것 같다. 특히 이전보다 에러를 대응하는 일에 겁먹지 않게 되었고, git에 대해 아주 아주 아주 조금 이해하게 되었다. 또 Django를 어느 정도는 이해하고 있다고 생각했는데 프로젝트를 하면서 그 생각을 완전히 부수게 되었다. 그만큼 배운 것도 많아서 다음번엔~~(있을지 모르지만)~~ 덜 찾아보고 더 이해하며 코드를 짤 수 있을 것 같다. 또 느낀 점은 ‘계획’이 무지 어렵다는 점이다. 계획을 세우고 개발을 해본게 처음이라 그런지 몰라도 일일히 쓰는게 어려웠다. 기능에 대한 욕심은 많지 않았는데 좋은 코드를 작성하는데 욕심을 더 내지 못했던게 아쉽다. 다음번엔 더 잘할 수 있을거다… 마지막으로 멍청하지만 그래도 잘 이용했던 chat gpt 와 나의 거지같은 체력을 이해해준 주아와 다른 조임에도 불구하고 도움을 요청할 때마다 도와줬던 수혁이에게 감사를 전한다.
😄 주아

쉽지 않다는 걸 예상하고 시작한 프로젝트였는데, 생각보다 훨씬 더 쉽지 않았다. 분명 배운 대로 진행했는데, 내 마음대로 구현되지 않는 상황에서 확실히 시험보다 더 빠르고, 정확하게 나의 부족한 부분을 확인해볼 수 있었다. 분명 초반에 확실하게 준비하고 기획했다고 생각했는데, 수많은 수정과 함께 계속 업데이트 되는 기존 계획들을 볼 때마다 앞으로 배워야 할 점이 차고 넘친다고 생각했다. 교수님이 강조하신 기획, 계획의 중요성을 체감할 수 있었다. 너무 디테일한 부분에 신경 쓰느라, 오히려 가장 중요한 부분을 놓친 것 같아 아쉽다. 지금까지는 참신한 아이디어를 내는 수준에서 그쳤는데, 내가 직접 구현하면서 아이디어를 내는 게 다가 아니라는 점을 다시 한 번 느꼈다. 2학기에는 새로운 프로그래밍 툴로 새로운 사람들과 프로젝트를 진행하게 될텐데, 기대되기도 하면서 걱정도 된다. 지금의 경험을 바탕으로 2학기 프로젝트도 열심히 해보겠습니다!