Mavve 프로젝트
👨🏫 프로젝트 요약
ChatGPT 기반 영화 추천 기능을 제공하는 Wavve 클론코딩 웹앱
https://github.com/JUNKI007/Mavve
GitHub - JUNKI007/Mavve
Contribute to JUNKI007/Mavve development by creating an account on GitHub.
github.com
프로젝트 설명은 위 링크 Readme 참고
🎨 ERD

● 1: N 관계
영화 (Movies) 테이블과 리뷰(Review) 테이블
하나의 영화는 여러 개의 리뷰를 가질 수 있지만, 한 리뷰는 하나의 영화에 대해 연결될 수 있습니다.
사용자 (User) 테이블과 리뷰(Review) 테이블
하나의 유저는 여러 개의 리뷰를 가질 수 있지만, 한 리뷰는 하나의 유저에 대해 연결될 수 있습니다.
영화 (Movies) 테이블과 상영일정 (Screenings) 테이블
하나의 영화는 여러 개의 상영일정을 가질 수 있지만, 한 상영일정은 하나의 영화에 대해 연결될 수 있습니다.
상영관 (Theaters) 테이블과 상영일정 (Screenings) 테이블
하나의 상영관은 여러 개의 상영일정을 가질 수 있지만, 한 상영일정은 하나의 상영관에 대해 연결될 수 있습니다.
회원 (User) 테이블과 예매 정보 (Bookings) 테이블
한 회원은 여러 개의 예매 정보를 가질 수 있지만, 한 예매 정보는 하나의 회원에 대해 연결될 수 있습니다.
상영일정 (Screenings) 테이블과 예매 정보 (Bookings) 테이블
한 상영일정은 여러 개의 예매 정보를 가질 수 있지만, 한 예매 정보는 하나의 상영일정에 대해 연결될 수 있습니다.
● M : M 관계
N:M 관계:
영화 (Movies) 테이블과 배우 (Actor) 테이블
여러 영화가 여러 배우를 가질 수 있고, 한배우가 여러 영화에 출연할 수 있습니다.
영화 (Movies) 테이블과 사용자 (User) 테이블
여러 영화는 여러 사용자가 볼 수 있고, 한 사용자가 여러 영화를 볼 수 있습니다.
영화 (Movies) 테이블과 상영관 (Theaters) 테이블
여러 영화가 여러 상영관에서 상영될 수 있고, 한 상영관에서 여러 영화가 상영될 수 있습니다.
📃 프로젝트 구조 (아키텍쳐)

Java Servlet 기반의 MVC 구조를 적용하여, 기능 단위별로 명확하게 디렉토리를 분리하였습니다.
java 폴더에는 주요 로직과 백엔드 코드 (Controller, Service, DAO, DTO 등)를 구성하고,
webapp 폴더에는 JSP 기반 뷰와 정적 자원(CSS, JS, 이미지 등)을 정리하여 구분했습니다.
이처럼 구조화한 결과, 문제가 발생했을 때 해당 이슈가 어느 계층/폴더에 속하는지 빠르게 파악할 수 있었고,
유지보수가 쉬워졌으며, 팀원 간 역할 분담도 명확하게 진행할 수 있었습니다.
실무에 널리 사용되는 LTS 버전인 Java 8버전을 사용하였습니다.
현재 2025년 3월기준 Java LTS버전은 8, 11, 17, 21이 있습니다. 이 버전들은 오랜 기간 유지보수를 해주기때문에 실무에서 많이 사용되고, 특히 8버전은 오래 사용된 만큼 안정적이고 참고자료가 많아 입문용으로 적합하다고 판단하였습니다.

아키텍처 계층 | 폴더 구조 경로 |
---|---|
Frontend | webapp/views , webapp/style , webapp/js |
Servlet Controller | java/servlet/ |
Service Layer | java/service/ |
DAO | java/dao/ |
DTO | java/dto/ |
GPT API 연동 | java/chatGPT/ChatGPTMovieRecommendation |
DB (MySQL) | 외부 DB (MySQL Workbench 사용) |
🎈 데이터 흐름도

1. 데이터 입력
사용자는 HTML Form을 통해 영화 추천 요청, 회원가입 등 데이터를 입력합니다.
이 단계는 JSP, HTML, CSS, JavaScript로 구성되어 있으며, 시각적 요소와 인터랙션 중심입니다.
2. 전처리
ServletController에서 데이터를 수집하고, 유효성을 검증합니다.
3. 부분처리
Service Layer: 실제 애플리케이션의 핵심 로직을 처리합니다.
Ex) 영화 추천 요청이면 GPT API를 호출하고, 영화 등록이면 DB 저장을 요청합니다.
GPT API: OpenAI의 GPT API와 연동하여 AI 추천 결과를 받아옵니다
4. DB 처리 (DAO & MySQL)
DAO를 통해 DB에 접근하며, MySQL에 데이터 저장 또는 조회를 수행합니다.
이 계층을 분리함으로써 DB 로직의 재사용성과 테스트가 용이해졌습니다.
5. 데이터 흐름
1) GPT가 필요할 때
Service Layer → GPT API → Service Layer → Controller → Frontend
2) GPT를 사용하지 않을 때
User → HTML Form → ServletController → Service Layer → DAO → DB
🙋♂️ 맡은 파트
User 부분 백엔드 및 프론트엔드
(로그인, 비밀번호 관련 기능, 회원정보 찾기 등)
👨🦲 좋았던 점
① MVC 구조에 대한 이해
Java servlet 기반 MVC 아키텍쳐를 이용하여 각 계층별(DAO, DTO, Controller) 역할을 명확히 알 수 있었습니다.
② ChatGPT 연동
ChatGPT API 연동 경험
ChatGPT API를 활용한 AI 영화 추천 기능이 포함되어 있습니다. 해당 기능은 팀원이 주도적으로 구현했으며, 사용자 관리와 인증 관련 기능을 맡아 직접적인 구현에는 관여하지 않았습니다.
다만 프로젝트를 마무리하는 과정에서 GPT 모델 변경 및 API 키 교체 작업을 맡게 되었고, 이 과정에서 기존 코드 흐름을 분석하고 일부 수정하며 간접적으로 API 통신 구조를 학습할 수 있었습니다.
특히 최근에 다시 한번 지원 종료된 모델에서 최신 모델로 변경하고, 직접 OpenAI API 키를 발급받아 테스트한 경험은 외부 API 연동의 구조와 유의사항을 이해하는 데 도움이 되었습니다.
③ 로그인 및 회원가입 기능
사용자 인증 흐름을 처음부터 끝까지 구현하면서 웹 개발의 기본적인 흐름에 대한 실무 감각을 키울 수 있었습니다
.
👨🔧 어떤 문제가 있었고 어떻게 해결했는가?

① 문제상황 (DAO 없이 Entity 접근 시 발생한 무한 루프 에러)
프로젝트 초기 로그인 기능을 구현할 때, DAO 클래스를 사용하지 않고 Entity 객체에서 직접 데이터를 불러와 로그인 검증을 시도했었습니다.
이때, UserDto 객체를 그대로 JSP에서 출력하려고한 경우, 내부에 또 다른 객체나 자기 자신을 참조하고 있는 구조 때문에 JSP 렌더링 과정에서 무한루프가 발생해 페이지가 멈추는 현상이 나타났습니다.
② 원인 분석
Entity를 직접 JSP에서 렌더링할 경우, 객체 내부의 연관된 필드까지 계속 탐색하게 됩니다.
특히 양방향 관계가 있을 경우 순환 참조가 생겨 무한 루프가 발생한다는 사실을 알게되었습니다.
양방향뿐만 아니라, 단방향 구조였지만, 객체 필드 내에 null 혹은 초기화되지 않은 값이 있어도 toString() 탐색 중 에러가 발생할 수 있습니다.
③ 해결방법
비즈니스 로직을 분리하기 위해 DAO와 DTO를 사용한 구조로 리팩토링했습니다.
DB에서 데이터를 가져오는 책임은 UserDao로 맡기고,
로그인 인증은 UserDto에 필요한 최소한의 정보만 담아 처리하도록 했습니다.
④ 배운 점
처음에는 그냥 entity를 당겨오면 되지. dto를 만들고, dao를 쓰지?? 라고 생각했으나 이제는 MVC 패턴에서 계층을 분리하는 이유를 정확히 알게 되었습니다.
Entity를 JSP에 직접 전달하거나 출력하는 건 불필요한 참조, 보안 문제, 렌더링 에러를 유발할 수 있음을 배웠습니다.
🙎♂️ 아쉬웠던 점 및 개선할 부분
팀원끼리 협업하고 역할을 나눈 프로젝트였으므로, 로그인 및 회원가입, 유저 관련 외의 다른 기능들은 직접 구현해보지 못한 아쉬움이 있습니다. 하지만 매일 작업을 마치고 함께 진행한 코드리뷰를 통해, 전체 기능의 흐름과 사용된 API들을 자세히 이해할 수 있었습니다.
프로젝트 초반에는 MVC 구조에 익숙치 않아, DAO없이 Entity를 직접 연결하거나 JSP에서 직접 로직을 처리하게 하거나 하는 등의 문제가 발생했습니다. 이로 인해 무한루프, 렌더링 에러 등이 발생하였습니다. 다음 프로젝트부터는 명확히 구조를 잡고 시작할 수 있겠습니다.
Git 사용에도 아쉬움이 남습니다. 익숙하지 않아 초기에는 작업 파일을 압축하여 팀장에게 전달하고, 팀장이 대신 push하는 방식으로 진행했습니다. 그 결과 Git 커밋 로그에 제 이름이 남지 않아 기여도가 드러나지 않았다는 점이 아쉬웠습니다.
이 경험을 계기로 Git과 협업 브런치 전략에 대한 학습이 필요하다는 것을 느꼈고, 이후 프로젝트부터는 Git 활용을 적극적으로 연습하고 있습니다.
'Project' 카테고리의 다른 글
회고) DevineEcho 프로젝트 [2024.11.14 - 2025.03.03] (1) | 2025.03.27 |
---|---|
회고) AnimalWar 프로젝트 [2023.10.16 - 2023.11.27] (0) | 2025.03.27 |
SNS 사이트 구현하기 (임시) (0) | 2023.08.24 |
회고) BookBook 프로젝트 [2023.07.21 - 2023.08.03] (0) | 2023.08.03 |