Skip to content

snack-exercise/snack-exercise-server

Repository files navigation

πŸƒβ€β™‚οΈ Snack Exercise - κ°„μ‹μ²˜λŸΌ κ°€λ²Όμš΄ μš΄λ™ 릴레이 μ„œλΉ„μŠ€

일상 속 짧은 μ‹œκ°„μ„ ν™œμš©ν•˜μ—¬ ν•¨κ»˜ν•˜λŠ” μš΄λ™ 릴레이 ν”Œλž«νΌ

πŸ“Œ ν”„λ‘œμ νŠΈ μ†Œκ°œ

Snack ExerciseλŠ” μΉœκ΅¬λ“€κ³Ό ν•¨κ»˜ 짧은 μš΄λ™μ„ 릴레이 ν˜•μ‹μœΌλ‘œ μˆ˜ν–‰ν•˜λ©° κ±΄κ°•ν•œ μŠ΅κ΄€μ„ λ§Œλ“€μ–΄κ°€λŠ” μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.
간식을 λ¨Ήλ“― κ°€λ³κ²Œ, ν•˜μ§€λ§Œ κΎΈμ€€νžˆ μš΄λ™ν•  수 μžˆλ„λ‘ λ•μŠ΅λ‹ˆλ‹€.

μ£Όμš” νŠΉμ§•

  • πŸ‘₯ κ·Έλ£Ή μš΄λ™ 릴레이: μΉœκ΅¬λ“€κ³Ό ν•¨κ»˜ μš΄λ™ λͺ©ν‘œλ₯Ό 달성
  • ⏰ μžλ™ λ―Έμ…˜ ν• λ‹Ή: μ„€μ •λœ μ‹œκ°„μ— μžλ™μœΌλ‘œ μš΄λ™ λ―Έμ…˜ λ°°μ •
  • πŸ“Š μ‹€μ‹œκ°„ λž­ν‚Ή: λ―Έμ…˜ μˆ˜ν–‰ 속도 기반 개인/κ·Έλ£Ή λž­ν‚Ή
  • πŸ”” 슀마트 μ•Œλ¦Ό: FCM 기반 독촉 μ•Œλ¦Ό 및 λ―Έμ…˜ μ•Œλ¦Ό
  • 🎯 λͺ©ν‘œ 달성 μ‹œμŠ€ν…œ: 그룹별 릴레이 λͺ©ν‘œ μ„€μ • 및 달성

πŸ— μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

graph TB
   subgraph "Client Layer"
       A[Web React]
       B[Mobile App]
   end
   
   subgraph "API Gateway"
       C[RESTful API]
   end
   
   subgraph "Load Balancer"
       D[AWS ALB]
   end
   
   subgraph "Application Layer"
       E[Spring Boot]
       F[Controllers]
       G[Services]
       H[Security JWT/OAuth2]
       I[Scheduler]
       J[FCM Service]
   end
   
   subgraph "Data Layer"
       K[JPA/Hibernate]
       L[Redis Cache]
       M[(MariaDB)]
   end
   
   subgraph "Infrastructure"
       N[EC2 Auto Scaling]
       O[S3]
       P[CodeDeploy]
       Q[Docker]
       R[GitHub Actions]
   end
   
   A --> C
   B --> C
   C --> D
   D --> E
   E --> F
   F --> G
   G --> K
   K --> M
   G --> L
   E --> H
   E --> I
   E --> J
Loading

πŸ›  기술 μŠ€νƒ

Backend

  • Framework: Spring Boot 3.1.1
  • Language: Java 17
  • Build Tool: Gradle
  • ORM: Spring Data JPA / Hibernate
  • Security: Spring Security + JWT + OAuth2 (Kakao)
  • Database: MariaDB (Production), H2 (Development)
  • Cache: Redis
  • Push Notification: Firebase Cloud Messaging (FCM)

Infrastructure

  • Container: Docker & Docker Compose
  • CI/CD: GitHub Actions
  • Cloud: AWS (EC2, S3, CodeDeploy, ALB)
  • Monitoring: Spring Actuator

Documentation

  • API Docs: Swagger/OpenAPI 3.0

πŸ“Š μ£Όμš” 도메인 λͺ¨λΈ

classDiagram
    class Member {
        +Long id
        +String email
        +String nickname
        +String profileImage
        +Role role
        +Gender gender
        +Integer birthYear
        +String fcmToken
    }
    
    class Group {
        +Long id
        +String name
        +String code
        +Integer maxMemberNum
        +Integer goalRelayNum
        +LocalTime startTime
        +LocalTime endTime
        +Integer existDays
        +String penalty
        +Boolean isGoalAchieved
        +Long currentDoingMemberId
    }
    
    class JoinList {
        +Long id
        +Member member
        +Group group
        +JoinType joinType
        +Integer outCount
        +Integer executedMissionCount
        +Status status
    }
    
    class Mission {
        +Long id
        +Exercise exercise
        +Member member
        +Group group
        +Integer calory
        +LocalDateTime startAt
        +LocalDateTime endAt
        +Integer alarmCount
    }
    
    class Exercise {
        +Long id
        +String name
        +ExerciseCategory category
        +String videoLink
        +String description
        +Integer minPerKcal
    }
    
    Member "1" --> "*" JoinList
    Group "1" --> "*" JoinList
    Member "1" --> "*" Mission
    Group "1" --> "*" Mission
    Exercise "1" --> "*" Mission
Loading

πŸ”₯ 핡심 κΈ°λŠ₯

1. κ·Έλ£Ή 관리

  • κ·Έλ£Ή 생성: μš΄λ™ μ‹œκ°„, λͺ©ν‘œ 릴레이 횟수, λ²ŒμΉ™ λ“± μ„€μ •
  • κ·Έλ£Ή μ°Έμ—¬: 6자리 μ½”λ“œλ‘œ κ°„νŽΈν•˜κ²Œ κ·Έλ£Ή μ°Έμ—¬
  • κ·Έλ£Ή 관리: λ°©μž₯ κΆŒν•œμœΌλ‘œ 멀버 관리 및 κ·Έλ£Ή μ„€μ • λ³€κ²½

2. λ―Έμ…˜ μ‹œμŠ€ν…œ

  • μžλ™ ν• λ‹Ή: μ„€μ •λœ μ‹œκ°„μ— μžλ™μœΌλ‘œ λ―Έμ…˜ ν• λ‹Ή
  • 릴레이 방식: ν•œ λͺ…이 μ™„λ£Œν•˜λ©΄ λ‹€μŒ μ‚¬λžŒμ—κ²Œ μžλ™ 전달
  • 랜덀 μš΄λ™: λ‹€μ–‘ν•œ μš΄λ™ μ˜μƒ 쀑 랜덀 선택

3. μ•Œλ¦Ό μ‹œμŠ€ν…œ

  • λ―Έμ…˜ μ•Œλ¦Ό: λ―Έμ…˜ ν• λ‹Ή μ‹œ FCM ν‘Έμ‹œ μ•Œλ¦Ό
  • 독촉 μ•Œλ¦Ό: μ„€μ • μ‹œκ°„ κ²½κ³Ό μ‹œ μžλ™/μˆ˜λ™ 독촉 μ•Œλ¦Ό
  • λͺ©ν‘œ 달성 μ•Œλ¦Ό: κ·Έλ£Ή λͺ©ν‘œ 달성 μ‹œ 전체 μ•Œλ¦Ό

4. λž­ν‚Ή μ‹œμŠ€ν…œ

  • 개인 λž­ν‚Ή: λ―Έμ…˜ μˆ˜ν–‰ 속도 기반 μˆœμœ„
  • 일간/λˆ„μ  λž­ν‚Ή: 당일 및 전체 κΈ°κ°„ λž­ν‚Ή 제곡

πŸ“± API μ—”λ“œν¬μΈνŠΈ

인증 (Auth)

  • POST /mvp/auth/sign-up - MVP νšŒμ›κ°€μž…
  • POST /mvp/auth/login - MVP 둜그인
  • POST /api/auth/reissue - 토큰 μž¬λ°œκΈ‰
  • POST /api/auth/logout - λ‘œκ·Έμ•„μ›ƒ

κ·Έλ£Ή (Group)

  • POST /groups - κ·Έλ£Ή 생성
  • GET /groups/{groupId} - κ·Έλ£Ή 쑰회
  • PATCH /groups/{groupId} - κ·Έλ£Ή μˆ˜μ •
  • POST /groups/join/code - μ½”λ“œλ‘œ κ·Έλ£Ή μ°Έμ—¬
  • PATCH /groups/{groupId}/initiation - κ·Έλ£Ή μ‹œμž‘

λ―Έμ…˜ (Mission)

  • GET /groups/{groupId}/missions - 당일 λ―Έμ…˜ ν˜„ν™©
  • GET /groups/{groupId}/missions/rank - λ―Έμ…˜ λž­ν‚Ή
  • POST /missions/start - λ―Έμ…˜ μ‹œμž‘
  • POST /missions/{missionId}/finish - λ―Έμ…˜ μ™„λ£Œ

μ•Œλ¦Ό (Notification)

  • PATCH /members/notification - FCM 토큰 등둝
  • PATCH /alarm/reminder - μˆ˜λ™ 독촉 μ•Œλ¦Ό

πŸš€ 배포 ν”„λ‘œμ„ΈμŠ€

Development (develop branch)

  1. GitHub Actions 트리거
  2. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λΉŒλ“œ 및 ν…ŒμŠ€νŠΈ
  3. Docker 이미지 λΉŒλ“œ 및 ν‘Έμ‹œ
  4. EC2 μΈμŠ€ν„΄μŠ€μ— μžλ™ 배포

Production (main branch)

  1. GitHub Actions 트리거
  2. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λΉŒλ“œ 및 ν…ŒμŠ€νŠΈ
  3. Docker 이미지 λΉŒλ“œ 및 ν‘Έμ‹œ
  4. AWS CodeDeployλ₯Ό ν†΅ν•œ 무쀑단 배포
  5. Auto Scaling Group 적용

πŸ‘¨β€πŸ’» 개발 ν™˜κ²½

ν•„μˆ˜ μš”κ΅¬μ‚¬ν•­

  • Java 17
  • Docker & Docker Compose
  • Redis
  • MariaDB (or H2 for local)

ν™˜κ²½ μ„€μ • 파일

  • application-dev.yml - 개발 ν™˜κ²½ μ„€μ •
  • application-prod.yml - 운영 ν™˜κ²½ μ„€μ •
  • application-jwt.yml - JWT μ„€μ •
  • application-oauth.yml - OAuth2 μ„€μ •
  • application-fcm.yml - FCM μ„€μ •

πŸ“š ν”„λ‘œμ νŠΈ ꡬ쑰


snack-exercise-server/
β”œβ”€β”€ .github/                    # GitHub Actions μ›Œν¬ν”Œλ‘œμš°
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ main/
β”‚   β”‚   β”œβ”€β”€ java/com/soma/snackexercise/
β”‚   β”‚   β”‚   β”œβ”€β”€ auth/          # 인증/인가 κ΄€λ ¨
β”‚   β”‚   β”‚   β”œβ”€β”€ config/        # μ„€μ • 클래슀
β”‚   β”‚   β”‚   β”œβ”€β”€ controller/    # REST 컨트둀러
β”‚   β”‚   β”‚   β”œβ”€β”€ domain/        # μ—”ν‹°ν‹°
β”‚   β”‚   β”‚   β”œβ”€β”€ dto/           # DTO
β”‚   β”‚   β”‚   β”œβ”€β”€ exception/     # μ˜ˆμ™Έ 클래슀
β”‚   β”‚   β”‚   β”œβ”€β”€ repository/    # JPA λ ˆν¬μ§€ν† λ¦¬
β”‚   β”‚   β”‚   β”œβ”€β”€ service/       # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
β”‚   β”‚   β”‚   └── util/          # μœ ν‹Έλ¦¬ν‹°
β”‚   β”‚   └── resources/
β”‚   β”‚       β”œβ”€β”€ application.yml
β”‚   β”‚       └── data.sql       # 초기 데이터
β”‚   └── test/                  # ν…ŒμŠ€νŠΈ μ½”λ“œ
β”œβ”€β”€ scripts/                   # 배포 슀크립트
β”œβ”€β”€ docker-compose.yml         # Docker μ„€μ •
β”œβ”€β”€ Dockerfile                 # Docker 이미지 μ„€μ •
└── build.gradle               # Gradle λΉŒλ“œ μ„€μ •

πŸ” λ³΄μ•ˆ 및 인증

JWT 토큰 관리

  • Access Token: μš”μ²­ 인증용 (짧은 μœ νš¨κΈ°κ°„)
  • Refresh Token: 토큰 μž¬λ°œκΈ‰μš© (Redis μ €μž₯)
  • Token Blacklist: λ‘œκ·Έμ•„μ›ƒ 토큰 관리

OAuth2 μ†Œμ…œ 둜그인

  • Kakao 둜그인 지원
  • μ‹ κ·œ νšŒμ› μžλ™ κ°€μž… ν”„λ‘œμ„ΈμŠ€

πŸ“ˆ λͺ¨λ‹ˆν„°λ§ 및 λ‘œκΉ…

  • Health Check: /health μ—”λ“œν¬μΈνŠΈ
  • Swagger UI: API λ¬Έμ„œ μžλ™ 생성
  • Application Logs: μŠ€μΌ€μ€„λŸ¬ 및 λ―Έμ…˜ ν• λ‹Ή 둜그
  • Error Tracking: μ˜ˆμ™Έ 처리 및 μ—λŸ¬ 응닡 ν‘œμ€€ν™”

🎯 μ£Όμš” λΉ„μ¦ˆλ‹ˆμŠ€ 둜직

λ―Έμ…˜ ν• λ‹Ή μ•Œκ³ λ¦¬μ¦˜

  1. κ·Έλ£Ή λ‚΄ λ―Έμ…˜ μˆ˜ν–‰ νšŸμˆ˜κ°€ κ°€μž₯ 적은 멀버 선택
  2. λ™μΌν•œ 횟수인 경우 랜덀 선택
  3. μš΄λ™ μ’…λ₯˜λŠ” 전체 ν’€μ—μ„œ 랜덀 선택

μžλ™ 독촉 μ‹œμŠ€ν…œ

  • μ„€μ •λœ 간격(checkIntervalTime)λ§ˆλ‹€ 체크
  • μ΅œλŒ€ 독촉 횟수(checkMaxNum) μ œν•œ
  • λ―Έμˆ˜ν–‰μžμ™€ κ·Έλ£Ήμ›μ—κ²Œ 각각 λ‹€λ₯Έ λ©”μ‹œμ§€ 전솑

κ·Έλ£Ή μ’…λ£Œ 처리

  • μ„€μ •λœ κΈ°κ°„(existDays) κ²½κ³Ό μ‹œ μžλ™ μ’…λ£Œ
  • λͺ©ν‘œ 달성 μ—¬λΆ€ νŒλ‹¨ 및 μ•Œλ¦Ό
  • λͺ¨λ“  JoinList λΉ„ν™œμ„±ν™”

🀝 κΈ°μ—¬ κ°€μ΄λ“œ

브랜치 μ „λž΅

  • main: ν”„λ‘œλ•μ…˜ 배포 브랜치
  • develop: 개발 톡합 브랜치
  • feature/*: κΈ°λŠ₯ 개발 브랜치
  • hotfix/*: κΈ΄κΈ‰ μˆ˜μ • 브랜치

컀밋 μ»¨λ²€μ…˜

  • feat: μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€
  • fix: 버그 μˆ˜μ •
  • docs: λ¬Έμ„œ μˆ˜μ •
  • style: μ½”λ“œ ν¬λ§·νŒ…
  • refactor: μ½”λ“œ λ¦¬νŒ©ν† λ§
  • test: ν…ŒμŠ€νŠΈ μ½”λ“œ
  • chore: λΉŒλ“œ 업무 μˆ˜μ •

Issue Template

  • Bug Report
  • Feature Request
  • Discussion
  • Refactor

πŸ“Š μ„±λŠ₯ μ΅œμ ν™”

  • JPA N+1 문제 ν•΄κ²°: Fetch Join μ‚¬μš©
  • 캐싱 μ „λž΅: Redisλ₯Ό ν™œμš©ν•œ 토큰 캐싱
  • 비동기 처리: @Asyncλ₯Ό ν™œμš©ν•œ μ•Œλ¦Ό 전솑
  • DB 인덱싱: 자주 μ‘°νšŒλ˜λŠ” 컬럼 인덱슀 μ„€μ •

ν•¨κ»˜ μš΄λ™ν•˜λ©° κ±΄κ°•ν•œ μŠ΅κ΄€μ„ λ§Œλ“€μ–΄κ°€μš”! πŸ’ͺ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages