공모전 프로젝트: 운동 추천 및 운동 시설 추천 애플리케이션
total/
├── backend/ # 백엔드 서버 (Node.js + Express + Prisma)
│ ├── src/
│ │ ├── controllers/ # 컨트롤러 (비즈니스 로직)
│ │ ├── middleware/ # 미들웨어 (인증 등)
│ │ ├── routes/ # 라우터 (API 엔드포인트)
│ │ │ ├── auth.js # 인증 API
│ │ │ ├── weather.js # 날씨 API
│ │ │ ├── facilities.js # 시설 API
│ │ │ ├── chat.js # 챗봇 API (챗봇 시작 메뉴)
│ │ │ ├── exercise.js # 운동 API (Python 서버 프록시)
│ │ │ ├── stretch.js # 스트레칭 API (Python 서버 프록시)
│ │ │ └── music.js # 음악 추천 API (Python 서버 프록시)
│ │ ├── services/ # 서비스 레이어
│ │ │ ├── authService.js
│ │ │ └── pythonClient.js # Python FastAPI 서버 호출 클라이언트
│ │ └── prismaClient.js # Prisma 클라이언트
│ ├── prisma/ # Prisma 스키마
│ ├── public/ # 정적 파일 (프론트엔드 빌드 결과물)
│ └── server.js # 서버 진입점
│
├── frontend/ # 프론트엔드 (Vue 3 + Vite + TailwindCSS)
│ ├── src/
│ │ ├── components/ # Vue 컴포넌트
│ │ │ ├── signup/ # 회원가입 컴포넌트
│ │ │ ├── BottomNav.vue # 하단 네비게이션 (챗봇용)
│ │ │ └── QuickButtons.vue # 빠른 버튼 (챗봇용)
│ │ ├── views/ # 페이지 뷰
│ │ │ ├── LoginView.vue
│ │ │ ├── DashboardView.vue
│ │ │ ├── Chatbot.vue # 챗봇 페이지
│ │ │ ├── ExerciseList.vue # 운동 리스트 페이지
│ │ │ ├── Stretching.vue # 스트레칭 페이지
│ │ │ ├── Records.vue # 기록 페이지
│ │ │ ├── Stats.vue # 통계 페이지
│ │ │ └── Profile.vue # 프로필 페이지
│ │ ├── router/ # Vue Router 설정
│ │ └── assets/ # 정적 리소스
│ └── docs/ # 문서
│
├── fitmap_ai/ # Python FastAPI 서버 (챗봇 AI 기능)
│ ├── main.py # FastAPI 앱 진입점
│ ├── database/
│ │ └── connection.py # MySQL 데이터베이스 연결
│ ├── routers/ # API 라우터
│ │ ├── exercise.py # 운동 관련 API
│ │ ├── stretch.py # 스트레칭 관련 API
│ │ └── music.py # 음악 추천 API
│ ├── services/ # 비즈니스 로직
│ │ ├── exercises.py # 운동 데이터 조회
│ │ ├── stretch.py # 스트레칭 데이터 조회
│ │ └── deezer.py # Deezer API 음악 추천
│ └── requirements.txt # Python 의존성
│
└── package.json # 루트 스크립트 (빌드 & 실행)
cd total
npm install
npm start이 명령어는 다음을 동시에 실행합니다:
- Python FastAPI 서버 (포트 8000) - 챗봇 AI 기능
- Node.js 백엔드 서버 (포트 3000) - 메인 API 서버
- Vue.js 프론트엔드 개발 서버 (포트 5173) - 프론트엔드
💡 참고:
concurrently패키지를 사용하여 세 서비스를 동시에 실행합니다.
npm run dev개발 모드에서는:
- Python 서버: 자동 재시작 (--reload)
- 백엔드 서버: nodemon으로 자동 재시작
- 프론트엔드: Vite HMR (Hot Module Replacement)
cd fitmap_ai
pip install -r requirements.txt
python -m uvicorn main:app --host 0.0.0.0 --port 8000 --reloadcd backend
npm install
npm run dev # 개발 모드 (nodemon)
# 또는
npm start # 프로덕션 모드cd frontend
npm install
npm run dev # 개발 서버- Node.js 20+
- Express.js - HTTP 서버 & 라우팅
- Prisma ORM - MySQL 접근용 ORM
- MySQL - 데이터베이스 (Railway)
- JWT - 인증 토큰
- axios - Python 서버 호출용
- Vue 3 - 프론트엔드 프레임워크
- Vite - 빌드 도구
- Vue Router - 라우팅
- TailwindCSS - 스타일링
- axios - API 호출
- Python 3.8+
- FastAPI - 고성능 Python 웹 프레임워크
- Uvicorn - ASGI 서버
- PyMySQL - MySQL 데이터베이스 연결
- Requests - 외부 API 호출 (Deezer 등)
- ✅ 회원가입/로그인
- ✅ 날씨 정보 조회
- ✅ 운동 시설 정보 조회
- ✅ 챗봇 인터페이스 - 대화형 운동 추천
- ✅ 운동 리스트 조회 - 부위별/카테고리별 운동 검색
- ✅ 스트레칭 정보 - 부위별 스트레칭 가이드
- ✅ 음악 추천 - 운동 종류별 맞춤 음악 추천 (Deezer API 연동)
# 데이터베이스 연결 (Prisma용)
DATABASE_URL="mysql://root:123456@localhost:3306/fitness_app"
# JWT 인증
JWT_SECRET="your_jwt_secret_key_here"
# 외부 API 키
KMA_API_KEY="your_kma_api_key"
PUBLIC_DATA_API_KEY="your_public_data_api_key"
# Python 서버 URL (챗봇 AI 서버)
PYTHON_BASE_URL="http://localhost:8000"
# 백엔드 서버 포트 (선택사항, 기본값: 3000)
PORT=3000원본 챗봇 폴더의 .env 파일 내용을 바탕으로 생성되었습니다:
# MySQL 데이터베이스 연결 정보
# 백엔드와 같은 데이터베이스를 사용합니다
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=123456
DB_NAME=fitness_app✅ 완료:
total/fitmap_ai/.env파일이 생성되었습니다.
⚠️ 중요:
- Python 서버는 별도의
.env파일이 필요합니다.fitmap_ai폴더에.env파일을 생성하세요.- 백엔드와 같은 데이터베이스를 사용하지만, 연결 방식이 다릅니다:
- 백엔드: Prisma ORM 사용 (
DATABASE_URL형식)- Python 서버: PyMySQL 직접 연결 (개별 환경 변수 사용)
- 원본 폴더의
.env파일이 있다면 그대로 복사해서 사용하세요.
cd total
npm run install:all또는 개별 설치:
cd backend && npm install
cd ../frontend && npm installcd total
npm run install:python또는 직접 설치:
cd fitmap_ai
pip install -r requirements.txtbackend/.env파일 생성 및 설정fitmap_ai/.env파일 생성 및 설정
cd backend
npx prisma generatefitmap_ai는 챗봇의 AI 기능을 제공하는 Python FastAPI 서버입니다.
- 운동 데이터 조회: MySQL 데이터베이스에서 운동 정보를 조회
- 스트레칭 정보 제공: 유연성 운동 데이터 조회
- 음악 추천: Deezer API를 통한 운동별 맞춤 음악 추천
- FastAPI: 비동기 고성능 웹 프레임워크
- PyMySQL: MySQL 데이터베이스 직접 연결
- RESTful API: Node.js 백엔드에서 프록시로 호출
프론트엔드 (Vue)
↓
백엔드 (Express) - /api/exercise, /api/stretch, /api/music
↓
Python 서버 (FastAPI) - /exercise, /stretch, /music
↓
MySQL 데이터베이스
GET /api/chat/start- 챗봇 시작 메뉴GET /api/exercise/menu- 운동 리스트 메뉴GET /api/exercise/body-parts- 부위별 운동 리스트GET /api/exercise/categories- 카테고리별 운동 리스트GET /api/exercise/by-body?part={부위}- 특정 부위 운동 조회GET /api/exercise/by-category?category={카테고리}- 특정 카테고리 운동 조회GET /api/exercise/detail?name={운동명}- 운동 상세 정보GET /api/stretch/body-parts- 스트레칭 부위 리스트GET /api/stretch/by-body?part={부위}- 특정 부위 스트레칭 조회GET /api/stretch/detail?name={스트레칭명}- 스트레칭 상세 정보GET /api/music/types- 음악 추천 운동 종류GET /api/music/moods- 음악 분위기 리스트POST /api/music/recommend- 음악 추천 (body: {category, mood})
GET /exercise/body-parts- 부위 리스트GET /exercise/by-body?part={부위}- 부위별 운동GET /exercise/categories- 카테고리 리스트GET /exercise/by-category?category={카테고리}- 카테고리별 운동GET /exercise/detail?name={운동명}&weight={체중}- 운동 상세GET /stretch/body-parts- 스트레칭 부위 리스트POST /stretch/by-body- 부위별 스트레칭 (body: {part})POST /stretch/detail- 스트레칭 상세 (body: {name})GET /music/types- 운동 종류 리스트GET /music/moods- 분위기 리스트POST /music/recommend- 음악 추천 (body: {category, mood})
fitmap_ai/.env파일이 존재하는지 확인- 데이터베이스 연결 정보가 올바른지 확인:
DB_HOST=localhost DB_USER=root DB_PASSWORD=your_password DB_NAME=fitness_app
- MySQL 서버가 실행 중인지 확인
- 데이터베이스가 존재하는지 확인
backend/.env파일의DATABASE_URL확인- Prisma 클라이언트 재생성:
cd backend npx prisma generate
-
Python이 설치되어 있는지 확인:
python --version
-
의존성이 설치되어 있는지 확인:
cd fitmap_ai pip install -r requirements.txt -
포트 8000이 사용 중인지 확인
- 백엔드 서버가 실행 중인지 확인 (포트 3000)
- Python 서버가 실행 중인지 확인 (포트 8000)
- Vite 프록시 설정 확인 (
frontend/vite.config.js)
- 챗봇 기능 통합:
suhyeon/cb_pyv프로젝트의 챗봇 기능을total프로젝트에 통합 - Python FastAPI 서버 추가:
fitmap_ai폴더로 챗봇 AI 기능 제공 - 프론트엔드 통합: 챗봇 페이지 및 컴포넌트 추가
- 백엔드 통합: 챗봇 API 라우트 및 Python 서버 프록시 추가
포트:
- 프론트엔드: 5173
- 백엔드: 3000
- Python 서버: 8000