공연 관리자와 일반 사용자를 위한 소규모 공연 및 티켓 관리 서비스
Framework & Library | Database | Build Tool | Java Version |
---|---|---|---|
Spring Boot 3.3.4 | MySQL | Gradle | Java 17 |
Spring Data JPA | |||
QueryDSL | |||
Spring JDBC | |||
Spring Security | |||
Spring Web | |||
Spring WebFlux | |||
Lombok | |||
JUnit | |||
OpenAPI (Springdoc) | |||
Spring RestDocs (Asciidoctor) | |||
JWT (io.jsonwebtoken) |
📦 요구사항 명세서
📦 스키마
Table Name | Description |
---|---|
member | 회원 정보를 저장하는 테이블. 이메일, 패스워드, 프로바이더, 역할 등의 정보를 관리합니다. |
refresh_tokens | 리프레시 토큰을 저장하는 테이블. 회원과 연관된 리프레시 토큰과 만료 시간을 관리합니다. |
performance | 공연 정보를 저장하는 테이블. 공연 제목, 설명, 일정, 장소, 가격, 남은 티켓 수 등을 관리합니다. |
comment | 공연에 대한 댓글을 저장하는 테이블. 회원이 남긴 댓글과 상태 정보를 관리합니다. |
ticket | 회원이 예매한 티켓 정보를 저장하는 테이블. 공연, 회원, 예매 시간, 예매 인원 등을 관리합니다. |
coupon | 회원이 소유한 쿠폰 정보를 저장하는 테이블. 쿠폰 이름, 할인율, 사용 여부, 만료 시간 등을 관리합니다. |
category | 공연 및 회원과 연관된 카테고리 정보를 저장하는 테이블. 카테고리 이름(한글/영문)을 관리합니다. |
member_categories | 회원과 카테고리의 연관 관계를 저장하는 테이블. 특정 회원이 관심있는 카테고리를 관리합니다. |
performance_categories | 공연과 카테고리의 연관 관계를 저장하는 테이블. 특정 공연이 속한 카테고리를 관리합니다. |
CREATE TABLE member (
member_id BIGINT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255),
provider ENUM('LOCAL', 'NAVER', 'KAKAO') NOT NULL,
provider_id VARCHAR(255),
name VARCHAR(100) UNIQUE NOT NULL,
role ENUM('ROLE_USER','ROLE_PADMIN','ROLE_ADMIN') NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP
);
CREATE TABLE refresh_tokens (
token_id BIGINT AUTO_INCREMENT PRIMARY KEY,
member_id BIGINT,
refresh_token VARCHAR(255) NOT NULL,
expiry_date TIMESTAMP NOT NULL,
FOREIGN KEY (member_id) REFERENCES member(member_id)
);
CREATE TABLE `performance` (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '공연 고유 ID',
member_id BIGINT NOT NULL COMMENT '회원 ID',
title VARCHAR(50) NOT NULL COMMENT '공연 제목',
date_st_time DATETIME NOT NULL COMMENT '공연 시작 일자 및 시간',
date_end_time DATETIME NOT NULL COMMENT '공연 종료 일자 및 시간',
description TEXT NOT NULL COMMENT '공연 설명',
max_audience BIGINT NULL COMMENT '최대 관객 수 (NULL이면 제한 없음)',
address VARCHAR(100) NOT NULL COMMENT '공연 장소',
image_url VARCHAR(100) NULL COMMENT '공연 이미지 URL',
price BIGINT NOT NULL DEFAULT 0 COMMENT '공연 가격',
remaining_tickets BIGINT NULL COMMENT '남은 티켓 수',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 시간',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '업데이트 시간',
deleted_at DATETIME NULL COMMENT '삭제 시간',
PRIMARY KEY (id),
FOREIGN KEY (member_id) REFERENCES member(member_id)
);
CREATE TABLE comment (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '댓글 고유 ID',
performance_id BIGINT NOT NULL COMMENT '공연 ID',
user_id BIGINT NOT NULL COMMENT '회원 ID',
comment TEXT NOT NULL COMMENT '댓글 내용',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 시간',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '업데이트 시간',
parent_id BIGINT NULL DEFAULT NULL COMMENT '부모 댓글 ID',
status ENUM('ACTIVE', 'DELETED') NOT NULL DEFAULT 'ACTIVE' COMMENT '댓글 상태',
PRIMARY KEY (id),
FOREIGN KEY (performance_id) REFERENCES performance(id),
FOREIGN KEY (user_id) REFERENCES member(member_id)
);
CREATE TABLE ticket (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '티켓 고유 ID',
performance_id BIGINT NOT NULL COMMENT '공연 ID',
member_id BIGINT NOT NULL COMMENT '회원 ID',
date_time DATETIME(6) NOT NULL COMMENT '티켓 예매 시간',
quantity INT NOT NULL COMMENT '예매 인원',
price INT NOT NULL DEFAULT 0 COMMENT '티켓 가격',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 시간',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '업데이트 시간',
deleted_at TIMESTAMP NULL COMMENT '삭제 시간',
PRIMARY KEY (id),
FOREIGN KEY (performance_id) REFERENCES performance(id),
FOREIGN KEY (member_id) REFERENCES member(member_id)
);
CREATE TABLE coupon (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '쿠폰 고유 ID',
member_id BIGINT NOT NULL COMMENT '회원 ID',
name VARCHAR(30) NOT NULL COMMENT '쿠폰 이름',
percent INT NOT NULL COMMENT '할인율',
is_used BOOLEAN NOT NULL DEFAULT false COMMENT '쿠폰 사용 여부',
expire_time TIMESTAMP NOT NULL COMMENT '쿠폰 만료 시간',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '쿠폰 발급 시간',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '쿠폰 수정 시간',
deleted_at TIMESTAMP NULL COMMENT '쿠폰 삭제 시간',
PRIMARY KEY (id),
FOREIGN KEY (member_id) REFERENCES member(member_id)
);
CREATE TABLE category (
category_id BIGINT NOT NULL AUTO_INCREMENT COMMENT '카테고리 고유 ID',
name_kr VARCHAR(30) COMMENT '카테고리 이름 (한글)',
name_en VARCHAR(30) COMMENT '카테고리 이름 (영문)', // 'MUSIC', 'THEATER', 'DANCE', 'COMEDY', 'CIRCUS', 'MAGIC', 'VARIETY', 'EXHIBITION', 'FESTIVAL', 'OPERA', 'PUPPETRY', 'STANDUP', 'ETC') NOT NULL COMMENT '카테고리 이름'
PRIMARY KEY (`category_id`)
);
CREATE TABLE member_categories (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '회원 카테고리 연결 고유 ID',
category_id BIGINT NOT NULL COMMENT '카테고리 ID',
member_id BIGINT NOT NULL COMMENT '회원 ID',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 시간',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '업데이트 시간',
PRIMARY KEY (id),
FOREIGN KEY (category_id) REFERENCES category(id),
FOREIGN KEY (member_id) REFERENCES member(member_id)
);
CREATE TABLE performance_categories (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '공연 카테고리 연결 고유 ID',
performance_id BIGINT NOT NULL COMMENT '공연 ID',
category_id BIGINT NOT NULL COMMENT '카테고리 ID',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 시간',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '업데이트 시간',
PRIMARY KEY (id),
FOREIGN KEY (performance_id) REFERENCES performance(id),
FOREIGN KEY (category_id) REFERENCES category(id)
);
📦 패키지 구조
├─ src
├─ main
├─ java
└─ org
└─ socialculture
└─ platform
├─ comment
├─ config
├─ coupon
├─ global
├─ member
├─ performance
├─ ticket
└─ SocialCultureApplication.java
└─ resources
└─ application.yml
└─ logback.xml
├─ src
├─ test
├─ java
└─ org
└─ socialculture
└─ platform
├─ comment
├─ coupon
├─ member
├─ performance
├─ ticket
├─ util
└─ SocialCultureApplicationTests.java
📦 API 명세서
📦 깃 컨벤션
커밋 유형 | 의미 |
---|---|
Feat |
새로운 기능 추가 |
Fix |
버그 수정 |
Docs |
문서 수정 |
Style |
코드 formatting, 세미콜론 누락, 코드 자체의 변경이 없는 경우 |
Refactor |
코드 리팩토링 |
Test |
테스트 코드, 리팩토링 테스트 코드 추가 |
Chore |
패키지 매니저 수정, 그 외 기타 수정 (ex: .gitignore ) |
Design |
CSS 등 사용자 UI 디자인 변경 |
Comment |
필요한 주석 추가 및 변경 |
Rename |
파일 또는 폴더 명을 수정하거나 옮기는 작업만인 경우 |
Remove |
파일을 삭제하는 작업만 수행한 경우 |
!BREAKING CHANGE |
커다란 API 변경의 경우 |
!HOTFIX |
급하게 치명적인 버그를 고쳐야 하는 경우 |
📦 코드 컨벤션
규칙 | 설명 |
---|---|
문자열 처리 | 문자열을 처리할 때는 쌍따옴표를 사용합니다. |
함수명, 변수명 | 카멜케이스로 작성하며, 의미와 의도를 가진 이름을 사용합니다. |
클래스 명 | UpperCamelCase로 작성합니다. |
상수 명 | CONSTANT_CASE로 작성합니다. |
연산자와 공백 | 연산자 사이, 소괄호와 중괄호 사이에는 공백을 넣습니다. |
else, catch 등 | 닫는 중괄호와 같은 줄에 else, catch, finally, while을 선언합니다. |
주석 달기 | 클래스 및 메서드마다 주석을 달아줍니다. Javadoc보다는 이해를 돕기 위한 설명 위주로 작성합니다. |
한 줄 최대 길이 | 한 문장은 최대 100글자로 제한합니다. 예외적으로 패키지 및 import 문, 주석 내 URL 등은 제외됩니다. |
줄 바꿈 | 가독성을 위해 열 제한을 넘지 않아도 줄 바꿈을 할 수 있으며, "." 앞에서 끊습니다. |
중괄호 사용 | 코드가 한 줄일 때에도 중괄호를 사용합니다. |
정적 팩터리 메서드 | 객체 생성 시 정적 팩터리 메서드를 사용합니다. 매개변수가 4개 이상일 때는 빌더 패턴을 사용합니다. |
record 사용 | 불변성을 유지하기 위해 DTO 또는 응답 데이터 객체로 record 문법을 사용합니다. |
인터페이스 사용 범위 | ServiceImpl 클래스를 작성하는 것으로 합니다. |
의존성 주입 | 생성자 주입을 사용하며, final 키워드를 붙입니다. |
문성현 | 정예찬(팀장) | 김예찬 | 김연수 | 정승주 |
---|---|---|---|---|
@sunghyun | @ycjung | @macmorning0116 | @yeonsu00 | @Icecoff22 |
공통 예외 API & 댓글 |
티켓 & 쿠폰 | Kakao 소셜 로그인 & 유저 권한 & JWT 토큰 |
Naver 소셜 로그인 & 유저 권한 & JWT 토큰 |
공연 |