|
1 |
| -# cinebox |
| 1 | +# cinebox |
| 2 | + |
| 3 | +# 영화 예매 시스템 |
| 4 | + |
| 5 | +> **React + Spring Boot + AWS + Kubernetes 기반의 영화 예매 웹 애플리케이션** |
| 6 | +> CI/CD 자동화 및 클라우드 인프라 구축을 통해 운영 가능한 시스템 설계 및 구현 |
| 7 | +
|
| 8 | +--- |
| 9 | + |
| 10 | +## 프로젝트 개요 |
| 11 | + |
| 12 | +이 프로젝트는 **영화 예매 서비스**를 위한 웹 애플리케이션으로, |
| 13 | +사용자(고객)와 관리자(운영자)의 기능을 모두 포함하며, |
| 14 | +AWS 기반 클라우드 인프라 위에서 자동화된 배포 환경을 갖추고 있습니다. |
| 15 | + |
| 16 | +### 주요 목표 |
| 17 | +- 실제 상영 서비스처럼 영화 등록, 상영 시간 설정, 예매/결제 기능 제공 |
| 18 | +- REST API 기반 프론트/백 분리 구조 |
| 19 | +- CI/CD 자동화 및 GitOps 배포 실습 |
| 20 | + |
| 21 | +--- |
| 22 | + |
| 23 | +## 주요 기능 |
| 24 | + |
| 25 | +### 사용자 기능 |
| 26 | +- 영화 목록 조회 |
| 27 | +- 날짜별 상영 시간 선택 |
| 28 | +- 좌석 선택 및 예매 |
| 29 | +- 결제 연동 |
| 30 | +- 리뷰 작성 및 마이페이지 조회 |
| 31 | + |
| 32 | +### 관리자 기능 |
| 33 | +- 영화 등록/수정 |
| 34 | +- 상영관 및 상영 정보 설정 |
| 35 | +- 예매 내역 관리 |
| 36 | + |
| 37 | +--- |
| 38 | + |
| 39 | +## 인프라 설계 |
| 40 | + |
| 41 | + |
| 42 | +## ERD 설계 |
| 43 | + |
| 44 | + |
| 45 | +--- |
| 46 | + |
| 47 | +## 기술 스택 |
| 48 | + |
| 49 | +| 분류 | 기술 | |
| 50 | +|------|------| |
| 51 | +| Frontend | React, React Router, MUI, Axios, React Calendar, React Toastify | |
| 52 | +| Backend | Spring Boot 3.4.2, JDK 17, JPA (ORM), MySQL, Redis, Maven | |
| 53 | +| API 연동 | 영화진흥위원회 API (KOBIS), KMDB | |
| 54 | +| 인증/보안 | OAuth2.0, JWT (Access/Refresh Token) | |
| 55 | +| Infra & DevOps | AWS (EKS, RDS, S3, Route 53, ELB, IAM, VPC), Docker, GitHub Actions, Terraform, ArgoCD, Prometheus, Grafana | |
| 56 | + |
| 57 | +--- |
| 58 | + |
| 59 | +## 프로젝트 실행 방법 |
| 60 | + |
| 61 | +### 방법 1: 배포된 웹 접속 |
| 62 | + |
| 63 | +서비스는 다음 도메인을 통해 확인할 수 있습니다: |
| 64 | + |
| 65 | +[https://cine-box.store](https://cine-box.store) |
| 66 | + |
| 67 | +--- |
| 68 | + |
| 69 | +### 방법 2: 로컬에서 직접 실행하기 |
| 70 | + |
| 71 | +#### 1. 설정 파일 생성 (필수) |
| 72 | + |
| 73 | +먼저 `src/main/resources/application.properties` 파일을 아래 예시를 참고하여 작성해야 합니다. |
| 74 | +→ 민감한 정보(API 키, DB 비밀번호 등)는 실제 값으로 교체해주세요. |
| 75 | +→ 해당 파일은 `.gitignore`에 포함되어야 하며, Git에 커밋되지 않도록 주의하세요. |
| 76 | + |
| 77 | + |
| 78 | +[application.properties 예시](#applicationproperties-예시) |
| 79 | + |
| 80 | +```properties |
| 81 | +spring.application.name={ YOUR_APPLICATION_NAME } |
| 82 | + |
| 83 | +# Primary DataSource |
| 84 | +spring.datasource.primary.hikari.type=com.zaxxer.hikari.HikariDataSource |
| 85 | +spring.datasource.primary.hikari.driver-class-name=com.mysql.cj.jdbc.Driver |
| 86 | +spring.datasource.primary.hikari.username={ YOUR_DB_USERNAME } |
| 87 | +spring.datasource.primary.hikari.password={ YOUR_DB_PASSWORD } |
| 88 | +spring.datasource.primary.hikari.jdbc-url=jdbc:mysql://{YOUR_DB_HOST}:{YOUR_DB_PORT}/{YOUR_DB_NAME} |
| 89 | + |
| 90 | +# Secondary DataSource |
| 91 | +spring.datasource.secondary.hikari.type=com.zaxxer.hikari.HikariDataSource |
| 92 | +spring.datasource.secondary.hikari.driver-class-name=com.mysql.cj.jdbc.Driver |
| 93 | +spring.datasource.secondary.hikari.username={ YOUR_DB_USERNAME } |
| 94 | +spring.datasource.secondary.hikari.password={ YOUR_DB_PASSWORD } |
| 95 | +spring.datasource.secondary.hikari.jdbc-url=jdbc:mysql://{YOUR_DB_HOST}:{YOUR_DB_PORT}/{YOUR_DB_NAME} |
| 96 | + |
| 97 | +# 공통 Hikari 설정 |
| 98 | +spring.datasource.hikari.pool-name=Hikari |
| 99 | +spring.datasource.hikari.auto-commit=false |
| 100 | + |
| 101 | +# Redis |
| 102 | +spring.data.redis.host={ YOUR_REDIS_HOST } |
| 103 | +spring.data.redis.port={ YOUR_REDIS_PORT } |
| 104 | + |
| 105 | +# JPA |
| 106 | +spring.jpa.generate-ddl=false |
| 107 | +spring.jpa.hibernate.ddl-auto=none |
| 108 | +spring.jpa.properties.hibernate.format_sql=true |
| 109 | +spring.jpa.show-sql=false |
| 110 | + |
| 111 | +# Multipart 설정 |
| 112 | +spring.servlet.multipart.max-file-size=20MB |
| 113 | +spring.servlet.multipart.max-request-size=20MB |
| 114 | + |
| 115 | +# AWS S3 설정 |
| 116 | +cloud.aws.credentials.access-key={ YOUR_AWS_CREDENTIALS_KEY } |
| 117 | +cloud.aws.credentials.secret-key={ YOUR_AWS_SECRET_KEY } |
| 118 | +cloud.aws.s3.bucket={ YOUR_S3_BUCKET_NAME } |
| 119 | +cloud.aws.region.static={ YOUR_S3_REGION } |
| 120 | +cloud.aws.stack.auto=false |
| 121 | + |
| 122 | +# JWT 설정 |
| 123 | +security.jwt.secretkey=your-secret-key |
| 124 | +security.jwt.accessTokenValidityInMilliseconds=3600000 |
| 125 | +security.jwt.refreshTokenValidityInMilliseconds=604800000 |
| 126 | + |
| 127 | +# 외부 API 연동 - 영화진흥위원회 & KMDB |
| 128 | +kobis.api.key={ YOUR_API_SECRET_KEY } |
| 129 | +kobis.api.url=http://kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json |
| 130 | + |
| 131 | +kmdb.api.key={ YOUR_API_SECRET_KEY } |
| 132 | +kmdb.api.url=https://api.koreafilm.or.kr/openapi-data2/wisenut/search_api/search_json2.jsp?collection=kmdb_new2&detail=Y |
| 133 | + |
| 134 | +# Kakao 로그인 연동 |
| 135 | +spring.kakao.auth.client={ YOUR_KAKAO_AUTH_KEY } |
| 136 | +spring.kakao.auth.redirect={ YOUR_REDIRECT_URL } |
| 137 | + |
| 138 | +# Cookie Domain 설정 |
| 139 | +## If your env is localhost, it would be empty. |
| 140 | +domain={ YOUR_DOMAIN } |
| 141 | + |
| 142 | +# Spring Boot Actuator |
| 143 | +management.endpoints.web.exposure.include=prometheus,health,metrics,info |
| 144 | + |
| 145 | +# Logback |
| 146 | +logging.config=classpath:logback-spring.xml |
| 147 | +``` |
| 148 | + |
| 149 | +--- |
| 150 | + |
| 151 | +#### 2. 백엔드 실행 (Spring Boot) |
| 152 | + |
| 153 | +```bash |
| 154 | +# 레포지토리 클론 |
| 155 | +git clone [레포지토리 주소] |
| 156 | +cd cinebox |
| 157 | + |
| 158 | +# 빌드 및 실행 |
| 159 | +./mvnw spring-boot:run |
| 160 | +``` |
0 commit comments