- GitHub: https://github.com/Gyuwon-Jung
- GitHub: https://github.com/rlatjddms
- GitHub: https://github.com/kyk5095
- GitHub: https://github.com/LKM1027
- GitHub: https://github.com/Jae-yeol1
후회마저 기록하는 역발상 피트니스 플래너
운동하지 않은 날의 '기회비용'을 기록하는 심리 기반 역발상 피트니스 플래너
"기존 헬스 앱이 '신체의 움직임'을 관리했다면, 운할은 움직이지 못하게 만드는 '마음의 저항'을 관리합니다."
**운할(Woonhal)**은 "운동할걸.."이라는 후회에서 시작된 역발상 피트니스 플래너입니다.
기존 운동 앱들이 '성취'만 기록하는 것과 달리, 운할은 운동하지 않은 날의 기회비용을 데이터로 시각화하여 사용자에게 강력한 동기를 부여합니다.
| 문제점 | 운할의 해결책 |
|---|---|
| 생존 편향 - 대부분의 앱은 '성취'만 기록하여 작심삼일러의 회피 심리 유발 | 공백기도 데이터화하여 지속적인 방문 유도 |
| 동기 부여 한계 - "운동하면 건강해져요"는 행동 유도에 약함 | 손실 회피 심리 활용 - "오늘 쉬면 치킨 한 마리 칼로리를 태울 기회를 잃습니다" |
| 휘발성 후회 - "운동할걸.."이라는 감정은 금방 사라짐 | 감정의 데이터화 - 후회를 '놓친 칼로리', '근성장 기회비용'으로 박제 |
| 키워드 | 설명 |
|---|---|
| 📉 역발상 기록 | 성취뿐만 아니라 실패(Inaction)와 '포기'까지 기록하여 데이터의 연속성 확보 |
| 💸 손실의 시각화 | 운동을 건너뛴 대가(기회비용)를 수치로 환산하여 현실 자각 유도 |
| 🛡 심리적 안전지대 | "나만 안 한 게 아니다"는 위로를 주는 익명 실패 공유 커뮤니티 |
| 🔄 회복 탄력성 | 죄책감에 매몰되지 않도록, 다음 주 계획으로 손실을 만회하는 재도전 루틴 설계 |
"마음만은 태릉인, 몸은 침대 위인 당신을 위해"
- 합리화 대장 - "오늘 야근했으니까.." 핑계를 찾는 사용자에게 팩트(데이터)로 반박해줄 툴이 필요한 사람
- 유리멘탈 - 하루만 빠져도 "이번 생은 망했어" 포기하는 완벽주의자에게, "실패도 과정임"을 보여주는 기록이 필요한 사람
- 오운완 박탈감형 - SNS의 완벽한 몸매 자랑에 지쳐, 현실적인 사람들의 솔직한 실패담으로 위로받고 싶은 사람
- 주간 운동 계획 수립 및 수행 여부 체크 (✅/❌)
- 미달성 체크 시, "오늘 놓친 운동 효과"가 즉시 계산되어 표시
- 운동 종류, 유산소/무산소, 난이도, 운동 부위 선택
- "운동을 안 한 날"의 데이터를 기반으로 가정 시나리오 분석
- 실제 소모 칼로리 vs 계획대로 했다면 소모됐을 칼로리 비교 차트
- "1주일동안 운동을 이정도했다면 살은 2kg가 빠졌을 것" 등의 구체적 메시지
- 매주 지난주의 '성취'와 '손실'을 정산하는 리포트 발행
- 데이터 기반의 목표 수정 유도
- "이번 주는 3000kcal를 놓쳤으니, 다음 주는 강도를 높이자" 등의 피드백
- 주간 운동 시간 및 칼로리 소모량 집계
- 사용자 간 랭킹 시스템으로 경쟁 유도
- 날짜별 통계 검색
- 트레이너에게 질문 등록
- 트레이너 전용 답변 시스템
- 답변 등록 시 실시간 알림 발송
- 이미지 포함 게시글 작성
- 제목, 내용, 사용자ID 기반 검색
- 본인 게시글 수정/삭제
- 아침/점심/저녁/간식 식단 등록
- 음식 종류 및 칼로리 기록
- 식단 조회/수정/삭제
- Q&A 답변 등록 알림
- 읽음/미읽음 상태 관리
| 구분 | 기존 운동 앱 (플랜핏, 번핏, 삼성헬스) | 운할 (Woonhal) |
|---|---|---|
| 기록 대상 | 운동한 날 (Action) | 운동 안 한 날 (Inaction) 까지 포함 |
| 동기 부여 | 성취감, 뱃지, 긍정 강화 | 손실 회피, 기회비용, 현실 자각 |
| 주요 감정 | 뿌듯함, 자랑 | 아쉬움, 오기, 공감 |
| 접근 방식 | 신체 관리 (Physical) | 심리/멘탈 관리 (Psychological) |
| 기술 | 버전 | 설명 |
|---|---|---|
| Java | 17 | 프로그래밍 언어 |
| Spring Boot | 3.5.8 | 애플리케이션 프레임워크 |
| Spring Cloud Gateway | - | API Gateway |
| Netflix Eureka | - | Service Discovery |
| Spring Data JPA | - | ORM |
| JWT | - | 인증 토큰 |
| MinIO | - | 파일 저장소 |
| 기술 | 버전 | 설명 |
|---|---|---|
| React | 19.2.0 | UI 라이브러리 |
| Vite | 7.2.4 | 빌드 도구 |
| Zustand | 5.0.9 | 상태 관리 |
| Axios | 1.13.2 | HTTP 클라이언트 |
| Recharts | 3.5.1 | 데이터 시각화 |
| Styled Components | 6.1.19 | CSS-in-JS |
| React Router DOM | 7.10.1 | 라우팅 |
| 기술 | 설명 |
|---|---|
| JUnit 5 | 백엔드 단위 테스트 |
| Vitest | 프론트엔드 테스트 |
| Testing Library | React 컴포넌트 테스트 |
| Fast-check | Property-Based Testing |
┌─────────────────────────────────────────────────────────────────┐
│ Frontend (React) │
│ http://localhost:5173 │
└─────────────────────────────┬───────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ API Gateway Service │
│ http://localhost:8000 │
│ (JWT 인증 필터, 라우팅, CORS) │
└─────────────────────────────┬───────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Eureka Server │
│ http://localhost:8761 │
│ (Service Discovery) │
└─────────────────────────────┬───────────────────────────────────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ member-service│ │ feed-service │ │ qna-service │
│ :8081 │ │ :8082 │ │ :8083 │
└───────────────┘ └───────────────┘ └───────────────┘
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ stats-service │ │report-service │ │notification- │
│ :8084 │ │ :8085 │ │ service │
└───────────────┘ └───────────────┘ └───────────────┘
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│dietplan- │ │workoutplan- │ │ MinIO │
│ service │ │ service │ │ (File Storage)│
└───────────────┘ └───────────────┘ └───────────────┘
| 서비스 | 포트 | 설명 |
|---|---|---|
| eureka-server | 8761 | 서비스 디스커버리 |
| gateway-service | 8000 | API Gateway |
| member-service | 8081 | 회원 관리, 인증 |
| feed-service | 8082 | 소셜 피드 |
| qna-service | 8083 | Q&A 커뮤니티 |
| stats-service | 8084 | 운동 통계, 랭킹 |
| report-service | 8085 | What-if 분석 리포트 |
| notification-service | 8086 | 알림 관리 |
| dietplan-service | 8087 | 식단 관리 |
| workoutplan-service | 8088 | 운동 계획 관리 |
- Java 17+
- Node.js 18+
- Gradle 8+
- Redis
- MinIO (파일 저장소)
# 1. 프로젝트 클론
git clone https://github.com/your-repo/woonhal.git
cd woonhal
# 2. Eureka Server 실행
cd eureka-server
./gradlew bootRun
# 3. Gateway Service 실행 (새 터미널)
cd gateway-service
./gradlew bootRun
# 4. 각 마이크로서비스 실행 (새 터미널)
cd member-service && ./gradlew bootRun
cd feed-service && ./gradlew bootRun
cd qna-service && ./gradlew bootRun
# ... 나머지 서비스들cd frontend
# 의존성 설치
npm install
# 개발 서버 실행
npm run dev# Backend 테스트
./gradlew test
# Frontend 테스트
cd frontend
npm run test
각 서비스는 Swagger UI를 통해 API 문서를 제공합니다.
API 명세서 : API 명세서.pdf
POST /auth/signup - 회원가입 (일반 사용자/트레이너 구분)
POST /auth/login - 로그인
POST /auth/logout - 로그아웃
POST /workoutplan - 운동 계획 등록
GET /workoutplan/{date} - 일별 계획 조회
PATCH /workoutplan/{planId} - 계획 수정
DELETE /workoutplan/{planId} - 계획 삭제
POST /report/last-week-report - 주간 리포트 생성
GET /report/all-report - 전체 리포트 조회
GET /report/search-report/{date} - 날짜별 리포트 검색
GET /stats/user-stats - 개인 통계
GET /stats/last-week-time-ranking - 주간 운동시간 랭킹
GET /stats/last-week-calorie-ranking - 주간 칼로리 랭킹
POST /question - 질문 작성
GET /question/search - 질문 검색
POST /answer - 답변 등록 (트레이너)
- Auth Service
- 회원가입 및 로그인 시나리오 검증 (성공, 중복 ID, 비밀번호 불일치 등 예외 처리)
- JWT 발급 및 Redis Blacklist를 이용한 로그아웃 로직 검증
- Community Service (Feed & Question)
- 게시글 및 질문의 CRUD 기능 정상 동작 확인
- 작성자 권한 검증 및 답변 상태 변경에 따른 수정/삭제 제약 조건 테스트
- 키워드 검색 및 내 질문 조회 기능 검증
- Data Analysis (Stats & Report)
- 사용자별 주간/월간 리포트 생성 및 조회 로직 검증
- 날짜별 운동량 및 칼로리 소모량 랭킹 집계 정확도 테스트
- 통계 데이터 생성 및 날짜 기반 필터링 기능 확인
- etc..
woonhal/
├── eureka-server/ # Service Discovery
├── gateway-service/ # API Gateway
├── member-service/ # 회원 관리
├── feed-service/ # 소셜 피드
├── qna-service/ # Q&A 커뮤니티
├── stats-service/ # 운동 통계
├── report-service/ # What-if 리포트
├── notification-service/ # 알림
├── dietplan-service/ # 식단 관리
├── workoutplan-service/ # 운동 계획
- 패키지: 소문자 사용
- 클래스: Upper CamelCase
- 메서드/변수: Lower CamelCase
- 상수: UPPER_SNAKE_CASE
[feat] #이슈번호 새로운 기능 구현
[fix] #이슈번호 버그 수정
[refactor] #이슈번호 코드 리팩터링
[docs] #이슈번호 문서 수정
[test] #이슈번호 테스트 코드 작성
[chore] #이슈번호 설정 변경
main: 배포 브랜치develop: 개발 브랜치feature/{이슈번호}-{기능명}: 기능 개발 브랜치
- 마이크로서비스: 10개 독립 서비스
- API 엔드포인트: 30+ RESTful API
- 프론트엔드 페이지: 9개 주요 페이지
- 재사용 컴포넌트: 15+ React 컴포넌트
이 프로젝트는 MIT 라이선스를 따릅니다.