!theme mono skinparam classAttributeIconSize 0 skinparam classFontSize 12 skinparam classAttributeFontSize 11 title HealthSync 역설계 - Goal Service 데이터 설계서 package "Goal Service Database Schema" as goal_db #lightcoral { entity "user_mission_goals" as user_mission_goal { * goal_id : VARCHAR(50) <> -- * user_id : VARCHAR(50) * is_active : BOOLEAN * created_at : TIMESTAMP * updated_at : TIMESTAMP -- + 인덱스: idx_user_id_active + 인덱스: idx_created_at } entity "user_missions" as user_mission { * id : BIGINT <> -- * goal_id : VARCHAR(50) <> * user_id : VARCHAR(50) * mission_id : VARCHAR(50) * mission_title : VARCHAR(200) * mission_description : TEXT * category : VARCHAR(50) * difficulty : VARCHAR(20) * estimated_time_minutes : INTEGER * is_active : BOOLEAN * current_streak_days : INTEGER * total_completed_count : INTEGER * start_date : DATE * created_at : TIMESTAMP * updated_at : TIMESTAMP -- + 인덱스: idx_goal_id + 인덱스: idx_user_id_active + 인덱스: idx_mission_id + 인덱스: idx_category + 인덱스: idx_start_date } entity "mission_progress" as mission_progress { * id : BIGINT <> -- * user_id : VARCHAR(50) * mission_id : VARCHAR(50) <> * completed_at : TIMESTAMP * notes : TEXT * earned_points : INTEGER * consecutive_days : INTEGER * created_at : TIMESTAMP -- + 인덱스: idx_user_mission_date + 인덱스: idx_completed_at + 인덱스: idx_mission_id + 인덱스: idx_earned_points } entity "mission_completion_history" as mission_completion_history { * id : BIGINT <> -- * user_id : VARCHAR(50) * mission_id : VARCHAR(50) * goal_id : VARCHAR(50) * completion_date : DATE * completion_time : TIME * completion_status : VARCHAR(20) * notes : TEXT * earned_points : INTEGER * streak_days_at_completion : INTEGER * created_at : TIMESTAMP -- + 인덱스: idx_user_id_date + 인덱스: idx_mission_completion + 인덱스: idx_goal_id_date } note right of user_mission_goal **사용자 목표 관리** • 사용자별 목표 설정 단위 • 한 번에 하나의 활성 목표만 가능 • 목표 재설정 시 기존 목표 비활성화 • goal_id는 UUID 형태로 생성 end note note right of user_mission **사용자별 미션 정보** • 목표에 포함된 개별 미션들 • Intelligence Service에서 추천받은 미션 • 최대 5개 미션까지 선택 가능 • 난이도별 포인트 차등 적용 • 연속 달성 일수 추적 end note note right of mission_progress **미션 수행 기록** • 일별 미션 완료 기록 • 같은 날 중복 완료 방지 • 연속 달성 일수 계산 기준 • 포인트 적립 내역 end note note right of mission_completion_history **미션 완료 이력 (분석용)** • 장기간 통계 분석용 테이블 • 사용자별 달성 패턴 분석 • 미션별 효과성 분석 • 시간대별 완료 패턴 추적 end note } package "관계 정의" as relationships { user_mission_goal ||--o{ user_mission : goal_id user_mission ||--o{ mission_progress : mission_id user_mission ||--o{ mission_completion_history : mission_id user_mission_goal ||--o{ mission_completion_history : goal_id note as n1 **외래키 관계** user_missions.goal_id → user_mission_goals.goal_id mission_progress.mission_id → user_missions.mission_id mission_completion_history.mission_id → user_missions.mission_id mission_completion_history.goal_id → user_mission_goals.goal_id **참조 무결성** • CASCADE 업데이트 • RESTRICT 삭제 (이력 보존) **논리적 관계** • User Service users ↔ user_mission_goals (사용자별 목표) • Intelligence Service ↔ user_missions (미션 추천) • 한 사용자는 하나의 활성 목표만 보유 • 하나의 목표는 여러 미션을 포함 end note } package "데이터 타입 및 제약조건" as constraints { note as n2 **user_mission_goals 제약조건** • goal_id: UUID 형태, PRIMARY KEY • user_id: User Service와 일치, NOT NULL • is_active: DEFAULT TRUE • 사용자당 활성 목표는 1개만 (UNIQUE 제약) **user_missions 제약조건** • id: AUTO_INCREMENT • goal_id: NOT NULL, 존재하는 goal_id • mission_id: Intelligence Service에서 제공 • mission_title: 최대 200자, NOT NULL • category: 'EXERCISE', 'NUTRITION', 'STRESS_MANAGEMENT', 'SLEEP', 'PREVENTIVE_CARE' • difficulty: 'EASY', 'MEDIUM', 'HARD' • estimated_time_minutes: 1~180분 범위 • current_streak_days: 0 이상 • total_completed_count: 0 이상 • 목표당 최대 5개 미션 (체크 제약) **mission_progress 제약조건** • id: AUTO_INCREMENT • user_id: NOT NULL • mission_id: 존재하는 mission_id • completed_at: NOT NULL • earned_points: 0 이상 • consecutive_days: 1 이상 • 같은 날 같은 미션 중복 완료 방지 (UNIQUE 제약) **mission_completion_history 제약조건** • completion_status: 'COMPLETED', 'PARTIAL', 'SKIPPED' • earned_points: 0 이상 • streak_days_at_completion: 0 이상 • completion_time: 00:00~23:59 end note } package "미션 카테고리 및 난이도" as mission_categories { note as n3 **미션 카테고리별 예시** **EXERCISE (운동)** • 계단 오르기 10분 • 산책 30분 • 스트레칭 15분 • 홈트레이닝 20분 **NUTRITION (영양)** • 물 8잔 마시기 • 금연하기 • 금주하기 • 건강한 간식 선택 **STRESS_MANAGEMENT (스트레스 관리)** • 명상 10분 • 심호흡 연습 • 일기 쓰기 • 취미 시간 갖기 **SLEEP (수면)** • 규칙적인 취침시간 • 11시 전 잠들기 • 수면 8시간 유지 • 카페인 섭취 줄이기 **PREVENTIVE_CARE (예방관리)** • 혈압 측정하기 • 체중 기록하기 • 건강검진 예약 • 병원 방문하기 **난이도별 포인트** • EASY: 10~20 포인트 • MEDIUM: 25~40 포인트 • HARD: 50~80 포인트 • 연속 달성 보너스: +5 포인트/일 end note } package "성능 및 운영 고려사항" as performance { note as n4 **인덱스 전략** • user_mission_goals: (user_id, is_active) 복합 인덱스 • user_missions: (user_id, is_active) 복합 인덱스 • mission_progress: (user_id, mission_id, DATE(completed_at)) 복합 인덱스 • mission_completion_history: (user_id, completion_date) 복합 인덱스 **파티셔닝** • mission_progress: completed_at 기준 월별 파티셔닝 • mission_completion_history: completion_date 기준 월별 파티셔닝 **아카이빙** • 1년 이상 된 mission_progress 데이터 아카이빙 • 비활성 목표 데이터는 history 테이블로 이관 **캐싱 전략** • 활성 미션 목록: Redis 캐싱 (30분) • 오늘 완료한 미션: Redis 캐싱 (실시간) • 연속 달성 일수: Redis 캐싱 (6시간) • 미션별 통계: Redis 캐싱 (1시간) **배치 처리** • 매일 자정에 연속 달성 일수 재계산 • 주간/월간 달성률 통계 생성 • 장기 미완료 미션 알림 발송 **모니터링 지표** • 일일 미션 완료율 • 평균 연속 달성 일수 • 카테고리별 인기도 • 사용자별 참여율 • 목표 재설정 빈도 end note } package "데이터 분석 및 인사이트" as analytics { note as n5 **사용자 행동 분석** • 미션 완료 시간대 패턴 • 요일별 달성률 차이 • 연속 달성 중단 요인 분석 • 난이도별 지속 가능성 **미션 효과성 분석** • 카테고리별 건강 개선 효과 • 직업군별 선호 미션 유형 • 연령대별 적합한 미션 난이도 • 계절별 미션 선호도 변화 **개인화 추천 개선** • 과거 달성 패턴 기반 추천 • 유사 사용자 그룹 분석 • 실패 미션 유형 회피 • 성공 확률 높은 미션 우선 추천 **동기부여 전략** • 포인트 시스템 효과성 • 연속 달성 보상 최적화 • 사회적 비교 효과 분석 • 축하 메시지 반응 측정 **KPI 지표** • 월간 활성 사용자 수 (MAU) • 평균 목표 지속 기간 • 미션 완료율 (전체/개인별) • 사용자 리텐션율 • 건강 개선 지표 상관관계 end note }