운동 목표 설정 기능 (FitnessGoal) - fitpassTeam/fitpass GitHub Wiki
운동 목표 설정 기능 (FitnessGoal)
개요
사용자의 체중 관리 목표(감량/증가/유지)를 설정하고 추적할 수 있는 기능입니다. 일별 체중 기록을 통해 목표 달성률을 자동으로 계산하고, 목표 달성 시 자동 완료 처리됩니다.
주요 기능
- 목표 관리: 생성, 수정, 조회, 삭제, 취소
- 체중 기록: 일별 체중 기록 및 메모 관리
- 진행률 추적: 실시간 달성률 계산 및 상태 관리
- 자동화: 만료된 목표 자동 상태 업데이트
목표 타입 및 달성 조건
목표 타입 | 설명 | 달성 조건 | 단위 |
---|---|---|---|
WEIGHT_LOSS | 체중 감량 | 현재 체중 ≤ 목표 체중 | kg |
WEIGHT_GAIN | 체중 증가 | 현재 체중 ≥ 목표 체중 | kg |
WEIGHT_MAINTAIN | 체중 유지 | 목표 체중 ±1kg 범위 내에 있는 경우 | kg |
목표 상태
상태 | 설명 | 비고 |
---|---|---|
ACTIVE | 진행중 | 수정/취소 가능 |
COMPLETED | 목표달성 | 수정/취소/삭제 불가 |
EXPIRED | 기간만료 | 종료일 경과 시 자동 변경 |
CANCELLED | 취소됨 | 사용자가 직접 취소 |
권한 승급 프로세스
목표 생성 → 체중 기록 → 진행률 자동 계산 → 달성 시 자동 완료 → 만료일 경과 시 자동 만료
목표 관리
목표 생성 필수 정보
- 목표 제목 (필수)
- 목표 타입 (WEIGHT_LOSS/WEIGHT_GAIN/WEIGHT_MAINTAIN)
- 시작 체중, 목표 체중 (양수)
- 시작일, 종료일
목표 생성 프로세스
- 입력 데이터 유효성 검증
- 목표 타입별 로직 검증
- 상태 자동 초기화 (ACTIVE/EXPIRED)
- 진행률 초기값 설정 (0%)
목표 수정
수정 가능한 정보
- 목표 제목, 설명
- 목표 체중
- 종료일
수정 제한사항
- COMPLETED 상태: 수정 불가
- CANCELLED 상태: 수정 불가
- 시작 체중, 목표 타입: 수정 불가 (데이터 일관성)
체중 기록 관리
체중 기록 생성 필수 정보
- 체중 (양수)
- 기록일
- 메모 (선택사항)
체중 기록 프로세스
- 체중 데이터 유효성 검증
- 목표의 현재 체중 업데이트
- 달성 조건 자동 체크
- 진행률 재계산
- 달성 시 COMPLETED 상태 변경
자동 달성 처리
- 감량 목표: 현재 체중 ≤ 목표 체중
- 증량 목표: 현재 체중 ≥ 목표 체중
- 유지 목표: |현재 체중 - 목표 체중| ≤ 1kg
진행률 계산 시스템
감량 목표 (WEIGHT_LOSS)
진행률 = min((시작체중 - 현재체중) / (시작체중 - 목표체중) × 100, 100)
증량 목표 (WEIGHT_GAIN)
진행률 = min((현재체중 - 시작체중) / (목표체중 - 시작체중) × 100, 100)
유지 목표 (WEIGHT_MAINTAIN)
차이 = |현재체중 - 목표체중| 진행률 = 차이 ≤ 1kg ? 100 : max(0, 100 - (차이 × 10))
스케줄러 자동화
- 실행 시간: 매일 자정 (0 0 0 * * *)
- 처리 내용: ACTIVE 상태의 만료된 목표를 EXPIRED로 자동 변경
- 로그 관리: 성공/실패 로그 기록
API 명세
목표 관리
Method | Endpoint | 설명 | 권한 |
---|---|---|---|
POST | /fitness-goals | 목표 생성 | USER+ |
GET | /fitness-goals | 내 목표 목록 조회 | USER+ |
GET | /fitness-goals/{id} | 목표 상세 조회 | USER+ |
PUT | /fitness-goals/{id} | 목표 수정 | USER+ |
PATCH | /fitness-goals/{id}/cancel | 목표 취소 | USER+ |
DELETE | /fitness-goals/{id} | 목표 삭제 | USER+ |
체중 기록 관리
Method | Endpoint | 설명 | 권한 |
---|---|---|---|
POST | /fitness-goals/{id}/weight-records | 체중 기록 생성 | USER+ |
GET | /fitness-goals/{id}/weight-records | 체중 기록 목록 조회 | USER+ |
PUT | /weight-records/{id} | 체중 기록 수정 | USER+ |
DELETE | /weight-records/{id} | 체중 기록 삭제 | USER+ |
요청/응답 예시
목표 생성 요청
{
"title": "여름 다이어트",
"description": "건강한 여름을 위한 체중 감량",
"goalType": "WEIGHT_LOSS",
"startWeight": 70.5,
"targetWeight": 65.0,
"startDate": "2024-06-01",
"endDate": "2024-08-31"
}
목표 생성 응답
{
"statusCode": 201,
"message": "목표가 성공적으로 생성되었습니다.",
"data": {
"id": 1,
"title": "여름 다이어트",
"goalType": "WEIGHT_LOSS",
"goalStatus": "ACTIVE",
"startWeight": 70.5,
"targetWeight": 65.0,
"currentWeight": null,
"progressRate": 0.0,
"startDate": "2024-06-01",
"endDate": "2024-08-31",
"createdAt": "2024-06-01T10:30:00"
}
}
비즈니스 규칙
목표 생성 제한
- 사용자당 동시 활성 목표: 제한 없음
- 종료일은 시작일 이후여야 함
- 체중은 양수여야 함
목표 수정 제한
- 수정 가능: ACTIVE, EXPIRED 상태
- 수정 불가: COMPLETED (달성 기록 보존), CANCELLED
- 수정 항목: 제목, 설명, 목표 체중, 종료일
목표 삭제 제한
- 삭제 가능: ACTIVE, EXPIRED, CANCELLED
- 삭제 불가: COMPLETED (성취 기록 보존)
체중 기록 규칙
- 목표당 일일 1회 기록 권장
- 기록 시 목표의 현재 체중 자동 업데이트
- 달성 조건 충족 시 자동 완료 처리