Skip to content

Repository files navigation

👥 Team 𝒜𝓂𝓊𝓇𝒶𝑒𝒹𝑜 팀원 소개

정규원

김성은

김윤경

이경민

임재열

🏋️‍♀️ 운할 (Woonhal) - What if I hadn't skipped my workout?

Spring Boot React Java Gradle

🎯 "당신의 '운동할걸…'을 '운동했다!'로 바꿔드립니다."

후회마저 기록하는 역발상 피트니스 플래너

운동하지 않은 날의 '기회비용'을 기록하는 심리 기반 역발상 피트니스 플래너

서비스 소개 • 핵심 기능 • 기술 스택 • 시작하기 • API 문서


📖 서비스 소개

"기존 헬스 앱이 '신체의 움직임'을 관리했다면, 운할은 움직이지 못하게 만드는 '마음의 저항'을 관리합니다."

**운할(Woonhal)**은 "운동할걸.."이라는 후회에서 시작된 역발상 피트니스 플래너입니다.

기존 운동 앱들이 '성취'만 기록하는 것과 달리, 운할은 운동하지 않은 날의 기회비용을 데이터로 시각화하여 사용자에게 강력한 동기를 부여합니다.

💡 왜 '안 한 날'을 기록하는가?

문제점 운할의 해결책
생존 편향 - 대부분의 앱은 '성취'만 기록하여 작심삼일러의 회피 심리 유발 공백기도 데이터화하여 지속적인 방문 유도
동기 부여 한계 - "운동하면 건강해져요"는 행동 유도에 약함 손실 회피 심리 활용 - "오늘 쉬면 치킨 한 마리 칼로리를 태울 기회를 잃습니다"
휘발성 후회 - "운동할걸.."이라는 감정은 금방 사라짐 감정의 데이터화 - 후회를 '놓친 칼로리', '근성장 기회비용'으로 박제

🎯 핵심 가치

키워드 설명
📉 역발상 기록 성취뿐만 아니라 실패(Inaction)와 '포기'까지 기록하여 데이터의 연속성 확보
💸 손실의 시각화 운동을 건너뛴 대가(기회비용)를 수치로 환산하여 현실 자각 유도
🛡 심리적 안전지대 "나만 안 한 게 아니다"는 위로를 주는 익명 실패 공유 커뮤니티
🔄 회복 탄력성 죄책감에 매몰되지 않도록, 다음 주 계획으로 손실을 만회하는 재도전 루틴 설계

👥 타겟 페르소나

"마음만은 태릉인, 몸은 침대 위인 당신을 위해"

  • 합리화 대장 - "오늘 야근했으니까.." 핑계를 찾는 사용자에게 팩트(데이터)로 반박해줄 툴이 필요한 사람
  • 유리멘탈 - 하루만 빠져도 "이번 생은 망했어" 포기하는 완벽주의자에게, "실패도 과정임"을 보여주는 기록이 필요한 사람
  • 오운완 박탈감형 - SNS의 완벽한 몸매 자랑에 지쳐, 현실적인 사람들의 솔직한 실패담으로 위로받고 싶은 사람

✨ 핵심 기능

📅 기회비용 플래너

  • 주간 운동 계획 수립 및 수행 여부 체크 (✅/❌)
  • 미달성 체크 시, "오늘 놓친 운동 효과"가 즉시 계산되어 표시
  • 운동 종류, 유산소/무산소, 난이도, 운동 부위 선택

📊 What-if 시뮬레이터

  • "운동을 안 한 날"의 데이터를 기반으로 가정 시나리오 분석
  • 실제 소모 칼로리 vs 계획대로 했다면 소모됐을 칼로리 비교 차트
  • "1주일동안 운동을 이정도했다면 살은 2kg가 빠졌을 것" 등의 구체적 메시지

📈 주간 리포트

  • 매주 지난주의 '성취'와 '손실'을 정산하는 리포트 발행
  • 데이터 기반의 목표 수정 유도
  • "이번 주는 3000kcal를 놓쳤으니, 다음 주는 강도를 높이자" 등의 피드백

🏆 운동 통계 & 랭킹

  • 주간 운동 시간 및 칼로리 소모량 집계
  • 사용자 간 랭킹 시스템으로 경쟁 유도
  • 날짜별 통계 검색

💬 Q&A 커뮤니티

  • 트레이너에게 질문 등록
  • 트레이너 전용 답변 시스템
  • 답변 등록 시 실시간 알림 발송

📱 소셜 피드

  • 이미지 포함 게시글 작성
  • 제목, 내용, 사용자ID 기반 검색
  • 본인 게시글 수정/삭제

🍽️ 식단 관리

  • 아침/점심/저녁/간식 식단 등록
  • 음식 종류 및 칼로리 기록
  • 식단 조회/수정/삭제

🔔 실시간 알림

  • Q&A 답변 등록 알림
  • 읽음/미읽음 상태 관리

📊 시장 포지셔닝

구분 기존 운동 앱 (플랜핏, 번핏, 삼성헬스) 운할 (Woonhal)
기록 대상 운동한 날 (Action) 운동 안 한 날 (Inaction) 까지 포함
동기 부여 성취감, 뱃지, 긍정 강화 손실 회피, 기회비용, 현실 자각
주요 감정 뿌듯함, 자랑 아쉬움, 오기, 공감
접근 방식 신체 관리 (Physical) 심리/멘탈 관리 (Psychological)

🛠 기술 스택

Backend

기술 버전 설명
Java 17 프로그래밍 언어
Spring Boot 3.5.8 애플리케이션 프레임워크
Spring Cloud Gateway - API Gateway
Netflix Eureka - Service Discovery
Spring Data JPA - ORM
JWT - 인증 토큰
MinIO - 파일 저장소

Frontend

기술 버전 설명
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 라우팅

Testing

기술 설명
JUnit 5 백엔드 단위 테스트
Vitest 프론트엔드 테스트
Testing Library React 컴포넌트 테스트
Fast-check Property-Based Testing

📜 설계 문서

DDD 설계 문서

image

요구사항 명세서

image

ERD

image

🏗 시스템 아키텍처

MSA 구조도

Web_App_Reference_Architecture_1
┌─────────────────────────────────────────────────────────────────┐
│                        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 (파일 저장소)

Backend 실행

# 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
# ... 나머지 서비스들

Frontend 실행

cd frontend

# 의존성 설치
npm install

# 개발 서버 실행
npm run dev

테스트 실행

# Backend 테스트
./gradlew test

# Frontend 테스트
cd frontend
npm run test

WBS

image

📚 API 문서

각 서비스는 Swagger UI를 통해 API 문서를 제공합니다.

API 명세서 : API 명세서.pdf

주요 API 엔드포인트

인증

POST /auth/signup     - 회원가입 (일반 사용자/트레이너 구분)
POST /auth/login      - 로그인
POST /auth/logout     - 로그아웃

운동 계획

POST   /workoutplan              - 운동 계획 등록
GET    /workoutplan/{date}       - 일별 계획 조회
PATCH  /workoutplan/{planId}     - 계획 수정
DELETE /workoutplan/{planId}     - 계획 삭제

What-if 리포트

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     - 주간 칼로리 랭킹

Q&A

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/    # 운동 계획

👥 개발 규칙

Code Convention

  • 패키지: 소문자 사용
  • 클래스: Upper CamelCase
  • 메서드/변수: Lower CamelCase
  • 상수: UPPER_SNAKE_CASE

Commit Convention

[feat] #이슈번호 새로운 기능 구현
[fix] #이슈번호 버그 수정
[refactor] #이슈번호 코드 리팩터링
[docs] #이슈번호 문서 수정
[test] #이슈번호 테스트 코드 작성
[chore] #이슈번호 설정 변경

Branch Strategy

  • main: 배포 브랜치
  • develop: 개발 브랜치
  • feature/{이슈번호}-{기능명}: 기능 개발 브랜치

📊 프로젝트 성과

  • 마이크로서비스: 10개 독립 서비스
  • API 엔드포인트: 30+ RESTful API
  • 프론트엔드 페이지: 9개 주요 페이지
  • 재사용 컴포넌트: 15+ React 컴포넌트

📄 라이선스

이 프로젝트는 MIT 라이선스를 따릅니다.


🏋️‍♀️ "당신의 '운동할걸…'을 '운동했다!'로 바꿔드립니다."

Made with ❤️ by Team 3

About

백엔드 단위 플젝 레포입니다.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages