Skip to content

ucans/Hodl_Server

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ’Š Hodl_Server - ์•ฝ๋ฌผ ๊ด€๋ฆฌ ๋ฐ ๊ฑด๊ฐ• ๊ธฐ๋ก ๋ฐฑ์—”๋“œ ์„œ๋ฒ„

๐Ÿ“‹ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

Hodl_Server๋Š” ์‚ฌ์šฉ์ž์˜ ์•ฝ๋ฌผ ๋ณต์šฉ ๊ด€๋ฆฌ์™€ ๊ฑด๊ฐ• ๊ธฐ๋ก์„ ์œ„ํ•œ ๋ชจ๋ฐ”์ผ ์•ฑ์˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์•ฝ๋ฌผ์„ ๋“ฑ๋กํ•˜๊ณ  ๋ณต์šฉ ์ผ์ •์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์ˆ˜๋ฉด, ์šด๋™, ํ–‡๋น› ๋…ธ์ถœ, ์ฆ์ƒ ๋“ฑ์˜ ๊ฑด๊ฐ• ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” RESTful API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

  • ์•ฝ๋ฌผ ๊ด€๋ฆฌ: ์•ฝ๋ฌผ ๋“ฑ๋ก, ๋ณต์šฉ ์ผ์ • ๊ด€๋ฆฌ, ๋ณต์šฉ ๊ธฐ๋ก
  • ๊ฑด๊ฐ• ๊ธฐ๋ก: ์ˆ˜๋ฉด, ์šด๋™, ํ–‡๋น› ๋…ธ์ถœ, ์ฆ์ƒ ๊ธฐ๋ก
  • ์•Œ๋ฆผ ์‹œ์Šคํ…œ: Firebase Cloud Messaging์„ ํ†ตํ•œ ํ‘ธ์‹œ ์•Œ๋ฆผ
  • ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ: ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ํ”„๋กœํ•„ ๊ด€๋ฆฌ
  • ์ฑ„ํŒ… ๊ธฐ๋ฐ˜ UX: ๋‹จ๊ณ„๋ณ„ ์ฑ„ํŒ… ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ์ง๊ด€์ ์ธ ์•ฝ๋ฌผ ๋“ฑ๋ก

๐Ÿ—๏ธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

์ „์ฒด ์‹œ์Šคํ…œ ๊ตฌ์กฐ

graph TB
    subgraph "Client Layer"
        A[Mobile App]
    end
    
    subgraph "Web Server Layer"
        B[Nginx - Reverse Proxy]
    end
    
    subgraph "Application Layer"
        C[Spring Boot Application]
        D[JWT Authentication]
        E[Firebase Cloud Messaging]
    end
    
    subgraph "Data Layer"
        F[MySQL Database]
        G[AWS RDS]
    end
    
    subgraph "Infrastructure"
        H[AWS EC2 - Linux]
        I[AWS RDS - MySQL]
    end
    
    A -->|HTTPS| B
    B -->|HTTP| C
    C --> D
    C --> E
    C -->|JDBC| F
    F --> G
    C --> H
    G --> I
    
    style A fill:#e1f5fe
    style B fill:#fff3e0
    style C fill:#f3e5f5
    style D fill:#e8f5e8
    style E fill:#fff8e1
    style F fill:#fce4ec
    style G fill:#f1f8e9
    style H fill:#e0f2f1
    style I fill:#fafafa
Loading

๐Ÿ”„ ์š”์ฒญ ์ฒ˜๋ฆฌ ํ๋ฆ„

sequenceDiagram
    participant Client as Mobile App
    participant Nginx as Nginx Server
    participant Spring as Spring Boot
    participant DB as MySQL Database
    participant FCM as Firebase Cloud Messaging
    
    Client->>Nginx: HTTPS Request
    Nginx->>Spring: HTTP Request (Reverse Proxy)
    Spring->>Spring: JWT Authentication
    Spring->>DB: Database Query
    DB->>Spring: Query Result
    Spring->>FCM: Push Notification (if needed)
    FCM->>Client: Push Notification
    Spring->>Nginx: HTTP Response
    Nginx->>Client: HTTPS Response
Loading

๐Ÿ“Š ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ์ƒ์„ธ ์„ค๋ช…

๋ ˆ์ด์–ด ๊ตฌ์„ฑ ์š”์†Œ ์—ญํ•  ๊ธฐ์ˆ  ์Šคํƒ
Client Layer Mobile App ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค React Native / Flutter
Web Server Layer Nginx ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ Nginx
Application Layer Spring Boot ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ Spring Boot 2.4.2
Application Layer JWT Authentication ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๊ด€๋ฆฌ JWT
Application Layer Firebase Cloud Messaging ํ‘ธ์‹œ ์•Œ๋ฆผ ์„œ๋น„์Šค Firebase FCM
Data Layer MySQL Database ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌ MySQL 8.0
Infrastructure AWS EC2 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ Amazon EC2 (Linux)
Infrastructure AWS RDS ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„ Amazon RDS (MySQL)

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

Backend

  • Framework: Spring Boot 2.4.2
  • Language: Java 8
  • Build Tool: Gradle
  • Database: MySQL 8.0
  • ORM: Spring JDBC Template
  • Authentication: JWT (JSON Web Token)
  • Push Notification: Firebase Cloud Messaging
  • Email Service: JavaMail API
  • Security: Spring Security (๊ธฐ๋ณธ ์„ค์ •)

Infrastructure

  • Cloud Platform: AWS
  • Server: EC2 (Linux)
  • Web Server: Nginx
  • Database: RDS (MySQL)
  • Load Balancer: Nginx (Reverse Proxy)

Development Tools

  • IDE: IntelliJ IDEA
  • Version Control: Git
  • API Testing: Postman
  • Database Management: MySQL Workbench

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

Hodl_Server/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ main/
โ”‚   โ”‚   โ”œโ”€โ”€ java/shop/hodl/kkonggi/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ config/                 # ์„ค์ • ํด๋ž˜์Šค
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ BaseException.java
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ BaseResponse.java
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ BaseResponseStatus.java
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Constant.java
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ user/               # ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ UserController.java
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ UserService.java
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ UserProvider.java
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ UserDao.java
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ model/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ medicine/           # ์•ฝ๋ฌผ ๊ด€๋ฆฌ
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ MedicineController.java
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ MedicineService.java
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ MedicineProvider.java
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ MedicineDao.java
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ model/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ record/             # ๊ฑด๊ฐ• ๊ธฐ๋ก
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ medicine/       # ์•ฝ๋ฌผ ๋ณต์šฉ ๊ธฐ๋ก
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ sleep/          # ์ˆ˜๋ฉด ๊ธฐ๋ก
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ exercise/       # ์šด๋™ ๊ธฐ๋ก
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ sun/            # ํ–‡๋น› ๊ธฐ๋ก
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ symptom/        # ์ฆ์ƒ ๊ธฐ๋ก
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ notification/       # ์•Œ๋ฆผ ๊ด€๋ฆฌ
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ push/               # ํ‘ธ์‹œ ์•Œ๋ฆผ
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ email/              # ์ด๋ฉ”์ผ ์„œ๋น„์Šค
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ firebase/           # Firebase ์—ฐ๋™
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ data/               # ๊ณต์ง€์‚ฌํ•ญ, ๋ฒ„์ „ ๊ด€๋ฆฌ
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ store/              # ์Šคํ† ์–ด ์ •๋ณด
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ utils/                  # ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ JwtService.java
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ AES128.java
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ ValidationRegex.java
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ WebSecurityConfig.java  # ๋ณด์•ˆ ์„ค์ •
โ”‚   โ”‚   โ””โ”€โ”€ resources/
โ”‚   โ”‚       โ”œโ”€โ”€ templates/
โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ mail.html           # ์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ
โ”‚   โ”‚       โ””โ”€โ”€ logback-spring.xml      # ๋กœ๊ทธ ์„ค์ •
โ”‚   โ””โ”€โ”€ test/                           # ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
โ”œโ”€โ”€ build.gradle                        # Gradle ์„ค์ •
โ”œโ”€โ”€ gradlew
โ””โ”€โ”€ README.md

๐Ÿ”ง ์ฃผ์š” ๊ธฐ๋Šฅ ์ƒ์„ธ ์„ค๋ช…

1. ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ (User Management)

ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ

  • ์ด๋ฉ”์ผ ์ธ์ฆ: ํšŒ์›๊ฐ€์ž… ์‹œ ์ด๋ฉ”์ผ ์ธ์ฆ ์ฝ”๋“œ ๋ฐœ์†ก
  • JWT ํ† ํฐ: ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ 1๋…„ ์œ ํšจํ•œ JWT ํ† ํฐ ๋ฐœ๊ธ‰
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”: AES128 ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”

ํ”„๋กœํ•„ ๊ด€๋ฆฌ

  • ๋‹‰๋„ค์ž„, ์ƒ๋…„์›”์ผ, ์„ฑ๋ณ„ ์ •๋ณด ๊ด€๋ฆฌ
  • ์ฑ„ํŒ… ๊ธฐ๋ฐ˜ ๋‹‰๋„ค์ž„ ์„ค์ • ํ”„๋กœ์„ธ์Šค

API ์—”๋“œํฌ์ธํŠธ:

POST /app/v1/users          # ํšŒ์›๊ฐ€์ž…
POST /app/v1/users/logIn    # ๋กœ๊ทธ์ธ
GET  /app/v1/users/{userIdx} # ํ”„๋กœํ•„ ์กฐํšŒ
PATCH /app/v1/users/{userIdx} # ํ”„๋กœํ•„ ์ˆ˜์ •

2. ์•ฝ๋ฌผ ๊ด€๋ฆฌ (Medicine Management)

์•ฝ๋ฌผ ๋“ฑ๋ก ํ”„๋กœ์„ธ์Šค

์ฑ„ํŒ… ๊ธฐ๋ฐ˜์˜ ๋‹จ๊ณ„๋ณ„ ์•ฝ๋ฌผ ๋“ฑ๋ก ์‹œ์Šคํ…œ:

  1. ์•ฝ๋ฌผ๋ช… ์ž…๋ ฅ โ†’ 2. ๋ณต์šฉ ์ฃผ๊ธฐ ์„ค์ • โ†’ 3. ์‹œ์ž‘์ผ ์„ค์ • โ†’ 4. ์ข…๋ฃŒ์ผ ์„ค์ • โ†’ 5. ๋ณต์šฉ ์‹œ๊ฐ„ ์„ค์ •

๋ณต์šฉ ์ผ์ • ๊ด€๋ฆฌ

  • ์š”์ผ๋ณ„ ๋ณต์šฉ ์„ค์ • (์›”~์ผ)
  • ์‹œ๊ฐ„๋Œ€๋ณ„ ๋ณต์šฉ ์„ค์ • (์ƒˆ๋ฒฝ, ์•„์นจ, ์ ์‹ฌ, ์ €๋…, ์ž๊ธฐ์ „)
  • ๋ณต์šฉ๋Ÿ‰ ๋ฐ ๋ฉ”๋ชจ ๊ด€๋ฆฌ

API ์—”๋“œํฌ์ธํŠธ:

GET  /app/v1/users/medicine/input    # ์•ฝ๋ฌผ ๋“ฑ๋ก ์‹œ์ž‘
GET  /app/v1/users/medicine/name     # ์•ฝ๋ฌผ๋ช… ์ž…๋ ฅ
GET  /app/v1/users/medicine/cycle    # ๋ณต์šฉ ์ฃผ๊ธฐ ์„ค์ •
GET  /app/v1/users/medicine/start    # ์‹œ์ž‘์ผ ์„ค์ •
GET  /app/v1/users/medicine/end      # ์ข…๋ฃŒ์ผ ์„ค์ •
GET  /app/v1/users/medicine/time     # ๋ณต์šฉ ์‹œ๊ฐ„ ์„ค์ •
POST /app/v1/users/medicine          # ์•ฝ๋ฌผ ๋“ฑ๋ก
GET  /app/v1/users/medicine          # ์•ฝ๋ฌผ ๋ชฉ๋ก ์กฐํšŒ
PUT  /app/v1/users/medicine/{medicineIdx} # ์•ฝ๋ฌผ ์ˆ˜์ •
DELETE /app/v1/users/medicine/{medicineIdx} # ์•ฝ๋ฌผ ์‚ญ์ œ

3. ๊ฑด๊ฐ• ๊ธฐ๋ก (Health Records)

์•ฝ๋ฌผ ๋ณต์šฉ ๊ธฐ๋ก

  • ์ผ๋ณ„, ์‹œ๊ฐ„๋Œ€๋ณ„ ๋ณต์šฉ ์—ฌ๋ถ€ ๊ธฐ๋ก
  • ๋ณต์šฉ๋Ÿ‰, ๋ณต์šฉ ์‹œ๊ฐ„, ๋ฉ”๋ชจ ๊ด€๋ฆฌ
  • ์ „์ฒด ์•ฝ๋ฌผ ์ผ๊ด„ ๋ณต์šฉ ๊ธฐ๋ก ๊ธฐ๋Šฅ

์ˆ˜๋ฉด ๊ธฐ๋ก

  • ์ˆ˜๋ฉด ์‹œ๊ฐ„, ๊ธฐ์ƒ ์‹œ๊ฐ„ ๊ธฐ๋ก
  • ์ˆ˜๋ฉด ํ’ˆ์งˆ ๋ฐ ์ˆ˜๋ฉด ๊ด€๋ จ ๋ฉ”๋ชจ
  • ์ˆ˜๋ฉด ํŒจํ„ด ๋ถ„์„

์šด๋™ ๊ธฐ๋ก

  • ์šด๋™ ์‹œ์ž‘ ์‹œ๊ฐ„, ์ด ์šด๋™ ์‹œ๊ฐ„
  • ์šด๋™ ๊ฐ•๋„ ๋ฐ ์šด๋™ ์ข…๋ฅ˜
  • ์šด๋™ ๊ด€๋ จ ๋ฉ”๋ชจ

ํ–‡๋น› ๋…ธ์ถœ ๊ธฐ๋ก

  • ์•ผ์™ธ ํ™œ๋™ ์‹œ์ž‘ ์‹œ๊ฐ„, ์ด ํ™œ๋™ ์‹œ๊ฐ„
  • ํ–‡๋น› ๋…ธ์ถœ ๊ด€๋ จ ๋ฉ”๋ชจ

์ฆ์ƒ ๊ธฐ๋ก

  • ์ฒด๊ณ„์ ์ธ ์ฆ์ƒ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
  • ๋ถ€์ž‘์šฉ ๋ฐ ์ฆ์ƒ ๊ธฐ๋ก
  • ์ฆ์ƒ ๊ทธ๋ฃน๋ณ„ ๋ถ„๋ฅ˜

API ์—”๋“œํฌ์ธํŠธ:

# ์•ฝ๋ฌผ ๋ณต์šฉ ๊ธฐ๋ก
GET  /app/v1/users/record/medicine
POST /app/v1/users/record/medicine/all
PATCH /app/v1/users/record/medicine/all

# ์ˆ˜๋ฉด ๊ธฐ๋ก
GET  /app/v1/users/record/sleep
POST /app/v1/users/record/sleep
PATCH /app/v1/users/record/sleep

# ์šด๋™ ๊ธฐ๋ก
GET  /app/v1/users/record/exercise
POST /app/v1/users/record/exercise
PATCH /app/v1/users/record/exercise

# ํ–‡๋น› ๊ธฐ๋ก
GET  /app/v1/users/record/sun
POST /app/v1/users/record/sun
PATCH /app/v1/users/record/sun

# ์ฆ์ƒ ๊ธฐ๋ก
GET  /app/v1/users/record/symptom
POST /app/v1/users/record/symptom
PATCH /app/v1/users/record/symptom

4. ์•Œ๋ฆผ ์‹œ์Šคํ…œ (Notification System)

ํ‘ธ์‹œ ์•Œ๋ฆผ

  • Firebase Cloud Messaging ์—ฐ๋™
  • ์•ฝ๋ฌผ ๋ณต์šฉ ์‹œ๊ฐ„ ์•Œ๋ฆผ
  • ์Šค์ผ€์ค„๋ง ๊ธฐ๋ฐ˜ ์ž๋™ ์•Œ๋ฆผ ์ „์†ก
  • ์‚ฌ์šฉ์ž๋ณ„ ์•Œ๋ฆผ ์„ค์ • ๊ด€๋ฆฌ

์•Œ๋ฆผ ์„ค์ •

  • ์„œ๋น„์Šค ์•Œ๋ฆผ, ์•ฝ๋ฌผ ์•Œ๋ฆผ, ์ด๋ฒคํŠธ ์•Œ๋ฆผ, ๋งˆ์ผ€ํŒ… ์•Œ๋ฆผ ๋ถ„๋ฆฌ
  • ์‹œ๊ฐ„๋Œ€๋ณ„ ์•ฝ๋ฌผ ์•Œ๋ฆผ ์„ค์ •
  • ๋””๋ฐ”์ด์Šค ํ† ํฐ ๊ด€๋ฆฌ

API ์—”๋“œํฌ์ธํŠธ:

GET  /app/v1/users/notification          # ์•Œ๋ฆผ ์„ค์ • ์กฐํšŒ
PATCH /app/v1/users/notification         # ์•Œ๋ฆผ ์„ค์ • ์ˆ˜์ •
GET  /app/v1/users/notification/medicine # ์•ฝ๋ฌผ ์•Œ๋ฆผ ์„ค์ • ์กฐํšŒ
PATCH /app/v1/users/notification/medicine # ์•ฝ๋ฌผ ์•Œ๋ฆผ ์„ค์ • ์ˆ˜์ •
PATCH /app/v1/users/notification/token   # ๋””๋ฐ”์ด์Šค ํ† ํฐ ์—…๋ฐ์ดํŠธ

5. ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ (Data Management)

๊ณต์ง€์‚ฌํ•ญ

  • ์•ฑ ๋‚ด ๊ณต์ง€์‚ฌํ•ญ ๊ด€๋ฆฌ
  • ๊ณต์ง€์‚ฌํ•ญ ๋ชฉ๋ก ๋ฐ ์ƒ์„ธ ๋‚ด์šฉ ์กฐํšŒ

๋ฒ„์ „ ๊ด€๋ฆฌ

  • ์•ฑ ๋ฒ„์ „ ์ •๋ณด ๊ด€๋ฆฌ
  • ์ตœ์‹  ๋ฒ„์ „ ์ •๋ณด ์กฐํšŒ

API ์—”๋“œํฌ์ธํŠธ:

GET /app/v1/data/noticeboard           # ๊ณต์ง€์‚ฌํ•ญ ๋ชฉ๋ก
GET /app/v1/data/noticeboard/{idx}     # ๊ณต์ง€์‚ฌํ•ญ ์ƒ์„ธ
GET /app/v1/data/version               # ์•ฑ ๋ฒ„์ „ ์ •๋ณด

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

JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ

  • ํ† ํฐ ์ƒ์„ฑ: ๋กœ๊ทธ์ธ ์‹œ userIdx๋ฅผ ํฌํ•จํ•œ JWT ํ† ํฐ ์ƒ์„ฑ
  • ํ† ํฐ ๊ฒ€์ฆ: ๊ฐ API ์š”์ฒญ ์‹œ X-ACCESS-TOKEN ํ—ค๋”์—์„œ JWT ์ถ”์ถœ ๋ฐ ๊ฒ€์ฆ
  • ํ† ํฐ ๋งŒ๋ฃŒ: 1๋…„ ์œ ํšจํ•œ ํ† ํฐ (๊ฐœ์„  ํ•„์š”: 30๋ถ„-1์‹œ๊ฐ„ ๊ถŒ์žฅ)

Spring Security

  • ๊ธฐ๋ณธ์ ์ธ Spring Security ์„ค์ •
  • CSRF ๋ณดํ˜ธ ๋น„ํ™œ์„ฑํ™”
  • ์ˆ˜๋™ JWT ์ธ์ฆ ๊ตฌํ˜„

๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”

  • AES128 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”
  • ์ด๋ฉ”์ผ ์ธ์ฆ ์ฝ”๋“œ ์•”ํ˜ธํ™”

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

์ฃผ์š” ํ…Œ์ด๋ธ” ๊ตฌ์กฐ

  • Users: ์‚ฌ์šฉ์ž ๊ธฐ๋ณธ ์ •๋ณด
  • Authentication: ์ด๋ฉ”์ผ ์ธ์ฆ ์ •๋ณด
  • Medicine: ์•ฝ๋ฌผ ์ •๋ณด
  • MedicineTime: ์•ฝ๋ฌผ ๋ณต์šฉ ์‹œ๊ฐ„ ์„ค์ •
  • MedicineRecord: ์•ฝ๋ฌผ ๋ณต์šฉ ๊ธฐ๋ก
  • SleepRecord: ์ˆ˜๋ฉด ๊ธฐ๋ก
  • ExerciseRecord: ์šด๋™ ๊ธฐ๋ก
  • SunRecord: ํ–‡๋น› ๋…ธ์ถœ ๊ธฐ๋ก
  • SymptomRecord: ์ฆ์ƒ ๊ธฐ๋ก
  • Notification: ์•Œ๋ฆผ ์„ค์ •
  • DeviceToken: ๋””๋ฐ”์ด์Šค ํ† ํฐ

๐Ÿš€ ๋ฐฐํฌ ๋ฐ ์šด์˜

AWS ์ธํ”„๋ผ ๊ตฌ์„ฑ

  1. EC2 ์ธ์Šคํ„ด์Šค: Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ˜ธ์ŠคํŒ…
  2. RDS MySQL: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„
  3. Nginx: ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ๋ฐ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ
  4. Security Groups: ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ์„ค์ •

๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค

  1. Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ
  2. EC2 ์ธ์Šคํ„ด์Šค์— JAR ํŒŒ์ผ ์—…๋กœ๋“œ
  3. Nginx ์„ค์ • ์—…๋ฐ์ดํŠธ
  4. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์žฌ์‹œ์ž‘

์‹ค์ œ ๊ตฌํ˜„ํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

  • JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ: ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๊ด€๋ฆฌ
  • Firebase ํ‘ธ์‹œ ์•Œ๋ฆผ: ์ •์‹œ ์•ฝ๋ฌผ ๋ณต์šฉ ์•Œ๋ฆผ ์ž๋™ ์ „์†ก
  • ์ด๋ฉ”์ผ ์ธ์ฆ ์‹œ์Šคํ…œ: ํšŒ์›๊ฐ€์ž… ์‹œ ์ด๋ฉ”์ผ ์ธ์ฆ ์ฝ”๋“œ ๋ฐœ์†ก
  • ์ฑ„ํŒ… ๊ธฐ๋ฐ˜ UX: ๋‹จ๊ณ„๋ณ„ ์•ฝ๋ฌผ ๋“ฑ๋ก ํ”„๋กœ์„ธ์Šค
  • ์Šค์ผ€์ค„๋ง ์‹œ์Šคํ…œ: ๋งค๋ถ„๋งˆ๋‹ค ์•ฝ๋ฌผ ๋ณต์šฉ ์‹œ๊ฐ„ ์ฒดํฌ ๋ฐ ์•Œ๋ฆผ
  • RESTful API: ์ฒด๊ณ„์ ์ธ API ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„

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

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

  • Java 8 ์ด์ƒ
  • Gradle 6.x ์ด์ƒ
  • MySQL 8.0 ์ด์ƒ

๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •

# ํ”„๋กœ์ ํŠธ ํด๋ก 
git clone [repository-url]
cd Hodl_Server

# ์˜์กด์„ฑ ์„ค์น˜
./gradlew build

# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
./gradlew bootRun

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

# application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/hodl_db
    username: your_username
    password: your_password
  
  mail:
    host: smtp.gmail.com
    port: 587
    username: [email protected]
    password: your_app_password

# Firebase ์„ค์ •
firebase:
  service-account: path/to/serviceAccountKey.json

๐Ÿงช ํ…Œ์ŠคํŠธ

API ํ…Œ์ŠคํŠธ

  • Postman์„ ์‚ฌ์šฉํ•œ API ์—”๋“œํฌ์ธํŠธ ํ…Œ์ŠคํŠธ
  • JWT ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ํ…Œ์ŠคํŠธ
  • ๊ฐ ๊ธฐ๋Šฅ๋ณ„ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ŠคํŠธ

  • ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ
  • ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ํ…Œ์ŠคํŠธ

๐Ÿ“ API ๋ฌธ์„œ

๊ณตํ†ต ์‘๋‹ต ํ˜•์‹

{
  "isSuccess": true,
  "code": 1000,
  "message": "์š”์ฒญ์— ์„ฑ๊ณตํ•˜์˜€์Šต๋‹ˆ๋‹ค.",
  "result": {
    // ์‹ค์ œ ๋ฐ์ดํ„ฐ
  }
}

์—๋Ÿฌ ์ฝ”๋“œ ์ฒด๊ณ„

  • 1000: ์„ฑ๊ณต
  • 2000: ์š”์ฒญ ์˜ค๋ฅ˜ (์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ ์‹คํŒจ)
  • 3000: ์‘๋‹ต ์˜ค๋ฅ˜ (๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹คํŒจ)
  • 4000: ์„œ๋ฒ„ ์˜ค๋ฅ˜ (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์‹คํŒจ)

๐Ÿ”ฎ ํ”„๋กœ์ ํŠธ ๊ฐœ์„  ์‚ฌํ•ญ (๊ฐœ์„ )

๋ณด์•ˆ ๊ฐ•ํ™” (๊ฐœ์„ )

  • JWT ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๋‹จ์ถ• (1๋…„ โ†’ 30๋ถ„-1์‹œ๊ฐ„)
  • ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ๊ตฌํ˜„
  • Spring Security JWT ํ•„ํ„ฐ ๊ตฌํ˜„
  • ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ ๋ณด์•ˆ ์ ์šฉ

์„ฑ๋Šฅ ๊ฐœ์„  (๊ฐœ์„ )

  • ์บ์‹ฑ ์ „๋žต ๋„์ž… (Redis)
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ์ตœ์ ํ™”
  • API ์‘๋‹ต ์‹œ๊ฐ„ ๊ฐœ์„ 

๊ธฐ๋Šฅ ํ™•์žฅ (๊ฐœ์„ )

  • ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ๋กœ๊ทธ์ธ ๊ด€๋ฆฌ
  • ํ† ํฐ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„
  • ๋ณด์•ˆ ๋กœ๊ทธ ๊ธฐ๋ก
  • Rate Limiting ๊ตฌํ˜„

๐Ÿ‘จโ€๐Ÿ’ป ๊ฐœ๋ฐœ์ž ์ •๋ณด

์—ญํ• : ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž (ํ’€์Šคํƒ ๋ฐฑ์—”๋“œ) ๋‹ด๋‹น ์˜์—ญ:

  • ์„œ๋ฒ„ ๊ตฌ์ถ• ๋ฐ ์ธํ”„๋ผ ์„ค์ • (AWS EC2, RDS, Nginx)
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ๋ฐ ๊ตฌ์ถ• (MySQL)
  • Spring Boot ๋ฐฑ์—”๋“œ API ๊ฐœ๋ฐœ
  • JWT ์ธ์ฆ ์‹œ์Šคํ…œ ๊ตฌํ˜„
  • Firebase ํ‘ธ์‹œ ์•Œ๋ฆผ ์—ฐ๋™
  • ์ด๋ฉ”์ผ ์„œ๋น„์Šค ๊ตฌํ˜„

๊ธฐ์ˆ  ์Šคํƒ:

  • Java, Spring Boot, MySQL, AWS, Nginx, JWT, Firebase

๐Ÿ“… ํ”„๋กœ์ ํŠธ ์ •๋ณด

ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„: 2021.5 - 2021.8
ํŒ€ ๊ตฌ์„ฑ: Hodl (์†Œ์†: @Central-MakeUs)
GitHub: @ucans/Hodl_Server


์ด ํ”„๋กœ์ ํŠธ๋Š” ๋Œ€ํ•™๊ต ํ•™๋ถ€ ๊ณผ์ •์—์„œ ์ง„ํ–‰ํ•œ ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ, ์‹ค์ œ ์„œ๋น„์Šค ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ํ†ตํ•ด ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ์—ญ๋Ÿ‰์„ ํ–ฅ์ƒ์‹œํ‚จ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

About

Server in the depression management app "Kkonggi"

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 99.8%
  • HTML 0.2%