Skip to content

๐Ÿ“… Planu - ์ผ์ • ๊ด€๋ฆฌ ์•ฑ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„

Notifications You must be signed in to change notification settings

jungyuminn/planu-backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

58 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“‹ Planu Backend

ํ•  ์ผ ๊ด€๋ฆฌ์™€ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์„ ํ•จ๊ป˜, Planu ์•ฑ์˜ ๋ฐฑ์—”๋“œ API ์„œ๋ฒ„

Spring Boot Java License

๐ŸŒŸ ์ฃผ์š” ๊ธฐ๋Šฅ

๐Ÿ“ Todo ๊ด€๋ฆฌ

  • Todo: ๋‚ ์งœ๋ณ„ ํ•  ์ผ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ, ์กฐํšŒ
  • Someday: ์–ธ์  ๊ฐ€ ํ•  ์ผ ๊ด€๋ฆฌ
  • Category: ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ•  ์ผ ๋ถ„๋ฅ˜

๐ŸŽจ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์ƒ์ 

  • Sticker Shop: ๋‹ค์–‘ํ•œ ์Šคํ‹ฐ์ปค ํŒ๋งค ๋ฐ ๊ตฌ๋งค
  • Color Shop: ์•ฑ ํ…Œ๋งˆ ์ปฌ๋Ÿฌ ํŒ๋งค ๋ฐ ๊ตฌ๋งค
  • ํŒ๋งค๋Ÿ‰ ๊ธฐ๋ฐ˜ ์ธ๊ธฐ ์•„์ดํ…œ ์กฐํšŒ

๐ŸŽŸ๏ธ ์ฟ ํฐ ์‹œ์Šคํ…œ

  • ์ฟ ํฐ ๋ฐœ๊ธ‰ ๋ฐ ์‚ฌ์šฉ
  • ์‚ฌ์šฉ ๋‚ด์—ญ ๊ด€๋ฆฌ

๐Ÿ” ์ธ์ฆ & ๋ณด์•ˆ

  • JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ
  • Spring Security ์ ์šฉ
  • Firebase Authentication ์—ฐ๋™

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

Backend

  • Framework: Spring Boot 3.x
  • Language: Java 17
  • Build Tool: Gradle

Database & Cache

  • Database: MySQL (JPA/Hibernate)
  • Cache: Redis

Authentication & Security

  • JWT: Token ๊ธฐ๋ฐ˜ ์ธ์ฆ
  • Spring Security: ๋ณด์•ˆ ์„ค์ •
  • Firebase: ์†Œ์…œ ๋กœ๊ทธ์ธ ์—ฐ๋™

Documentation

  • Swagger/OpenAPI: API ๋ฌธ์„œ ์ž๋™ํ™”

๐Ÿ—๏ธ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์„ค๊ณ„

๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜ (Layered Architecture)

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚         Controller Layer            โ”‚  โ† REST API ์—”๋“œํฌ์ธํŠธ
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚          Service Layer              โ”‚  โ† ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚        Repository Layer             โ”‚  โ† ๋ฐ์ดํ„ฐ ์ ‘๊ทผ
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚         Database (MySQL)            โ”‚  โ† ์˜์†์„ฑ ๊ณ„์ธต
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

์ฃผ์š” ๋””์ž์ธ ํŒจํ„ด

  • DTO Pattern: ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก
  • Repository Pattern: ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์ถ”์ƒํ™”
  • Dependency Injection: Spring IoC ์ปจํ…Œ์ด๋„ˆ ํ™œ์šฉ
  • Builder Pattern: ์—”ํ‹ฐํ‹ฐ ๋ฐ DTO ์ƒ์„ฑ
  • Exception Handling: ์ „์—ญ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ (@ControllerAdvice)

๐Ÿ” ๋ณด์•ˆ ๊ตฌํ˜„

JWT ์ธ์ฆ ํ”Œ๋กœ์šฐ

1. ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์š”์ฒญ
2. ์„œ๋ฒ„์—์„œ ์ž๊ฒฉ์ฆ๋ช… ๊ฒ€์ฆ
3. JWT Access Token + Refresh Token ๋ฐœ๊ธ‰
4. ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ ์‹œ Authorization Header์— ํ† ํฐ ํฌํ•จ
5. JwtRequestFilter์—์„œ ํ† ํฐ ๊ฒ€์ฆ ๋ฐ ์ธ์ฆ ์ฒ˜๋ฆฌ

๋ณด์•ˆ ๊ธฐ๋Šฅ

  • JWT Token: Access Token (๋‹จ๊ธฐ) + Refresh Token (์žฅ๊ธฐ) ์ „๋žต
  • Spring Security: ์—”๋“œํฌ์ธํŠธ๋ณ„ ์ ‘๊ทผ ์ œ์–ด
  • Password Encryption: BCrypt ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • CORS ์„ค์ •: ํฌ๋กœ์Šค ๋„๋ฉ”์ธ ์š”์ฒญ ์ œ์–ด
  • Custom Exception Handling: ๋ณด์•ˆ ์˜ˆ์™ธ ์ƒํ™ฉ ์ฒ˜๋ฆฌ

๐Ÿš€ ์ฃผ์š” ๊ธฐ์ˆ  ๊ตฌํ˜„

1. JWT ์ธ์ฆ ์‹œ์Šคํ…œ

- JwtUtil: JWT ํ† ํฐ ์ƒ์„ฑ, ํŒŒ์‹ฑ, ๊ฒ€์ฆ
- JwtRequestFilter: ์š”์ฒญ๋งˆ๋‹ค ํ† ํฐ ๊ฒ€์ฆ (OncePerRequestFilter)
- SecurityConfig: Spring Security ์„ค์ •

2. Firebase ์—ฐ๋™

- Firebase Admin SDK ์ดˆ๊ธฐํ™”
- Firebase Authentication ํ† ํฐ ๊ฒ€์ฆ
- ์†Œ์…œ ๋กœ๊ทธ์ธ (Google, Apple ๋“ฑ) ์ง€์›

3. Redis ์บ์‹ฑ

- Redis Template ์„ค์ •
- ์„ธ์…˜ ๊ด€๋ฆฌ ๋ฐ ์ž„์‹œ ๋ฐ์ดํ„ฐ ์ €์žฅ
- Refresh Token ์ €์žฅ์†Œ

4. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ „๋žต

- CustomException: ๋น„์ฆˆ๋‹ˆ์Šค ์˜ˆ์™ธ ์ •์˜
- ErrorCode: ์—๋Ÿฌ ์ฝ”๋“œ ๋ฐ ๋ฉ”์‹œ์ง€ enum
- CustomExceptionHandler: @RestControllerAdvice๋กœ ์ „์—ญ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
- ErrorResponseEntity: ์ผ๊ด€๋œ ์—๋Ÿฌ ์‘๋‹ต ํ˜•์‹

5. API ๋ฌธ์„œํ™”

- Swagger/OpenAPI 3.0 ์‚ฌ์šฉ
- @Operation, @ApiResponse ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ƒ์„ธ ๋ฌธ์„œํ™”
- JWT ์ธ์ฆ ํฌํ•จํ•œ Try-it-out ๊ธฐ๋Šฅ

๐Ÿ’พ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„

์ฃผ์š” ์—”ํ‹ฐํ‹ฐ

  • User: ์‚ฌ์šฉ์ž ์ •๋ณด (OAuth ์ •๋ณด ํฌํ•จ)
  • Category: ํ•  ์ผ ์นดํ…Œ๊ณ ๋ฆฌ
  • Todo: ๋‚ ์งœ๋ณ„ ํ•  ์ผ
  • TodoSomeday: ์–ธ์  ๊ฐ€ ํ•  ์ผ
  • Sticker: ์‚ฌ์šฉ์ž ์Šคํ‹ฐ์ปค
  • ShopSticker/ShopColor: ์ƒ์  ์•„์ดํ…œ
  • PurchaseSticker/PurchaseColor: ๊ตฌ๋งค ๋‚ด์—ญ
  • Coupon: ์ฟ ํฐ ์ •๋ณด
  • CouponUsage: ์ฟ ํฐ ์‚ฌ์šฉ ๋‚ด์—ญ

๊ด€๊ณ„ ์„ค์ •

  • User โ†” Category: 1:N
  • Category โ†” Todo: 1:N
  • User โ†” Todo: 1:N
  • User โ†” PurchaseSticker/Color: 1:N
  • User โ†” CouponUsage: 1:N

โšก ์„ฑ๋Šฅ ์ตœ์ ํ™”

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ตœ์ ํ™”

  • JPA N+1 ๋ฌธ์ œ ํ•ด๊ฒฐ: Fetch Join ์‚ฌ์šฉ
  • ์ธ๋ฑ์Šค ์„ค์ •: ์ž์ฃผ ์กฐํšŒ๋˜๋Š” ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค ์ ์šฉ
  • Lazy Loading: ์—ฐ๊ด€๊ด€๊ณ„ ์ง€์—ฐ ๋กœ๋”ฉ ์ „๋žต

์บ์‹ฑ ์ „๋žต

  • Redis ์บ์‹œ: ์ž์ฃผ ์กฐํšŒ๋˜๋Š” ๋ฐ์ดํ„ฐ ์บ์‹ฑ
  • ๋กœ์ปฌ ์บ์‹œ: Spring Cache ํ™œ์šฉ

API ์ตœ์ ํ™”

  • DTO ๋ณ€ํ™˜: ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์‘๋‹ต
  • ํŽ˜์ด์ง€๋„ค์ด์…˜: ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹œ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

src/main/java/planu/app/
โ”œโ”€โ”€ api/              # API ์ŠคํŽ™ ์ธํ„ฐํŽ˜์ด์Šค
โ”œโ”€โ”€ config/           # ์„ค์ • ํด๋ž˜์Šค (Security, Swagger, Firebase, Redis ๋“ฑ)
โ”œโ”€โ”€ controller/       # REST API ์ปจํŠธ๋กค๋Ÿฌ
โ”œโ”€โ”€ dto/              # ์š”์ฒญ/์‘๋‹ต DTO
โ”‚   โ”œโ”€โ”€ request/      # ์š”์ฒญ ๊ฐ์ฒด
โ”‚   โ””โ”€โ”€ response/     # ์‘๋‹ต ๊ฐ์ฒด
โ”œโ”€โ”€ entity/           # JPA ์—”ํ‹ฐํ‹ฐ
โ”œโ”€โ”€ exception/        # ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
โ”œโ”€โ”€ interceptor/      # ์ธํ„ฐ์…‰ํ„ฐ
โ”œโ”€โ”€ repository/       # JPA ๋ ˆํฌ์ง€ํ† ๋ฆฌ
โ”œโ”€โ”€ security/         # ๋ณด์•ˆ ์„ค์ •
โ”œโ”€โ”€ service/          # ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
โ””โ”€โ”€ util/             # ์œ ํ‹ธ๋ฆฌํ‹ฐ (JWT ๋“ฑ)

๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ

์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

  • Java 17 ์ด์ƒ
  • MySQL 8.0 ์ด์ƒ
  • Redis
  • Gradle

์„ค์น˜ ๋ฐ ์‹คํ–‰

  1. ์ €์žฅ์†Œ ํด๋ก 
git clone https://github.com/jungyuminn/planu-backend.git
cd planu-backend
  1. ํ™˜๊ฒฝ ์„ค์ •
# application-local.yml ํŒŒ์ผ ์ƒ์„ฑ (gitignore์— ํฌํ•จ๋จ)
cp src/main/resources/application.yml src/main/resources/application-local.yml

application-local.yml์— ๋‹ค์Œ ์ •๋ณด๋ฅผ ์„ค์ •:

  • Database ์—ฐ๊ฒฐ ์ •๋ณด
  • Redis ์—ฐ๊ฒฐ ์ •๋ณด
  • JWT Secret Key
  • Firebase ์„ค์ •
  1. ๋นŒ๋“œ ๋ฐ ์‹คํ–‰
# Gradle ๋นŒ๋“œ
./gradlew build

# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
./gradlew bootRun
  1. API ๋ฌธ์„œ ํ™•์ธ
http://localhost:8080/swagger-ui.html

๐Ÿ“š API ์—”๋“œํฌ์ธํŠธ

์ธ์ฆ

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

Todo

  • GET /api/todos - Todo ๋ชฉ๋ก ์กฐํšŒ
  • POST /api/todos - Todo ์ƒ์„ฑ
  • PUT /api/todos/{id} - Todo ์ˆ˜์ •
  • DELETE /api/todos/{id} - Todo ์‚ญ์ œ

Someday

  • GET /api/todos/someday - Someday ๋ชฉ๋ก ์กฐํšŒ
  • POST /api/todos/someday - Someday ์ƒ์„ฑ
  • PUT /api/todos/someday/{id} - Someday ์ˆ˜์ •
  • DELETE /api/todos/someday/{id} - Someday ์‚ญ์ œ

Category

  • GET /api/categories - ์นดํ…Œ๊ณ ๋ฆฌ ๋ชฉ๋ก ์กฐํšŒ
  • POST /api/categories - ์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ฑ
  • PUT /api/categories/{id} - ์นดํ…Œ๊ณ ๋ฆฌ ์ˆ˜์ •
  • DELETE /api/categories/{id} - ์นดํ…Œ๊ณ ๋ฆฌ ์‚ญ์ œ

Shop

  • GET /api/shop/stickers - ์Šคํ‹ฐ์ปค ์ƒ์  ๋ชฉ๋ก
  • GET /api/shop/colors - ์ปฌ๋Ÿฌ ์ƒ์  ๋ชฉ๋ก
  • POST /api/purchase/stickers - ์Šคํ‹ฐ์ปค ๊ตฌ๋งค
  • POST /api/purchase/colors - ์ปฌ๋Ÿฌ ๊ตฌ๋งค

Coupon

  • GET /api/coupons - ์ฟ ํฐ ๋ชฉ๋ก ์กฐํšŒ
  • POST /api/coupons/use - ์ฟ ํฐ ์‚ฌ์šฉ

์ƒ์„ธํ•œ API ๋ช…์„ธ๋Š” Swagger ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

๐Ÿ”ง ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •

IDE ์„ค์ •

  • IntelliJ IDEA ๊ถŒ์žฅ
  • Lombok ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ํ•„์š”

์ฝ”๋“œ ์Šคํƒ€์ผ

  • Java Code Convention ์ค€์ˆ˜
  • 4 spaces ๋“ค์—ฌ์“ฐ๊ธฐ

๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'feat: Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

์ปค๋ฐ‹ ์ปจ๋ฒค์…˜

  • feat: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • fix: ๋ฒ„๊ทธ ์ˆ˜์ •
  • docs: ๋ฌธ์„œ ์ˆ˜์ •
  • style: ์ฝ”๋“œ ํฌ๋งทํŒ…, ์„ธ๋ฏธ์ฝœ๋ก  ๋ˆ„๋ฝ ๋“ฑ
  • refactor: ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
  • test: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
  • chore: ๋นŒ๋“œ ์—…๋ฌด ์ˆ˜์ •, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์ˆ˜์ •

๐Ÿ“ ๋ผ์ด์„ ์Šค

This project is licensed under the MIT License - see the LICENSE file for details

๐Ÿ‘ค ๊ฐœ๋ฐœ์ž

JungYumin

๐Ÿ“ฎ ๋ฌธ์˜

ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด๋‚˜ ์ œ์•ˆ์‚ฌํ•ญ์ด ์žˆ์œผ์‹œ๋ฉด Issue๋ฅผ ๋“ฑ๋กํ•ด์ฃผ์„ธ์š”.


โญ๏ธ ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด Star๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”!

About

๐Ÿ“… Planu - ์ผ์ • ๊ด€๋ฆฌ ์•ฑ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages