Skip to content

๐Ÿ“• ๋ธ”๋ผ์ธ๋“œ ๋ถ์˜ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ด ๋‚˜์—๊ฒŒ ๋งž๋Š” ์ฑ…์ธ์ง€ ์•Œ๊ธฐ ์–ด๋ ค์šด ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด, ๋…์„œ ์ทจํ–ฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ถ”์ฒœํ•˜๋Š” ํ”Œ๋žซํผ

Notifications You must be signed in to change notification settings

Book-Pick/bookpick-back

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

14 Commits
ย 
ย 
ย 
ย 

Repository files navigation

BookPick Backend

BookPick MVP ๋ฒ„์ „์˜ ๋ฐฑ์—”๋“œ API ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. AI ๊ธฐ๋ฐ˜ ๋„์„œ ํ๋ ˆ์ด์…˜ ๋ฐ ์ถ”์ฒœ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Tech Stack

Core

  • Java 17
  • Spring Boot 3.5.6
  • Spring Security 6
  • Spring Data JPA
  • MySQL 8.0+

Libraries & Tools

  • JWT (JJWT 0.12.6) - ์‚ฌ์šฉ์ž ์ธ์ฆ/์ธ๊ฐ€
  • SpringDoc OpenAPI 2.8.11 - API ๋ฌธ์„œ ์ž๋™ํ™” (Swagger UI)
  • Lombok - ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ ์ œ๊ฑฐ
  • Gemini AI - AI ๊ธฐ๋ฐ˜ ๋„์„œ ์ถ”์ฒœ ๋ฐ ํ๋ ˆ์ด์…˜
  • Gradle - ๋นŒ๋“œ ๋„๊ตฌ
  • Docker - ์ปจํ…Œ์ด๋„ˆํ™” ๋ฐ ๋ฐฐํฌ

Key Features

์ธ์ฆ ๋ฐ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ

  • JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ/์ธ๊ฐ€ ์‹œ์Šคํ…œ
  • ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ
  • Access Token / Refresh Token ๊ด€๋ฆฌ

๋„์„œ ํ๋ ˆ์ด์…˜

  • AI ๊ธฐ๋ฐ˜ ๋„์„œ ์ถ”์ฒœ (Gemini API ์—ฐ๋™)
  • ํ๋ ˆ์ด์…˜ ์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ (CRUD)
  • ์ปค์„œ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋„ค์ด์…˜
  • ์ข‹์•„์š” ๊ธฐ๋Šฅ

์ปค๋ฎค๋‹ˆํ‹ฐ

  • ๋Œ“๊ธ€ ์ž‘์„ฑ ๋ฐ ๊ด€๋ฆฌ
  • ์‚ฌ์šฉ์ž ๋…์„œ ์ทจํ–ฅ ๊ด€๋ฆฌ

Project Structure

src/main/java/BookPick/mvp
โ”œโ”€โ”€ domain
โ”‚   โ”œโ”€โ”€ auth                    # ์ธ์ฆ/์ธ๊ฐ€
โ”‚   โ”‚   โ”œโ”€โ”€ controller
โ”‚   โ”‚   โ”œโ”€โ”€ service
โ”‚   โ”‚   โ””โ”€โ”€ dto
โ”‚   โ”œโ”€โ”€ curation                # ๋„์„œ ํ๋ ˆ์ด์…˜
โ”‚   โ”‚   โ”œโ”€โ”€ controller
โ”‚   โ”‚   โ”œโ”€โ”€ service
โ”‚   โ”‚   โ”œโ”€โ”€ repository
โ”‚   โ”‚   โ”œโ”€โ”€ dto
โ”‚   โ”‚   โ””โ”€โ”€ util
โ”‚   โ”‚       โ””โ”€โ”€ gemini          # Gemini AI ์—ฐ๋™
โ”‚   โ”œโ”€โ”€ comment                 # ๋Œ“๊ธ€
โ”‚   โ””โ”€โ”€ ReadingPreference       # ๋…์„œ ์ทจํ–ฅ
โ”œโ”€โ”€ security                    # Security ์„ค์ •
โ”‚   โ”œโ”€โ”€ config
โ”‚   โ””โ”€โ”€ handler
โ””โ”€โ”€ global                      # ๊ณตํ†ต ์„ค์ • ๋ฐ ์œ ํ‹ธ

src/main/resources
โ”œโ”€โ”€ application.yml             # ๊ณตํ†ต ์„ค์ •
โ”œโ”€โ”€ application-local.yml       # ๋กœ์ปฌ ํ™˜๊ฒฝ
โ”œโ”€โ”€ application-dev.yml         # ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
โ””โ”€โ”€ application-prod.yml        # ์šด์˜ ํ™˜๊ฒฝ

Getting Started

Prerequisites

  • JDK 17 ์ด์ƒ
  • MySQL 8.0+
  • Gradle 8.x (Wrapper ํฌํ•จ)

Environment Setup

  1. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ
cp src/main/resources/.env.example src/main/resources/.env
  1. .env ํŒŒ์ผ ์„ค์ •
# Database
SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/bookpick?serverTimezone=Asia/Seoul
SPRING_DATASOURCE_USERNAME=your_username
SPRING_DATASOURCE_PASSWORD=your_password

# JWT
JWT_SECRET=your-secret-key-here
JWT_ACCESS_TOKEN_EXPIRATION=3600000
JWT_REFRESH_TOKEN_EXPIRATION=604800000

# Gemini API
GEMINI_API_KEY=your-gemini-api-key

Local Development

# ์˜์กด์„ฑ ์„ค์น˜ ๋ฐ ๋นŒ๋“œ
./gradlew clean build

# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ (local ํ”„๋กœํŒŒ์ผ)
./gradlew bootRun --args='--spring.profiles.active=local'

# ๋˜๋Š”
java -jar build/libs/*.jar --spring.profiles.active=local

์„œ๋ฒ„๋Š” http://localhost:8081์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Docker

# ์ด๋ฏธ์ง€ ๋นŒ๋“œ
docker build -t bookpick-backend .

# ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
docker run -p 8081:8081 \
  -e SPRING_PROFILES_ACTIVE=dev \
  --name bookpick-api \
  bookpick-backend

API Documentation

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ํ›„ ์•„๋ž˜ ์ฃผ์†Œ์—์„œ API ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • Swagger UI: http://localhost:8081/swagger-ui.html
  • OpenAPI JSON: http://localhost:8081/v3/api-docs

Main Endpoints

์ธ์ฆ

  • POST /api/auth/signup - ํšŒ์›๊ฐ€์ž…
  • POST /api/auth/login - ๋กœ๊ทธ์ธ
  • POST /api/auth/logout - ๋กœ๊ทธ์•„์›ƒ
  • POST /api/auth/refresh - ํ† ํฐ ๊ฐฑ์‹ 

ํ๋ ˆ์ด์…˜

  • GET /api/curations - ํ๋ ˆ์ด์…˜ ๋ชฉ๋ก ์กฐํšŒ (์ปค์„œ ํŽ˜์ด์ง€๋„ค์ด์…˜)
  • GET /api/curations/{id} - ํ๋ ˆ์ด์…˜ ์ƒ์„ธ ์กฐํšŒ
  • POST /api/curations - ํ๋ ˆ์ด์…˜ ์ƒ์„ฑ
  • PUT /api/curations/{id} - ํ๋ ˆ์ด์…˜ ์ˆ˜์ •
  • DELETE /api/curations/{id} - ํ๋ ˆ์ด์…˜ ์‚ญ์ œ
  • POST /api/curations/{id}/like - ์ข‹์•„์š” ํ† ๊ธ€

๋…์„œ ์ทจํ–ฅ

  • GET /api/preferences - ๋…์„œ ์ทจํ–ฅ ์กฐํšŒ
  • POST /api/preferences - ๋…์„œ ์ทจํ–ฅ ๋“ฑ๋ก/์ˆ˜์ •

Development

Code Style

  • Java ์ฝ”๋“œ ์Šคํƒ€์ผ์€ Google Java Style Guide ์ค€์ˆ˜
  • Lombok ํ™œ์šฉํ•˜์—ฌ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ตœ์†Œํ™”

Testing

# ์ „์ฒด ํ…Œ์ŠคํŠธ ์‹คํ–‰
./gradlew test

# ํŠน์ • ํ…Œ์ŠคํŠธ ์‹คํ–‰
./gradlew test --tests "BookPick.mvp.domain.auth.*"

Branch Strategy

  • main - ์šด์˜ ํ™˜๊ฒฝ ๋ฐฐํฌ ๋ธŒ๋žœ์น˜
  • develop - ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ํ†ตํ•ฉ ๋ธŒ๋žœ์น˜
  • features/* - ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜
  • hotfix/* - ๊ธด๊ธ‰ ๋ฒ„๊ทธ ์ˆ˜์ • ๋ธŒ๋žœ์น˜

CI/CD

GitHub Actions๋ฅผ ํ†ตํ•œ ์ž๋™ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ:

  • develop ๋ธŒ๋žœ์น˜ ํ‘ธ์‹œ ์‹œ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์ž๋™ ๋ฐฐํฌ
  • PR ์ƒ์„ฑ ์‹œ ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ์ž๋™ ์‹คํ–‰

Troubleshooting

MySQL ์—ฐ๊ฒฐ ์˜ค๋ฅ˜

Caused by: java.sql.SQLException: Access denied for user

โ†’ .env ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณ„์ • ์ •๋ณด๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

JWT ๊ด€๋ จ ์˜ค๋ฅ˜

io.jsonwebtoken.security.WeakKeyException

โ†’ JWT_SECRET ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์ถฉ๋ถ„ํžˆ ๊ธด ํ‚ค(์ตœ์†Œ 256bit)์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”.

Contributing

  1. ์ด์Šˆ ์ƒ์„ฑ ๋˜๋Š” ํ• ๋‹น๋œ ์ด์Šˆ ํ™•์ธ
  2. Feature ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ (git checkout -b features/AmazingFeature)
  3. ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ปค๋ฐ‹ (git commit -m 'Add some AmazingFeature')
  4. ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œ (git push origin features/AmazingFeature)
  5. Pull Request ์ƒ์„ฑ

License

This project is licensed under the MIT License.

Contact

ํ”„๋กœ์ ํŠธ ๊ด€๋ จ ๋ฌธ์˜์‚ฌํ•ญ์€ ์ด์Šˆ๋ฅผ ํ†ตํ•ด ๋‚จ๊ฒจ์ฃผ์„ธ์š”.

About

๐Ÿ“• ๋ธ”๋ผ์ธ๋“œ ๋ถ์˜ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ด ๋‚˜์—๊ฒŒ ๋งž๋Š” ์ฑ…์ธ์ง€ ์•Œ๊ธฐ ์–ด๋ ค์šด ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด, ๋…์„œ ์ทจํ–ฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ถ”์ฒœํ•˜๋Š” ํ”Œ๋žซํผ

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published