diff --git a/README.md b/README.md new file mode 100644 index 00000000..26bc9d66 --- /dev/null +++ b/README.md @@ -0,0 +1,276 @@ +# 🎡 λ‚΄ μ½˜μ„œνŠΈλ₯Ό 뢀탁해 (NCB) - Backend + +> μ˜ˆλ§€λΆ€ν„° λ’€ν’€μ΄κΉŒμ§€, 곡연 κ΄€λžŒμ˜ ν•˜λ£¨λ₯Ό κ΄€λ¦¬ν•˜λŠ” μ˜¬μΈμ› ν”Œλž«νΌ + +4-기획 μ˜λ„ + +--- + +# πŸ“Œ Project Overview + +5-ν”„λ‘œμ νŠΈ κ°œμš” + + +# πŸš€ Main Features + +### 곡연 탐색 + +- Kopis API 기반 곡연 데이터 쑰회 +- 곡연 일자 / 쑰회수 κΈ°μ€€ μ •λ ¬ +- λ¬΄ν•œ 슀크둀 기반 곡연 λͺ©λ‘ 제곡 +- 곡연 검색 κΈ°λŠ₯ + +### 검색 μžλ™μ™„μ„± + +- Redis 기반 μžλ™μ™„μ„± 검색 +- 곡연 제λͺ© μ—­μΈλ±μŠ€ ꡬ쑰 ν™œμš© +- 쑰회수 기반 검색 κ²°κ³Ό λ…ΈμΆœ + +### μ•„ν‹°μŠ€νŠΈ 정보 제곡 + +μ™ΈλΆ€ APIλ₯Ό ν™œμš©ν•˜μ—¬ μ•„ν‹°μŠ€νŠΈ 정보λ₯Ό μˆ˜μ§‘ν•˜κ³  μ œκ³΅ν•©λ‹ˆλ‹€. + +μ‚¬μš© API + +- Spotify API +- Wikidata API +- MusicBrainz API + +제곡 정보 + +- μ•„ν‹°μŠ€νŠΈ μ†Œκ°œ +- 인기 νŠΈλž™ +- 인기 앨범 +- νŒ”λ‘œμ›Œ 수 / 인기도 +- μœ μ‚¬ μ•„ν‹°μŠ€νŠΈ + +Spotify와 μ—°λ™λ˜μ–΄ **앨범 클릭 μ‹œ Spotify 슀트리밍 νŽ˜μ΄μ§€λ‘œ 이동**ν•©λ‹ˆλ‹€. + +### μ‹€μ‹œκ°„ μ±„νŒ… + +WebSocket + STOMP 기반 μ±„νŒ… κΈ°λŠ₯ + +- μ‹€μ‹œκ°„ μ±„νŒ… λ©”μ‹œμ§€ μ†‘μˆ˜μ‹  +- μ±„νŒ… λ©”μ‹œμ§€ μ €μž₯ 및 쑰회 +- μ±„νŒ…λ°© μ ‘μ†μž 수 관리 +- μ±„νŒ…λ°© μ°Έμ—¬μž 관리 + +Redisλ₯Ό ν™œμš©ν•˜μ—¬ + +- Redis Stream β†’ λ©”μ‹œμ§€ μ €μž₯ +- Redis Set β†’ μ ‘μ†μž 관리 + +### 곡연 일정 ν”Œλž˜λ„ˆ + +곡연 당일 일정을 κ΄€λ¦¬ν•˜κ³  κ³΅μœ ν•  수 μžˆλŠ” κΈ°λŠ₯ + +- 곡연 일정 생성 및 관리 +- μž₯μ†Œ 기반 일정 κ³„νš +- 곡유 링크 생성 +- UUID 기반 곡유 토큰 +- 1일 ν›„ μžλ™ 만료 + +### κΆŒν•œ 관리 + +ν”Œλž˜λ„ˆ μ°Έμ—¬μž κΆŒν•œ 관리 + +κΆŒν•œ μœ ν˜• + +- OWNER +- EDITOR +- VIEWER + +각 κΆŒν•œμ— 따라 쑰회 / μˆ˜μ • / μ‚­μ œ κΆŒν•œμ΄ λ‹€λ₯΄κ²Œ μ μš©λ©λ‹ˆλ‹€. + +### 지도 기반 μž₯μ†Œ 탐색 + +μ™ΈλΆ€ 지도 API ν™œμš© + +μ‚¬μš© API + +- Kakao Map API +- Kakao Mobility API +- TMAP API + +제곡 κΈ°λŠ₯ + +- 곡연μž₯ μ£Όλ³€ 카페 / λ§›μ§‘ 검색 +- λŒ€μ€‘κ΅ν†΅ κΈΈμ°ΎκΈ° +- 도보 / μ°¨λŸ‰ 이동 μ‹œκ°„ 계산 + +--- + +# πŸ— System Architecture +νˆ¬ν‘œ _ 박상아 _ λ³€μˆ˜μ—° _ μ΅œλ³‘μ€€ _ 김민석 _ μ΄ν˜œμ§€ _ κΉ€μœ€μˆ˜ Codecrete + + +# πŸ›  Tech Stack + +### Backend +![Java](https://img.shields.io/badge/Java-17-007396?style=for-the-badge&logo=java&logoColor=white) +![Spring Boot](https://img.shields.io/badge/Spring_Boot-3.0-6DB33F?style=for-the-badge&logo=springboot&logoColor=white) +![Spring Data JPA](https://img.shields.io/badge/Spring_Data_JPA-6DB33F?style=for-the-badge) +![Hibernate](https://img.shields.io/badge/Hibernate-59666C?style=for-the-badge&logo=hibernate&logoColor=white) +![JWT](https://img.shields.io/badge/JWT-Authentication-000000?style=for-the-badge&logo=jsonwebtokens&logoColor=white) +![WebSocket](https://img.shields.io/badge/WebSocket-STOMP-010101?style=for-the-badge) + +### Database +![MySQL](https://img.shields.io/badge/MySQL-4479A1?style=for-the-badge&logo=mysql&logoColor=white) +![Redis](https://img.shields.io/badge/Redis-DC382D?style=for-the-badge&logo=redis&logoColor=white) + +### Infrastructure +![AWS EC2](https://img.shields.io/badge/AWS_EC2-FF9900?style=for-the-badge&logo=amazon-ec2&logoColor=white) +![Docker](https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=docker&logoColor=white) + +### DevOps +![GitHub Actions](https://img.shields.io/badge/GitHub_Actions-2088FF?style=for-the-badge&logo=githubactions&logoColor=white) + +### External API +![Kopis API](https://img.shields.io/badge/Kopis_API-000000?style=for-the-badge) +![Spotify API](https://img.shields.io/badge/Spotify_API-1DB954?style=for-the-badge&logo=spotify&logoColor=white) +![Kakao Map](https://img.shields.io/badge/Kakao_Map_API-FFCD00?style=for-the-badge) +![TMAP API](https://img.shields.io/badge/TMAP_API-FF4F00?style=for-the-badge) + +--- + +## πŸ“‚ Project Structure + +```text +src +β”œβ”€ main +β”‚ β”œβ”€ java +β”‚ β”‚ └─ com.back.web7_9_codecrete_be +β”‚ β”‚ β”œβ”€ domain # 도메인별 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 +β”‚ β”‚ β”‚ β”œβ”€ auth +β”‚ β”‚ β”‚ β”œβ”€ users +β”‚ β”‚ β”‚ β”œβ”€ concerts +β”‚ β”‚ β”‚ β”œβ”€ artists +β”‚ β”‚ β”‚ β”œβ”€ community +β”‚ β”‚ β”‚ β”œβ”€ chats +β”‚ β”‚ β”‚ β”œβ”€ plans +β”‚ β”‚ β”‚ └─ location +β”‚ β”‚ β”œβ”€ global # 곡톡 μ„€μ • 및 인프라 +β”‚ β”‚ β”‚ β”œβ”€ config +β”‚ β”‚ β”‚ β”œβ”€ security +β”‚ β”‚ β”‚ β”œβ”€ error +β”‚ β”‚ β”‚ β”œβ”€ redis +β”‚ β”‚ β”‚ β”œβ”€ scheduler +β”‚ β”‚ β”‚ └─ websocket +β”‚ β”‚ └─ Web79CodecreteBeApplication +β”‚ └─ resources +β”‚ └─ application.yml + +``` +--- + +# πŸ‘₯ Backend Team +screencapture-miricanvas-v2-ko-design2-139b13ea-a2b5-4b45-a015-0ad51e6e0d34-2026-03-17-17_36_17 + +--- +## 🐳 Docker μ‹€ν–‰ 방법 + +이 ν”„λ‘œμ νŠΈλŠ” **MySQL 8.0**κ³Ό **Redis 7.2**λ₯Ό Docker Compose둜 μ‹€ν–‰ν•©λ‹ˆλ‹€. +둜컬 개발 ν™˜κ²½μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μΊμ‹œ μ„œλ²„λ₯Ό μ‰½κ²Œ ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€. + +--- + +## 1️⃣ ν™˜κ²½ λ³€μˆ˜ μ„€μ • + +ν”„λ‘œμ νŠΈ λ£¨νŠΈμ— `.env` νŒŒμΌμ„ μƒμ„±ν•˜κ³  μ•„λž˜ λ‚΄μš©μ„ μž‘μ„±ν•©λ‹ˆλ‹€. + +```env +MYSQL_PORT=3306 +MYSQL_ROOT_PASSWORD=root +MYSQL_DATABASE=concert +MYSQL_USER=user +MYSQL_PASSWORD=password + +REDIS_PORT=6379 +``` + +`.env` νŒŒμΌμ€ `docker-compose.yml`μ—μ„œ μ‚¬μš©ν•˜λŠ” ν™˜κ²½ λ³€μˆ˜μž…λ‹ˆλ‹€. + +--- + +## 2️⃣ Docker μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ + +μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ MySQLκ³Ό Redis μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. + +```bash +docker compose up -d +``` + +μ˜΅μ…˜ μ„€λͺ… + +| μ˜΅μ…˜ | μ„€λͺ… | +|---|---| +| up | μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ | +| -d | λ°±κ·ΈλΌμš΄λ“œ μ‹€ν–‰ | + +--- + +## 3️⃣ μ‹€ν–‰ μƒνƒœ 확인 + +```bash +docker ps +``` + +μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜λ©΄ λ‹€μŒκ³Ό 같은 μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€. + +| Container | Service | +|---|---| +| concert-mysql | MySQL 8.0 | +| concert-redis | Redis 7.2 | + +--- + +## 4️⃣ 둜그 확인 + +λ¬Έμ œκ°€ λ°œμƒν–ˆμ„ 경우 둜그λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. + +```bash +docker compose logs +``` + +νŠΉμ • μ„œλΉ„μŠ€ 둜그 확인 + +```bash +docker compose logs mysql +docker compose logs redis +``` + +--- + +## 5️⃣ μ»¨ν…Œμ΄λ„ˆ μ’…λ£Œ + +```bash +docker compose down +``` + +--- + +## 6️⃣ 데이터 μœ μ§€ (Volume) + +MySQLκ³Ό Redis λ°μ΄ν„°λŠ” Docker Volume에 μ €μž₯λ©λ‹ˆλ‹€. + +| Volume | μ„€λͺ… | +|---|---| +| mysql-data | MySQL 데이터 μ €μž₯ | +| redis-data | Redis 데이터 μ €μž₯ | + +μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚­μ œν•΄λ„ λ°μ΄ν„°λŠ” μœ μ§€λ©λ‹ˆλ‹€. + +--- + +## 7️⃣ 포트 정보 + +| Service | Port | +|---|---| +| MySQL | `${MYSQL_PORT}:3306` | +| Redis | `${REDIS_PORT}:6379` | + +--- + +πŸ’‘ **Tip** + +처음 μ‹€ν–‰ν•  λ•ŒλŠ” Docker 이미지 λ‹€μš΄λ‘œλ“œλ‘œ 인해 μ‹œκ°„μ΄ 쑰금 걸릴 수 μžˆμŠ΅λ‹ˆλ‹€.