본문 바로가기

국비 교육

첫 미니 프로젝트 : 영화 OTT 플랫폼

국비 수업을 들은지 두 달이 다 되어가는 와중에, 오직 자바와 콘솔 입출력 기능만 갖고 24시간동안 프로그램을 짜보는 프로젝트 시간을 가졌다. 이 글을 24시간 동안 둘이서 한 팀원과 둘이서 코딩을 한 결과물이며 이 이후로 계속 리팩토링과 기능 개선을 한 결과물은 다음 저장소에 확인할 수 있다.

<깃헙 저장소 - mini-project>

 

 전체적인 컨셉 

 

프로젝트의 주제는 자유였고, 나와 또 다른 팀원 한 명은 영화 OTT 플랫폼의 추천 알고리즘을 흉내내어 보기로 결정했다. 회사에서 사용하는 추천 알고리즘은 머신러닝과 AI를 활용하겠지만, 그 수준은 상상도 못하고 그 대신 간단한 추천 리스트를 만들어보기로 했다. 예를 들면

 

  • 같은 성별, 같은 나잇대의 회원 집단에서 시청한 영화를 조회수 순으로 나열한 리스트
  • 회원의 취향 장르를 한 영화를 시청할 때마다 그 동안 시청한 모든 영화의 장르를 조회해서 가장 많이 본 장르로 업데이트하는 기능

이정도가 있었는데, 결국 프로젝트를 진행하면서 시간 여유가 없어 전자는 구현하지 못했다. 이외에도 가장 기본적으로 주어지는 기능들도 몇가지 구현했는데

  • 시청한 영화 리스트
  • 보고 싶은 영화 리스트

시청한 영화 리스트는 다시보기 기능과 취향 장르를 계산하기 위한 데이터였고, 보고 싶은 영화 리스트에는 회원가입을 할때부터 추가가 가능하며 영화를 보고나면 보고싶은 영화 리스트에서 삭제하는 기능도 추가헀다. 또한 비록 콘솔이나 좀더 보기 좋은 콘솔화면을 구현해보기 위해서 아스키 아트를 사용하여 콘솔의 비루함을 최대한 줄여보려고 했으며, 권한(로그아웃, 로그인, 관리자)에 따라서 다른 화면을 띄우도록 했다.


 구현된 기능 

 

기능을 회원의 상태 / 권한에 따라 나누었다.

  • 로그 아웃 상태에서는 -> 로그인 상태
                                     -> 관리자 상태
  • 로그인 상태에서는 -> 로그아웃 상태
  • 관리자 상태에서는 -> 로그아웃 상태

로 전환이 가능하여 결국에는 로그아웃, 로그인, 관리자 상태를 자유롭게 드나들 수 있다.

로그아웃 상태 로그인 상태 관리자 상태
회원가입 로그아웃 회원 관리 회원 추가
회원 조회
회원 수정
회원 삭제


로그인







영화시청




영화 관리 영화 추가
영화 조회
영화 수정
영화 삭제
관리자 보고싶어요 취소  
종료 장르별 더보기 동료  
  인기순 더보기    
  다시보기    
  종료    

 


 화면 

로그아웃 상태

  ____    _____   _______   ______   _        _____  __   __
 |  _ \  |_   _| |__   __| |  ____| | |      |_   _| \ \ / /
 | |_) |   | |      | |    | |__    | |        | |    \ V /
 |  _ <    | |      | |    |  __|   | |        | |     > <        //-> 로고
 | |_) |  _| |_     | |    | |      | |____   _| |_   / . \ 
 |____/  |_____|    |_|    |_|      |______| |_____| /_/ \_\

*************************************************************
*                                                           *
*-----------------!!      Top 5           !!----------------*     //->  인기순 5개씩 출력
*                                                           *     //    q누르면 다음 메뉴 출력
*************************************************************

          	1. 어바웃 타임
          	2. 이터널 선샤인
          	3. 라라랜드
          	4. 캐롤
          	5. 타이타닉
            :

[메인 페이지]
**************************************************************
*            로그인            *             회원가입            *
**************************************************************    //-> 로그아웃 상태의 메뉴
*            관리자            *              종료              *
**************************************************************

로그아웃 화면은 다음과 같이 이루어져있다.

  • 로고
  • 전체 영화를 인기순으로 5개씩 끊어 출력 (q를 입력하면 더이상 출력하지 않고, 다음 메뉴를 출력한다.)
  • 로그아웃 상태의 기능을 나열한 메뉴

관리자 상태

**************************************************************
*            회원관리          *             영화관리            *
**************************************************************
*                            종료                             *
**************************************************************

회원관리와 영화관리, 종료 기능을 포함한 관리자 메뉴를 띄우며 회원관리를 입력하면 다음과 같이 나타난다. 빈문자열을 입력하면 뒤로 갈 수 있다.

**************************************************************
*            회원추가          *            회원조회              *
**************************************************************
*            회원수정          *            회원삭제              *
**************************************************************

반면, 영화관리를 입력하면 다음과 같은 메뉴를 띄우며, 마찬가지로 빈문자열을 입력하면 다시 기본 관리자 메뉴로 갈 수 있다.

**************************************************************
*            영화추가          *            영화조회             *
**************************************************************
*            영화수정          *            영화삭제             *
**************************************************************

로그인 상태

  ____    _____   _______   ______   _        _____  __   __
 |  _ \  |_   _| |__   __| |  ____| | |      |_   _| \ \ / /
 | |_) |   | |      | |    | |__    | |        | |    \ V /
 |  _ <    | |      | |    |  __|   | |        | |     > <      // -> 로고
 | |_) |  _| |_     | |    | |      | |____   _| |_   / . \ 
 |____/  |_____|    |_|    |_|      |______| |_____| /_/ \_\

*************************************************************
*                                                           *
*-----------------!!      Romance         !!----------------*   // -> 취향 장르 영화 5개 출력
*                                                           *
*************************************************************

          	1. 어바웃 타임
          	2. 이터널 선샤인
          	3. 라라랜드
          	4. 캐롤
          	5. 타이타닉

*************************************************************
*                                                           *
*-----------------!!      Top 5           !!----------------*   // -> 전체 영화중 인기순 5개씩 출력
*                                                           *
*************************************************************

          	1. 어바웃 타임
          	2. 이터널 선샤인
          	3. 라라랜드
          	4. 캐롤
          	5. 타이타닉
          	:

1님 안녕하세요!
**************************************************************
*                         영화 시청                            *
**************************************************************
*           보고싶어요           *            다시보기            *
**************************************************************   // -> 로그인 상태 메뉴
*          장르별 더보기         *           인기순 더보기          *
**************************************************************
*            로그아웃           *              종료             *
**************************************************************

로그인 상태의 화면은 다음과 같이 이뤄져있다.

  • 로고
  • 취향 장르의 영화 다섯개 출력
  • 전체 영화를 인기순으로 5개씩 끊어 출력 (q를 입력하면 더이상 출력하지 않고, 다음 메뉴를 출력한다.)
  • 로그인 상태의 기능 나열한 메뉴

 

 클래스 

 

mini.project 패키지

App 클래스

main 메서드가 있는 엔트리 포인트이다. 이것을 실행하면 조건문이 실행되어 이용자의 권한에 따라 CommandProcesser의 메서드가 다르게 실행된다.

 

mini.project.util 패키지

CommandProcesser 클래스

권한에 따라 실행될 메서드

  • isLoggedOut()
  • isLoggedIn()
  • isManager()

가 준비되어있고, 각 메서드 안에는 switch()문이 있어 이용자의 입력값에 따라 각 권한의 메뉴에서 기능을 실행한다.

 

Prompt 클래스

int, String, Genre 타입의 값을 입력받는 도구를 갖고 있다.

 

Screen 클래스

  • 어떤 종류의 영화 목록을 화면에 띄우는 도구(viewMovies)
  • 로고를 화면에 띄우는 도구(logo, bitflixLogo)
  • 영화를 시청할 때 띄우는 도구(getWatchScreen -> getMovieScreen -> getHorrorScreen/getActionScreen/getFamiltyScreen/getRomanceScreen)

다음과 같은 메서드들이 있다.

 

mini.project.Handler 패키지

MemberHandler 클래스

관리자 권한으로 회원을 관리하거나, 전체 회원 집단을 다룰 때 사용되는 클래스이다.

 

MovieHandler 클래스

다양한 종류의 영화 집단을 관리하고 있다. 예를 들어 전체 영화 집단, 각 회원의 보고싶은 영화 집단, 각 회원의 시청한 영화 집단에 대하여 추가, 수정, 삭제 등의 기능을 제공한다.

 

mini.project.domain 패키지

Member 클래스

각 회원의 정보를 저장하고 있는 데이터 타입인 동시에, 회원 개개인의 행위를 구현하는 메서드(removeToWatch, addWatched, printToWatchList, printHistory, watch, caculcateFavoriteGenre)를 갖는다.

 

Movie 클래스

각 영화에 대한 정보를 저장하는 데이터 타입이다.


 로그아웃 상태에서의 클래스 관계 

 

 

로그인, 관리자까지 설계도를 그리려고 했는데 도저히 너무 힘들어서 못하겠다. 각 의존관계가 여전히 너무 복잡하고 상식적이지 못하다.

 


 

느낀점

아쉬운점

  • 스크린 클래스의 viewMovies 메서드를 영화 정보 뿐만 아니라 다양한 String 값을 출력할 수 있도록 파라미터를 String 으로 바꿨어야했다.
  • Client 측에서 여전히 너무 많은 일을 하고 있다. 사용되는 객체가 온전히 자기 일을 할 수 있도록 메서드를 만들어줘야만 했다. 
// MemberHandler 에서 Member의 toWatchList필드를 갖고와서 직접 add하는 모습
member.getToWatchList().add(movie)

// => MemberHandler에서 Member에게 보고 싶은 영화에 영화를 추가하라고 시키고 
member.addToWatchList(movie);

// Member에서 이 일을 Member에서 온전히 했어야한다.
public void addToWatchList(Movie movie) {
  getToWatchList().add(movie);
}
  • CommandProcesser에서 직접 Screen 클래스 화면 요소를 띄우는 메서드를 여러번 호출하여 화면을 조합하는 일까지 하고 있다. 화면을 조합하는 일은 Screen에서 담당해야한다.
    // CommandProcesser에서 Screen 클래스의 메서드를 여러번 호출해서 직접 화면을 조합하고 있다.
    Screen.bitflixLogo();
    movieHandler.printBest();
    Screen.viewMenu(Screen.BEFORE_LOGIN_PAGE);
    
    // 그냥 완성된 화면을 호출하기만 할 수 있도록 해야한다.
    Screen.getMainScreen();
    
    // Screen 클래스에서는 화면을 조합하는 메서드를 만들어야한다. 
    public void getMainScreen() {
    // 이용자의 권한에 따라 달라지는 화면 조합 구현
    }

 

진짜 느낀점

  • 코드는 인간의 생각을 그대로 구현한 것이라는 말이 정말 맞는 말이다. 같은 코드라도 보는 사람에 따라, 만드는 사람에 따라 전혀 다르게 생각이 가능하고, 그런 차이에 따라 코드의 작성 방향이 달라진다.
  • 구현하는 동안 너무 코드가 지저분하다고 좌절할 필요가 없는 것 같다. 당장은 엄청 구리더라도, 구현하고 나면 깨끗하게 정리할 수 있는 부분이 언제나 존재한다.
  • 프로그래밍에서 알고리즘이 필요한 순간이 있을 수는 있으나, 프로그래밍과 알고리즘은 전혀 다른 것이라는 것을 확실히 알았다.