내가 영화 추천 CLI를 만든 방법
Source: Dev.to
Introduction
저는 영화에 대한 감각이 남다릅니다—특히 현재 기분이나 나중에 느끼고 싶은 감정에 맞고, 함께 보는 사람과도 어울리는 좋은 영화를 말이죠. 적당한 영화를 찾는 일은 보통 번거롭습니다: 여러 제공업체, 스트리밍 서비스, 웹사이트를 오가며 필터를 적용하고 평점과 요약을 살펴봐야 하니까요. 이런 과정을 지긋지긋하게 여기게 되어, 저는 과정을 더 빠르고 약간은 즐겁게 만들 수 있는 간단한 커맨드‑라인 도구를 직접 만들었습니다.
코드는 Java 로만 작성했습니다. Java는 다재다능하고 강력한 객체‑지향 모델을 제공하며, 이번 강좌에서 주로 사용하는 언어이기 때문입니다. 외부 라이브러리를 전혀 사용하지 않아 구현을 가능한 한 단순하게 유지했고, 각 기능을 프레임워크에 의존하지 않고 “손으로” 이해할 수 있게 했습니다. 프로그램은 여러 클래스로 나뉩니다:
- Main class – 커맨드‑라인 인터페이스(CLI)를 제공
- Helper classes – 인증 및 영화 데이터를 처리
- Testing classes – 코드가 원활히 동작하는지 검증
모듈화된 구조 덕분에 한 번에 하나의 파트만 작업하기 쉬웠고, 관심사의 분리와 캡슐화 같은 표준 OOP 원칙을 적용해 유지보수와 향후 확장이 용이해졌습니다.
사용자 입장에서 워크플로우는 의도적으로 간단합니다: 터미널을 열고 도구를 실행한 뒤 환영 메시지를 받고, 로그인하고, 기분과 동행자에 관한 몇 가지 질문에 답하면 하나 이상의 영화 추천을 받게 됩니다. 각 추천에는 장르, 제목, 짧은 설명이 포함됩니다.
Feature 1: User Input and Validation
CLI는 사용자에게 입력을 요청하고, 응답이 기대하는 형식(예: 빈 문자열이 아닌 문자열, 범위 내의 숫자 선택)인지 검증합니다. 잘못된 입력이 들어오면 친절하게 다시 물어보며, 프로그램이 크래시되는 것을 방지합니다.
Feature 2: Auth class and file‑based authentication
인증은 Auth 클래스로 처리됩니다. 이 클래스는 각 줄에 username:password 형태로 저장된 평문 파일을 읽어들입니다. 파일에 있는 자격 증명을 객체 컬렉션에 로드하고, 저장된 데이터와 사용자의 로그인 시도를 비교하는 메서드를 제공합니다.
Feature 3: Questions, preferences and loops
질문 객체 리스트를 루프에서 순차적으로 처리합니다. 각 답변은 하나 이상의 영화 장르로 매핑됩니다. 예를 들어 “차분한” 분위기를 선호한다면 drama, romance, slice‑of‑life 같은 장르로 변환됩니다. 결과 장르 리스트에는 중복이 포함될 수 있습니다(예: ["Drama", "Action", "Comedy", "Drama"]). 중복은 의도적인 가중치 메커니즘으로, 특정 장르가 많이 등장할수록 최종 점수에 더 큰 영향을 미칩니다.
Feature 4: Movie objects and scoring algorithm
영화는 제목, 설명, 연관 장르 필드를 가진 객체로 표현됩니다. 사용자의 선호가 가중된 장르 리스트로 변환된 뒤, 프로그램은 각 영화가 그 리스트와 얼마나 많이 일치하는지 점수를 매깁니다. 점수가 높은 영화가 먼저 제시되어, 사용자의 기분과 동행자에 가장 잘 맞는 추천을 제공합니다.
Issues Encountered
- Human Input – 예측할 수 없는 사용자 응답을 처리하고 견고하게 검증하는 방법.
- Designing a suitable scoring system – 외부 라이브러리 없이도 간단하면서 효과적인 알고리즘을 만드는 일.
- Constraints without external libraries – 인증, 테스트, UI 등을 순수 Java 기능만으로 구현해야 하는 제약.
Conclusion
그 결과는 현재 상황에 맞춘 빠른 영화 추천을 원하는 파워‑터미널 사용자에게 적합한 우아한 도구가 되었습니다. 앞으로는 IMDb API를 연동해 최신 영화 데이터를 자동으로 가져오고, 로컬 영화 데이터베이스를 수동으로 업데이트해야 하는 부담을 줄이는 방향으로 개선할 수 있을 것입니다.