TIL

TIL (5) - Mini Project / Java Swing 영화 예약 시스템 개발 후기 / team CINE

SLug801 2026. 5. 22. 17:49


유레카 과정 첫 번째 미니 프로젝트가 끝났다.

 

이번에 다룬 프로젝트는 Java 21, Swing, JDBC, MySQL 기반의 영화예약 관리 시스템 이였다.

 

기본기능은 영화, 고객, 상영, 예매, 극장, 수익을 CRUD 로 관리하는 형태이며, 메인 대시보드를 중심으로 UI 파트와 백엔드 파트가 분리되어 있다.

 

 

 

1. 프로젝트 소개

 

유레카 과정 첫 번째 미니 프로젝트가 끝났다.

이번에 다룬 프로젝트는 Java 21, Swing, JDBC, MySQL 기반의 영화예약 관리 시스템 이였다.

기본기능은 영화, 고객, 상영, 예매, 극장, 수익을 CRUD 로 관리하는 형태이며, 메인 대시보드를 중심으로 UI 파트와 백엔드 파트가 분리되어 있다.

 

 

 

 

2. 협업 방식

 

  • Gradle

일단 팀원 5명 모두 개발환경이 달랐다. Mac/Win, IntelliJ/VS Code/Eclipse 등 개인별 IDE 차이가 있었다.

이걸 통일하기보다는, Gradle이라는 자바 프로젝트 빌드 도구를 이용해서 로컬로 수동 설치 제거, IDE 의존성을 전면 우회했고, 일관된 종속성을 제어했다.

/.gradlew run 명령어를 통해 터미널에서 빌드했고, 런타임 완전 동기화, 신속한 온보딩이라는 장점이있었다.

 

  • GitHub

Git Flow 기반 협업 프로세스를 사용했다.

표준 Git Flow 규칙인 main, dev, feature 브랜치를 분리하고

구현할 기능이나, 리팩토링, 버그사항등 이슈를 기반으로 작업을 시작했다

각자의 브랜치에서 작업, dev브랜치로 PR, AI Agent를 활요한 검토, 최종 main 브랜치에 병합했다.

 

 

3. DB설계

영화 관리 프로그램 ERD

 

전체 구조는 영화, 상영관, 상영 정보, 고객, 예매를 중심으로 구성되어 있으며, 실제 영화관 예매 흐름과 유사하게 설계하였다.

매출 페이지가 있지만, 별도 테이블없이 reservation x screening.price 집계 쿼리로 실시간 계산하는 탭을 만들었다

월간 / 연간 조회 기능이 있으면 좋았겠지만, 영화별 매출조회로 구현했다.

3일짜리 단기 프로젝트 였기 때문에 타협한 부분이였다.

 

screening 테이블은 영화 예매 시스템의 핵심 테이블인데,

어떤 영화가 어느상영관에서 몇시에 상영되는지 관리한다. 

영화와 상영관 테이블을 연결하는역할도 하고, 실제 예매 정보를 저장하는 예약테이블도 역시 1:N 관계를 가진다.

 

 

정리 

Movie 1 : N Screening 영화 하나는 여러 번 상영될 수 있고
Theater 1 : N Screening 상영관 하나에서도 여러 상영이 가능하고
Customer 1 : N Reservation 고객 한명이 여러번 예매가 가능하며
Screening 1 : N Reservation 하나의 상영에는 여러 예약이 발생 할 수있다.

 

이번 ERD 설계를 통해 데이터베이스에서 테이블을 단순히 만드는 것이 아니라, 실제 서비스 흐름을 기준으로 관계를 설계하는 과정이 중요하다는 점을 배울 수 있었다.

특히 영화, 상영, 예매를 분리하여 설계하면서 관계형 데이터베이스의 구조를 더 명확하게 이해할 수 있었다.

 

 

4. 데이터 파이프라인

 

이번 프로젝트는 역할을 분리하기 위해 레이어드 아키텍처 구조로 설계했다.

 

 

각 레이어는 자신만의 역할만 담당하도록 분리했고, 이를 통해 유지보수성과 확장성을 높였다.

 

 

Presentation Layer

Presentation Layer 는 사용자와 직접 상호작용하는 영역이다.

Swing 기반 UI 화면이 여기 포함된다.

사용자가 버튼을 누르거나 데이터를 입력하면 Controller 에게 요청을 전달한다.

이 레이어의 핵심 역할은 화면출력사용자 입력 처리 이다. 

 

 

Controller

Controller 는 화면과 비즈니스 로직 사이를 연결하는 역할을 한다.

사용자가 버튼을 클릭하면 요청을 받아서 Service 에게 전달한다.

즉 사용자 요청 수신, 필요한 Service 호출, 결과를 다시 화면에 전달하는 중간 관리자 역할이다.

 

Application Layer

객체 생성과 의존성 연결을 담당하는 계층이다.

수동 DI 방식으로 Service, Repository, Controller 객체를 조립하였다.

 

Domain Layer

프로젝트의 핵심 비즈니스 로직을 처리하는 영역이다.

Service 와 Repository Interface 가 포함되며, 예매 처리나 영화 조회 같은 기능이 여기서 수행된다.

특히 Service 는 구현체가 아닌 Repository 인터페이스에만 의존하도록 설계하였다.

 

Infrastructure Layer

실제 DB 접근을 담당하는 계층이다.

JDBC, SQL 실행, DB 연결 등의 작업을 처리하며, Repository Interface 의 구현체가 위치한다.

 

DIP 적용

이번 프로젝트에서는 DIP(의존성 역전 원칙)를 적용하였다.

즉 Service 가 JdbcRepository 같은 구현 클래스가 아닌 Repository 인터페이스만 바라보도록 설계하였다.

이를 통해 DB 기술이 변경되더라도 비즈니스 로직 수정 없이 유연하게 확장할 수 있도록 구성하였다.

 

 

 

5. 이번작업에서 배운점

 

  • 메인 대시보드에서 화면 전환, 상태 표시, 알림 등을 한 곳에서 관리하니 전체 흐름을 파악하기 쉬웠습니다.
  • Create / Update / List / Controller 구조가 반복되면서 기능 추가나 유지보수가 편하다는 점을 느꼈습니다.
  • 화면 로직과 DB 로직을 분리하니 한쪽 수정이 다른 부분에 미치는 영향이 줄어든다는 점을 이해할 수 있었습니다.
  • 버튼 클릭 → 스레드 실행 → API 호출 → 화면 갱신 흐름을 구현하면서 실제 애플리케이션 동작 방식을 경험할 수 있었습니다.
  • 처음에는 전체 구조를 잡는 과정에서 도움을 받았지만, 이후 직접 화면과 도메인 연결을 구현하면서 구조를 이해할 수 있었습니다.

 

 

Team CINE 깃허브주소

https://github.com/wongakim-99/ureka-mini-project

 

GitHub - wongakim-99/ureka-mini-project: 유레카 미니 프로젝트

유레카 미니 프로젝트. Contribute to wongakim-99/ureka-mini-project development by creating an account on GitHub.

github.com

시연영상

https://drive.google.com/drive/folders/1QoCCWdFMF8ip3dKsyoZeCawgE9OlsAsa?usp=sharing