Treat Well Plannerλ μ¬μ©μκ° μΌμ λ° κ³νμ μμ±νκ³ , λ°λ³΅ κ·μΉμ ν΅ν΄ μ£ΌκΈ°μ μΈ μ΄λ²€νΈλ₯Ό κ΄λ¦¬ν μ μλ Spring Boot κΈ°λ° μ΄ν리μΌμ΄μ
μ
λλ€.
μ¬μ©μλ μμμΌ(startDate
)κ³Ό μ’
λ£μΌ(endDate
)μ μ€μ νμ¬ μΌμ μ κ΄λ¦¬ν μ μμΌλ©°, 무기ν μΌμ κ³Ό νΉμ λ°λ³΅ κ·μΉ(RecurrenceRule)μ νμ©ν λ€μν κ³νμ μ§μν©λλ€.
νμ¬ Treat Well Plannerλ κ°λ° μ§ν μ€μΈ νλ‘μ νΈλ‘, μ μ μλΉμ€λ μμ§ μ€νλμ§ μμμ΅λλ€.
1μ°¨ λͺ©νλ μ£Όμ κΈ°λ₯ MVP(Minimum Viable Product) κ°λ°μ μλ£νκ³ ν
μ€νΈ νκ²½μμμ μμ μ±μ κ²μ¦νλ κ²μ
λλ€. μ μ λ°°ν¬ λ° μ€ν μΌμ μ μΆν 곡μ§λ μμ μ
λλ€.
- ποΈ μΌμ κ΄λ¦¬: μΌμ μμ±, μμ , μμ
- π λ°λ³΅ κ·μΉ κ΄λ¦¬:
- μ£ΌκΈ°μ μΈ μΌμ (μ: 맀주, 맀μ)
- νΉμ μμΌ, μλ³ λ μ§, μ°κ° λ°λ³΅ κ·μΉ μ€μ
- π 무기ν μΌμ μ§μ: μ’
λ£μΌ(
endDate
) μμ΄ μ§μλλ μΌμ μμ± - π μΌμ κ²μ λ° μ‘°ν:
- νΉμ λ μ§κ° ν¬ν¨λ μΌμ κ²μ
- 무기ν μΌμ λ° λ°λ³΅ μΌμ κ³μ°
- π₯οΈ Java 17: μμ μ±κ³Ό μ±λ₯μ λμ΄κΈ° μν μ΅μ LTS λ²μ μ¬μ©
- πΏ Spring Boot: κ°λ ₯ν REST API λ° μ ν리μΌμ΄μ κ°λ° νλ μμν¬
- π Swagger: API λ¬Έμν λ° ν μ€νΈλ₯Ό μν UI μ 곡
- πΏ Spring Data JPA: λ°μ΄ν°λ² μ΄μ€μμ κ°λ¨νκ³ ν¨μ¨μ μΈ μνΈμμ©
- βοΈ Gradle: λΉλ λ° μμ‘΄μ± κ΄λ¦¬λ₯Ό μν λꡬ
- π Lombok: μ½λ κ°μν (Getter, Setter, Builder λ± μλ μμ±)
- ποΈ H2 Database: ν
μ€νΈ νκ²½μ© μΈλ©λͺ¨λ¦¬ λ°μ΄ν°λ² μ΄μ€
- (μ€μ μ΄μμμλ λ€λ₯Έ λ°μ΄ν°λ² μ΄μ€λ‘ λ³κ²½ κ°λ₯)
- β Java 17 μ΄μ
- π Gradle 7.x μ΄μ
git clone https://github.com/keepConcentration/treat-well-planner.git
cd treat-well-planner
Gradleμ μ¬μ©ν΄ νλ‘μ νΈλ₯Ό λΉλν©λλ€:
# μμ‘΄μ± μ€μΉ λ° λΉλ
./gradlew build
Gradleλ‘ μ ν리μΌμ΄μ μ€ν:
./gradlew bootRun
- κΈ°λ³Έμ μΌλ‘
http://localhost:8080
μμ μλ²κ° μ€νλ©λλ€. - Swagger API λ¬Έμλ₯Ό νμΈνλ €λ©΄ λ€μ λ§ν¬λ₯Ό λ°©λ¬ΈνμΈμ:
π http://localhost:8080/swagger-ui.html
μ΄ νλ‘μ νΈλ Swaggerλ₯Ό μ¬μ©νμ¬ μΌκ΄λ API λ¬Έμλ₯Ό μ 곡ν©λλ€. Swaggerλ API λ¬Έμλ₯Ό μλμΌλ‘ μμ±νλ©°, μ¬μ©μ μΉνμ μΈ UIλ₯Ό ν΅ν΄ ν μ€νΈν μ μμ΅λλ€.
build.gradle
νμΌμ μλ μμ‘΄μ±μ μΆκ°ν©λλ€.
dependencies {
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'
}
API λ¬Έμνλ κΈ°λ³Έμ μΌλ‘ /swagger-ui.html
κ²½λ‘μμ μ‘μΈμ€ν μ μμ΅λλ€. μ€μ κ°μ application.yml
μμ μμ ν μ μμ΅λλ€.
μ£Όμ μν°ν°μ΄λ©°, μΌμ μ κΈ°λ³Έ μ 보λ₯Ό κ΄λ¦¬ν©λλ€.
π νλ | μ€λͺ |
---|---|
id |
UUID κΈ°λ° κ³ μ μλ³μ |
title |
μΌμ μ λͺ© |
description |
μΌμ μ€λͺ |
startDate |
μμ λ μ§ |
endDate |
μ’ λ£ λ μ§ (nullable) |
recurrenceRule |
μΌμ μ λ°λ³΅ κ·μΉ (Optional) |
μΌμ μ λ°λ³΅ λ Όλ¦¬λ₯Ό μ μν©λλ€.
π νλ | μ€λͺ |
---|---|
id |
UUID κΈ°λ° κ³ μ μλ³μ |
startDate |
λ°λ³΅ μμ λ μ§ |
endDate |
λ°λ³΅ μ’ λ£ λ μ§ (nullable) |
interval |
λ°λ³΅ κ°κ²© (days, weeks λ±) |
daysOfWeek |
νΉμ μμΌ μ§μ (Optional) |
daysOfMonth |
νΉμ λ μ§ μ§μ (Optional) |
Treat Well Planner
μ ν리μΌμ΄μ
μ μ£Όμ APIλ₯Ό λμ΄ν©λλ€.
POST /plans
{
"title": "Workout Plan",
"description": "Daily running schedule",
"startDate": "2023-11-01",
"endDate": null, // 무기νμΌ κ²½μ° null
"recurrenceRule": {
"startDate": "2023-11-01",
"interval": 1
}
}
GET /plans?date=2023-11-01
POST /plans/{planId}/recurrence-rule
{
"startDate": "2023-11-01",
"endDate": "2023-12-31",
"interval": 7
}
λ λ§μ API μ 보λ π Swagger UI μμ νμΈνμ€ μ μμ΅λλ€.
test
λλ ν 리 λ΄μμ λ¨μ ν
μ€νΈλ₯Ό μ€νν©λλ€:
./gradlew test
src/
βββ main/
β βββ java/com/treat/well/planner/
β β βββ global/ (κΈλ‘λ² μ΄λ²€νΈ μ μ)
β β βββ plan/
β β β βββ domain/ # Plan, RecurrenceRule μν°ν°
β β β βββ service/ # λΉμ¦λμ€ λ‘μ§
β β β βββ repository/ # Spring Data JPA Repository
β βββ resources/
β βββ application.yml # Spring Boot μ€μ
β βββ data.sql # μν λ°μ΄ν°
βββ test/
βββ java/com/treat/well/planner/
βββ plan/ # Plan κ΄λ ¨ λ¨μ ν
μ€νΈ
- ποΈ μΆκ° API μ 곡:
- νΉμ μ£Ό λ¨μ λ°λ³΅, μ°κ° λ°λ³΅ μΌμ μ§μ
- π μ¬μ©μ μΈμ¦ λ° κΆν κ΄λ¦¬ ꡬν
- π κ΅μ ν(i18n) λ° λ€κ΅μ΄ μ§μ
- π¨ νλ‘ νΈμλ ν΅ν© κ°λ° (React λ° Vue.js κ³ λ €)
Treat Well Planner
λ μ€ν μμ€ νλ‘μ νΈλ‘ νμ
μ νμν©λλ€!
- 리ν¬μ§ν 리λ₯Ό ν¬ν¬ν©λλ€.
- μλ‘μ΄ λΈλμΉλ₯Ό μμ±ν©λλ€:
git checkout -b feature/my-feature
- μ½λλ₯Ό 컀λ°ν©λλ€:
git commit -m 'Add new feature'
- λΈλμΉλ₯Ό νΈμν©λλ€:
git push origin feature/my-feature
- π οΈ ν 리νμ€νΈλ₯Ό μ μΆν©λλ€.
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€λ₯Ό λ°λ¦ λλ€.