<aside> 💡
개인 맞춤 식단 및 운동 추천 웹 서비스
</aside>
코로나19 이후 건강과 운동에 대한 관심은 폭발적으로 증가했으나, 많은 사람들이 비용, 정보 부족, 심리적 장벽으로 인해 운동 시작을 주저하고 있습니다.
기존 정보는 파편화되어 있고 개인의 몸 상태를 고려하지 않아 실질적인 도움이 되기 어렵습니다.
DO EAT FIT은 사용자가 입력한 인바디 결과를 기반으로,전문가(트레이너, 영양사, 의료인)가 검증한 **개인 맞춤형 운동 계획과 운동 방법과 식단 플래너를 제공**하는 건강 관리 플랫폼입니다. 건강 관리의 높은 진입 장벽을 낮추고 지속 가능한 건강 습관 형성을 돕습니다.
Github
WebService
| Programming Languages | Java, JavaScript/Typescript |
|---|---|
| Frameworks | SpringBoot, Next.js |
| Databases | MySQL |
| NoSQL | Redis |
| Version Control | Git |
| Cloud Services | Cloudflare |
| Deployment Tools | Jenkins |
| Testing Frameworks | Selenium, JUnit |
| API | RESTful API |

erDiagram
%% =========================================================
%% [GROUP 1] 기존 시스템 - 회원 (User)
%% =========================================================
USERS {
long user_id PK "Auto Increment"
binary uuid "UUID (Binary 16)"
string email "Unique"
string password
string name
string nickname
string role "ENUM: MEMBER, VIP, ADMIN"
string gender "ENUM: MALE, FEMALE"
date birth_date
string provider "Social Login Provider"
string provider_id
datetime created_at
datetime updated_at
}
%% =========================================================
%% [GROUP 2] 신규 기능 - 회원 관리 및 알림 (Member Management)
%% =========================================================
%% [신규] 코칭 매칭 관계 (4.2)
VIP_MEMBER_RELATION {
long relation_id PK
long vip_id FK "Users(Coach)"
long member_id FK "Users(Member)"
string status "ENUM: PENDING, ACCEPTED, REJECTED"
datetime requested_at
datetime matched_at
}
%% [신규] 알림 센터 (4.2)
NOTIFICATION {
long notification_id PK
long receiver_id FK "Users"
long sender_id FK "Users"
string type "ENUM: REQUEST, FEEDBACK, SYSTEM"
string content
string related_url
boolean is_read
datetime created_at
}
USERS ||--o{ VIP_MEMBER_RELATION : "has_relations"
USERS ||--o{ NOTIFICATION : "receives"
%% =========================================================
%% [GROUP 3] 기존 시스템 - 운동 기준 정보 (Workout Dictionary)
%% WorkoutEntity.java의 @ElementCollection 물리 테이블 반영
%% =========================================================
WORKOUT {
long workout_id PK
binary uuid
string workout_name "Unique"
string workout_difficulty "ENUM: BEGINNER, ADVANCED"
string media_file_name
datetime created_at
datetime updated_at
}
%% 주동근 (ElementCollection)
AGONIST_MUSCLE_ENUMS {
long workout_id FK
string agonist_muscle_enums "Enum String"
}
%% 길항근 (ElementCollection)
ANTAGONIST_MUSCLE_ENUMS {
long workout_id FK
string antagonist_muscle_enums "Enum String"
}
%% 협응근 (ElementCollection)
SYNERGIST_MUSCLE_ENUMS {
long workout_id FK
string synergist_muscle_enums "Enum String"
}
%% 설명 (ElementCollection)
DESCRIPTIONS {
long workout_id FK
string descriptions "Text"
}
WORKOUT ||--|{ AGONIST_MUSCLE_ENUMS : "has"
WORKOUT ||--|{ ANTAGONIST_MUSCLE_ENUMS : "has"
WORKOUT ||--|{ SYNERGIST_MUSCLE_ENUMS : "has"
WORKOUT ||--|{ DESCRIPTIONS : "has"
%% =========================================================
%% [GROUP 4] 신규 기능 - 운동 일지 (Workout Log)
%% Log -> History -> Set 구조 (4.3)
%% =========================================================
WORKOUT_LOG {
long workout_log_id PK
long user_id FK "Users"
date date
string target_area "ex: 가슴, 삼두"
int total_volume
int total_time
int cardio_total_time
int cardio_total_calories
int energy_level "1~5"
int pumping_level "1~5"
text memo
text feedback_content
long feedback_writer_id FK
datetime feedback_created_at
datetime created_at
}
WORKOUT_HISTORY {
long history_id PK
long workout_log_id FK
long workout_id FK "WORKOUT 테이블 참조 (Weight)"
string workout_name_manual "Cardio용 직접 입력"
string type "ENUM: WEIGHT, CARDIO"
int display_order
int duration_min "Cardio Only"
int calories_burned "Cardio Only"
int avg_heart_rate "Cardio Only"
}
WORKOUT_SET {
long set_id PK
long history_id FK
int set_number
double weight
int reps
boolean is_warmup
}
USERS ||--o{ WORKOUT_LOG : "writes"
WORKOUT_LOG ||--o{ WORKOUT_HISTORY : "contains"
WORKOUT ||--o{ WORKOUT_HISTORY : "defines"
WORKOUT_HISTORY ||--o{ WORKOUT_SET : "has_sets"
%% =========================================================
%% [GROUP 5] 신규 기능 - 식단 일지 (Diet Log)
%% Log -> Meal -> Food 구조 (4.4)
%% =========================================================
DIET_LOG {
long diet_log_id PK
long user_id FK "Users"
date date
int total_calories
int total_protein
int water_intake_ml
string supplements
int digestion_level
int satiety_level
text memo
text feedback_content
long feedback_writer_id FK
datetime feedback_modified_at
}
DIET_MEAL {
long meal_id PK
long diet_log_id FK
string meal_type "ENUM: BREAKFAST, LUNCH..."
string image_url
int meal_calories
}
DIET_FOOD {
long food_id PK
long meal_id FK
string food_name
double weight_g
int calories
int carbs
int protein
int fat
}
USERS ||--o{ DIET_LOG : "writes"
DIET_LOG ||--o{ DIET_MEAL : "has_meals"
DIET_MEAL ||--o{ DIET_FOOD : "contains_foods"
%% =========================================================
%% [GROUP 6] 신규 기능 - 컨디션 일지 (Condition Log) (4.5)
%% =========================================================
CONDITION_LOG {
long condition_log_id PK
long user_id FK "Users"
date date
boolean is_private
double weight_kg
double sleep_hours
int sleep_quality_score "1~5"
int stress_level "1~5"
int bowel_condition_level "1~5"
int libido_level "1~5"
text injury_issue
text feedback_content
long feedback_writer_id FK
datetime feedback_modified_at
}
USERS ||--o{ CONDITION_LOG : "writes"
%% =========================================================
%% [GROUP 7] 기존 시스템 - 기타 기능 (Board, Calc, Content)
%% =========================================================
%% 공지사항 (Notice)
NOTICE {
long notice_id PK
long user_id FK "Users(Admin)"
string title
text content
string notice_category
int hits
boolean fixed
datetime created_at
datetime updated_at
}
NOTICE_ATTACHMENT {
long attachment_id PK
long notice_id FK
string origin_file_name
string stored_file_path
long file_size
}
USERS ||--o{ NOTICE : "writes"
NOTICE ||--o{ NOTICE_ATTACHMENT : "has"
%% 신고/제보 (Report)
REPORT {
long report_id PK
long user_id FK "Users"
string title
text content
string report_category
string report_status
text answer
datetime created_at
datetime updated_at
}
REPORT_ATTACHMENT {
long attachment_id PK
long report_id FK
string origin_file_name
string stored_file_path
long file_size
}
USERS ||--o{ REPORT : "writes"
REPORT ||--o{ REPORT_ATTACHMENT : "has"
%% 계산기 기록 (Calculators) - 일지와 별도로 동작하는 기존 기록
DIET_CALCULATOR {
long diet_calculator_id PK
long user_id FK
string gender
double height
double weight
int age
string activity_level
string goal
double bmr
double tdee
int recommend_calories
int recommend_carbs
int recommend_protein
int recommend_fat
datetime created_at
}
HR_CALCULATOR {
long hr_calculator_id PK
long user_id FK
int age
int resting_hr
int max_hr
string goal
string intensity
int target_hr_min
int target_hr_max
datetime created_at
}
USERS ||--o{ DIET_CALCULATOR : "calculates"
USERS ||--o{ HR_CALCULATOR : "calculates"