⚠️ 교육 목적 프로젝트
이 프로젝트는 데이터베이스 과목 텀프로젝트로서 교육 및 학습 목적으로만 제작되었습니다.
상업적 목적이 아니며, 실제 서비스로 운영되지 않습니다.
CineCollector는 영화 팬덤 문화를 기반으로 굿즈(특전) 수집, 이벤트 참여, 관람 기록 관리를 한 곳에서 해결하는 플랫폼입니다.
영화관과 창작자, 수집가들이 모두 참여할 수 있는 생태계를 구축하는 것을 목표로 합니다.
최근 영화 커뮤니티는 굿즈 수집, N차 관람, 한정판 이벤트 중심으로 활성화되어 있습니다.
CineCollector는 이러한 활동을 구조적으로 기록하고 공유하는 영화 수집 종합 플랫폼입니다.
홈 화면에서 다른 사용자들이 공개한 관람 기록을 확인할 수 있습니다. 영화 포스터, 평점, 후기, 수집한 특전 정보를 한눈에 볼 수 있으며, 사용자 간 영화 관람 경험을 공유할 수 있습니다.
진행 중인 영화 특전 이벤트를 검색하고 필터링하여 확인할 수 있습니다. 이벤트 상세 페이지에서는 특전 정보, 증정 지점, 재고 현황을 확인하고 특전을 신청할 수 있습니다.
이벤트 목록
- 영화별, 상태별(진행 중/예정/종료) 필터링
- 이벤트별 특전 정보 및 증정 지점 수 확인
이벤트 상세
- 이벤트 기간, 특전 상세 정보 확인
- 증정 지점 목록 및 재고 현황 확인
- 특전 신청 기능
특전 신청
- 극장별 재고 확인 후 신청
- 1인당 제한 수량 확인
수집한 특전을 영화별로 관리하고 수집 진행률을 확인할 수 있습니다. 수정 모드에서 특전을 추가하거나 삭제하여 나만의 특전 도감을 완성할 수 있습니다.
특전 수집 진행도 통계
- 전체 특전 수, 수집 완료 수, 수집률 표시
- 영화별 수집 현황 요약
특전 도감
- 영화별로 그룹화된 특전 목록
- 수집한 특전과 미수집 특전 구분 표시
- 주차별 특전 정보 확인
특전 도감 등록/수정
- 수정 모드에서 특전 클릭으로 수집 상태 변경
- 영화별 수집 현황 실시간 업데이트
개인 프로필을 관리하고 관람 기록을 작성하여 공유할 수 있습니다.
프로필 페이지
- 사용자 정보 및 가입일 확인
- 최근 관람 기록 미리보기
- 프로필 수정 기능
내 관람기록 페이지
- 전체 관람 기록 목록 확인
- 검색 및 연도별 필터링
- 관람 통계 (총 관람, 이번 달 관람, 평균 평점)
관람기록 작성
- 영화 선택, 관람일, 극장 선택
- 별점 및 후기 작성
- 공개/비공개 설정
극장 운영자는 자신의 극장에서 진행하는 이벤트의 재고를 관리하고, 특전 신청자 목록을 확인할 수 있습니다.
재고 목록
- 극장별 특전 재고 현황 확인
- 재고 통계 (총 재고, 사용 가능, 소진 완료)
재고 수정
- 특전별 재고 수량 업데이트
- 재고 상태 변경 (재고 있음/소진 완료)
신청자 목록 확인
- 특전별 신청자 정보 확인
- 신청자 이름, 이메일, 신청 수량 확인
크리에이터는 새로운 이벤트를 생성하고, 참여할 극장을 선택할 수 있습니다. 이벤트 통계를 통해 이벤트 성과를 확인할 수 있습니다.
이벤트 목록
- 생성한 이벤트 목록 확인
- 이벤트별 통계 (참여 극장 수, 상태)
- 이벤트 수정 및 삭제
이벤트 생성 및 참여 극장 선택
- 영화 선택, 이벤트 제목, 기간 설정
- 특전 정보 입력 (이름, 타입, 수량, 제한)
- 참여 극장 선택 (체크박스로 다중 선택)
- 이벤트 공개/비공개 설정
생성한 이벤트의 특전을 각 극장에 배포할 수량을 지정할 수 있습니다. 극장별로 다른 수량을 배포하여 효율적인 재고 관리를 할 수 있습니다.
재고 배포
- 극장 목록 확인
- 극장별 배포 수량 입력
- 일괄 배포 완료
- Framework: Spring Boot 3.5.7
- Language: Java 21
- Database: PostgreSQL
- Security: Spring Security + JWT (JJWT 0.11.5)
- API Documentation: SpringDoc OpenAPI (Swagger)
- Cloud Storage: AWS S3 (Amazon SDK 2.25.27)
- Build Tool: Gradle
- ORM: Spring Data JDBC
- Framework: React 18.3.1
- Build Tool: Vite 6.3.5
- Language: TypeScript
- Styling: Tailwind CSS
- UI Components: Radix UI
- Animation: Motion (Framer Motion)
- Icons: Lucide React
- State Management: React Context API
- HTTP Client: Fetch API
CineCollector/
├── backend/ # Spring Boot 백엔드
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/com/example/cinecollector/
│ │ │ │ ├── collection/ # 컬렉션 관리
│ │ │ │ │ ├── controller/
│ │ │ │ │ ├── dto/
│ │ │ │ │ ├── entity/
│ │ │ │ │ ├── repository/
│ │ │ │ │ └── service/
│ │ │ │ ├── common/ # 공통 모듈
│ │ │ │ │ ├── config/ # 설정 (CORS, Security, S3, Swagger)
│ │ │ │ │ ├── exception/ # 예외 처리
│ │ │ │ │ ├── jwt/ # JWT 인증
│ │ │ │ │ ├── response/ # API 응답 형식
│ │ │ │ │ ├── s3/ # AWS S3 연동
│ │ │ │ │ └── security/ # 보안 설정
│ │ │ │ ├── event/ # 이벤트 관리
│ │ │ │ ├── inventory/ # 재고 관리
│ │ │ │ ├── movie/ # 영화 정보
│ │ │ │ ├── perk/ # 특전 관리
│ │ │ │ ├── perkapplication/ # 특전 신청
│ │ │ │ ├── theater/ # 극장 관리
│ │ │ │ ├── user/ # 사용자 관리
│ │ │ │ └── viewingrecord/ # 관람 기록
│ │ │ └── resources/
│ │ │ ├── application.yaml # 설정 파일
│ │ │ ├── schema.sql # 데이터베이스 스키마
│ │ │ └── data.sql # 초기 데이터
│ │ └── test/
│ ├── build.gradle # Gradle 의존성 관리
│ └── gradlew # Gradle Wrapper
│
├── frontend/ # React 프론트엔드
│ ├── src/
│ │ ├── components/ # React 컴포넌트
│ │ │ ├── CollectionGallery.tsx # 특전 도감
│ │ │ ├── CreatorDashboard.tsx # 크리에이터 대시보드
│ │ │ ├── EventsPerks.tsx # 이벤트·특전 목록
│ │ │ ├── Feed.tsx # 홈 피드
│ │ │ ├── Landing.tsx # 랜딩 페이지
│ │ │ ├── TheaterManagement.tsx # 극장 관리
│ │ │ ├── UserProfile.tsx # 사용자 프로필
│ │ │ ├── WatchHistory.tsx # 관람 기록
│ │ │ ├── StockDistributionDialog.tsx # 재고 배포 다이얼로그
│ │ │ └── ui/ # UI 컴포넌트 (Radix UI)
│ │ ├── context/
│ │ │ └── AuthContext.tsx # 인증 컨텍스트
│ │ ├── hooks/
│ │ │ └── useAuth.ts # 인증 훅
│ │ ├── lib/
│ │ │ └── api.ts # API 클라이언트
│ │ ├── App.tsx # 메인 앱 컴포넌트
│ │ └── main.tsx # 진입점
│ ├── package.json # npm 의존성 관리
│ ├── vite.config.ts # Vite 설정
│ └── index.html # HTML 템플릿
│
└── README.md # 프로젝트 문서
- Java: 21 이상
- Node.js: 18 이상
- PostgreSQL: 12 이상
- Gradle: 8.0 이상 (또는 Gradle Wrapper 사용)
- AWS S3: 이미지 저장용 (선택사항, 개발 환경에서는 로컬 파일 시스템 사용 가능)
- 데이터베이스 생성
CREATE DATABASE cinecollector;- 환경 변수 설정
백엔드 루트 디렉토리에
.env파일 생성 (또는 시스템 환경 변수 설정):
DB_USERNAME=your_db_username
DB_PASSWORD=your_db_password
JWT_SECRET=your_jwt_secret_key
AWS_ACCESS_KEY=your_aws_access_key
AWS_SECRET_KEY=your_aws_secret_key
BUCKET_NAME=your_s3_bucket_name
BUCKET_REGION=your_s3_region
JWT_ACCESS_EXPIRE=3600000
JWT_REFRESH_EXPIRE=1209600000- 백엔드 실행
cd backend
./gradlew bootRun
# 또는 Windows의 경우
gradlew.bat bootRun백엔드는 http://localhost:8080에서 실행됩니다.
- API 문서 확인
- Swagger UI:
http://localhost:8080/swagger-ui.html - API 문서:
http://localhost:8080/v3/api-docs
- 의존성 설치
cd frontend
npm install- 환경 변수 설정 (선택사항)
프론트엔드 루트 디렉토리에
.env파일 생성:
VITE_API_BASE_URL=http://localhost:8080- 프론트엔드 실행
npm run dev프론트엔드는 http://localhost:3000에서 실행됩니다.
- 프로덕션 빌드
npm run build
# 빌드된 파일: frontend/dist/프로젝트 실행 시 schema.sql과 data.sql이 자동으로 실행되어 데이터베이스 스키마와 초기 데이터가 생성됩니다.
초기 사용자 계정 (data.sql에 정의됨):
- COLLECTOR: collector1@example.com / password: collector1
- THEATER: theater1@example.com / password: theater1
- CREATOR: creator1@example.com (메가박스) / password: creator1
- CREATOR: creator2@example.com (CGV) / password: creator2
- CREATOR: creator3@example.com (롯데시네마) / password: creator3
- 데이터베이스 연결 실패:
application.yaml의 데이터베이스 연결 정보 확인 - 포트 충돌: 8080 포트가 사용 중인 경우
application.yaml에서 포트 변경 - 환경 변수 누락: 필수 환경 변수 설정 확인
- 의존성 설치 실패:
npm install재실행 또는node_modules삭제 후 재설치 - API 연결 실패: 백엔드가 실행 중인지 확인,
VITE_API_BASE_URL환경 변수 확인 - CORS 오류: 백엔드의 CORS 설정 확인
- 스키마 생성 실패: PostgreSQL 버전 확인 (12 이상 필요)
- 역할 생성 실패:
DatabaseRoleInitializer가 자동으로 역할을 생성하지만, 수동 생성도 가능 - GRANT 오류:
application.yaml에서spring.sql.init.continue-on-error: true설정 확인
users- 사용자 정보movies- 영화 정보events- 이벤트 정보perks- 특전 정보theaters- 극장 정보inventories- 극장별 재고collections- 사용자 수집 현황viewing_records- 관람 기록viewingrecord_image- 관람 기록 이미지viewing_record_perk- 관람 기록별 특전perk_applications- 특전 신청 내역
user_collection_statistics- 사용자별 수집 통계event_detail_view- 이벤트 상세 정보theater_inventory_summary- 극장별 재고 요약
- 단일 컬럼 인덱스: 20개
- 복합 인덱스: 1개 (
idx_events_dates) - 부분 인덱스: 1개 (
idx_viewing_records_public) - 참고: 복합 Primary Key를 가진 테이블(
inventories,collections,viewing_record_perk)은 Primary Key가 자동으로 인덱스 역할을 수행합니다.
- Primary Keys: 11개 (단일 8개, 복합 3개)
- Foreign Keys: 15개
- Unique Constraints: 1개 (users.email)
자세한 스키마는 backend/src/main/resources/schema.sql 참조
POST /users/login- 로그인POST /users/signup- 회원가입GET /users/me- 현재 사용자 정보PATCH /users/me- 프로필 수정
GET /events/list- 이벤트 목록 조회GET /events/{eventId}/detail- 이벤트 상세 조회POST /events/with-perk- 이벤트 생성 (특전 포함)DELETE /events/{eventId}- 이벤트 삭제
GET /perks/events/{eventId}- 이벤트별 특전 조회
GET /collections- 내 컬렉션 조회POST /collections- 컬렉션 추가PATCH /collections/{perkId}- 컬렉션 수정DELETE /collections/{perkId}- 컬렉션 삭제
GET /viewing-records/my- 내 관람 기록 조회GET /viewing-records/home- 홈 피드 조회POST /viewing-records- 관람 기록 생성DELETE /viewing-records/{recordId}- 관람 기록 삭제
GET /theaters- 극장 목록 조회GET /theaters/my- 내 극장 정보
GET /inventory/list- 재고 목록 조회GET /inventory/statistics- 재고 통계PATCH /inventory/{perkId}/{theaterId}- 재고 수정POST /inventory/{perkId}/distribute- 재고 배포
자세한 API 문서는 Swagger UI에서 확인 가능합니다.
main- 프로덕션 브랜치develop- 개발 브랜치feature/*- 기능 개발 브랜치fix/*- 버그 수정 브랜치
feat: 새로운 기능 추가
fix: 버그 수정
docs: 문서 수정
style: 코드 포맷팅
refactor: 코드 리팩토링
test: 테스트 추가
chore: 빌드 설정 등
이 프로젝트는 데이터베이스 과목 텀프로젝트로서 교육 및 학습 목적으로만 제작되었습니다.
- 데이터베이스 설계 및 구현 학습
- 백엔드/프론트엔드 통합 개발 경험
- RESTful API 설계 및 구현
- 사용자 인증 및 권한 관리 학습
- 실제 프로젝트 개발 프로세스 경험
본 프로젝트는 상업적 목적이 아니며, 실제 서비스로 운영되지 않습니다.
본 프로젝트는 다음 데이터베이스 기능을 구현했습니다:
- DML: INSERT, UPDATE, DELETE (24개 위치)
- SFW: SELECT FROM WHERE (69개 위치)
- ORDER BY: 정렬 기능 (23개 위치)
- GROUP BY: 집계 함수와 함께 사용 (1개 위치 + View)
- HAVING: 수집 완료/미수집 필터링 (2개 위치)
- Subquery: EXISTS 서브쿼리 (1개 위치)
- Keys: Primary Key, Foreign Key (45개 제약조건)
- View: 복잡한 조회 쿼리 단순화 (3개 View)
- Authorization: Spring Security + GRANT/REVOKE (30개 GRANT)
- Transaction: @Transactional 어노테이션 (42개 위치)
- Index: 쿼리 성능 최적화 (22개 Index)
이 프로젝트는 교육 목적의 학술 프로젝트입니다.
- 임나빈 (202455374)
- 정보컴퓨터공학부 컴퓨터공학전공
- 백엔드와 프론트엔드는 별도로 실행해야 합니다.
- CORS 설정은 개발 환경(
http://localhost:3000,http://localhost:5173)에 맞춰져 있습니다. - 프로덕션 배포 시 환경 변수 및 보안 설정을 재확인하세요.