한성대학교 헬스장 통합 관리 시스템의 백엔드 API 서버입니다.
- 회원 가입 및 로그인 (JWT 인증)
- 프로필 관리 (학번, 이름, 연락처, 학과, 학년)
- 역할 기반 권한 관리 (일반회원, 강사, 멘토, 멘티)
- 실시간 입/퇴장 기록
- 현재 헬스장 이용 인원 조회 (혼잡도)
- 출석 기반 포인트 자동 적립
- 운동 종목별 기록 관리
- 운동 시간 및 칼로리 추적
- 운동 기록 기반 포인트 적립
- 식사 기록 (아침/점심/저녁/간식)
- 칼로리 계산 및 추적
- 식단 기록 기반 포인트 적립
- 개인 목표 설정
- 목표 달성률 추적
- 목표 달성 시 포인트 보상
- 활동 기반 포인트 자동 적립
- 포인트 교환 상품 관리
- 포인트 사용 내역 추적
- 수업 등록 및 시간표 관리
- 수강 신청 및 정원 관리
- 강사 배정
- 멘토-멘티 매칭
- 멘토링 신청 및 관리
- 체중, 근육량, 체지방 기록
- BMI 계산 및 추적
- 신체 변화 그래프
- 활동 기반 뱃지 획득
- 업적 달성 기록
- Node.js (v18+) - JavaScript 런타임
- Express.js (v4.18) - 웹 프레임워크
- MySQL (v8.0+) - 관계형 데이터베이스
- mysql2 - MySQL 클라이언트
- JWT (jsonwebtoken) - 토큰 기반 인증
- bcryptjs - 비밀번호 암호화
- cors - CORS 설정
- dotenv - 환경 변수 관리
- body-parser - 요청 본문 파싱
- cookie-parser - 쿠키 파싱
- nodemon - 개발 서버 자동 재시작
┌─────────────────────────────────────────────────────────────┐
│ Client Layer │
│ (React Frontend - Vercel) │
└────────────────────────┬────────────────────────────────────┘
│ HTTPS/REST API
│
┌────────────────────────▼────────────────────────────────────┐
│ API Gateway Layer │
│ (Express.js Server) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ CORS Middleware │ JWT Auth │ Body Parser │ │
│ └──────────────────────────────────────────────────────┘ │
└────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────────┐
│ Business Logic Layer │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Route Handlers │ │
│ │ • auth.js • members.js • exercises.js │ │
│ │ • diet.js • attendance.js • points.js │ │
│ │ • goals.js • classes.js • mentoring.js │ │
│ │ • rewards.js • badges.js • quests.js │ │
│ │ • guide.js • health.js • admin.js │ │
│ └──────────────────────────────────────────────────────┘ │
└────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────────┐
│ Data Access Layer │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ MySQL Connection Pool │ │
│ │ (mysql2/promise) │ │
│ └──────────────────────────────────────────────────────┘ │
└────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────────┐
│ Database Layer │
│ (MySQL Database) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Tables: Member, Attendance, ExerciseLog, DietLog, │ │
│ │ Goal, IncentivePolicy, AchievementLog, Reward, │ │
│ │ Badge, Class, HealthRecord, etc. │ │
│ │ │ │
│ │ Triggers: Auto Point Calculation & Reward System │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Client → POST /api/auth/login
↓
Validate Credentials (bcrypt)
↓
Generate JWT Token
↓
Return Token + User Info
↓
Client stores token in localStorage
↓
Subsequent requests include token in Authorization header
Client → POST /api/exercises (운동 기록)
↓
INSERT INTO ExerciseLog
↓
[TRIGGER] TRG_Exercise_Batch_Reward
↓
Check unrewarded count >= condition_value
↓
INSERT INTO AchievementLog (points_earned)
↓
[TRIGGER] TRG_Achievement_Point_Earn
↓
UPDATE Member.total_points += points_earned
↓
Return success response
Client → POST /api/rewards/exchange
↓
Check Member.total_points >= required_points
↓
INSERT INTO PointExchange (used_points)
↓
[TRIGGER] TRG_Exchange_Point_Use
↓
UPDATE Member.total_points -= used_points
↓
UPDATE Reward.stock_quantity -= 1
↓
Return success response
Client → POST /api/attendance/checkin
↓
INSERT INTO Attendance (entered_at)
↓
[TRIGGER] TRG_Attendance_Batch_Reward
↓
Auto point calculation if condition met
↓
Return current crowd status
BE/
├── src/
│ ├── app.js # Express 앱 진입점
│ ├── config/
│ │ └── database.js # MySQL 연결 설정
│ ├── middleware/
│ │ └── auth.js # JWT 인증 미들웨어
│ ├── routes/ # API 라우트
│ │ ├── auth.js # 인증 (로그인/회원가입)
│ │ ├── members.js # 회원 관리
│ │ ├── attendance.js # 출석 관리
│ │ ├── exercises.js # 운동 기록
│ │ ├── diet.js # 식단 관리
│ │ ├── goals.js # 목표 관리
│ │ ├── points.js # 포인트 조회
│ │ ├── rewards.js # 보상 상품
│ │ ├── badges.js # 뱃지 관리
│ │ ├── quests.js # 퀘스트 시스템
│ │ ├── classes.js # 수업 관리
│ │ ├── mentoring.js # 멘토링 시스템
│ │ ├── health.js # 신체 기록
│ │ ├── guide.js # 가이드 정보
│ │ └── admin.js # 관리자 기능
│ ├── controllers/ # 비즈니스 로직 (예정)
│ ├── models/ # 데이터 모델 (예정)
│ └── utils/ # 유틸리티 함수 (예정)
├── sql/
│ ├── HS_Health.sql # 전체 DB 스키마 + 트리거
│ ├── insert_dummy_data.sql # 테스트 데이터
│ ├── insert_class_data.sql # 수업 데이터
│ └── add_total_points_column.sql
├── scripts/
│ └── init_rewards.js # 보상 정책 초기화
├── .env # 환경 변수
├── .gitignore
├── package.json
└── README.md
.env 파일을 생성하고 다음 내용을 입력하세요:
# Server
PORT=5001
NODE_ENV=development
# Database
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=hs_health
DB_PORT=3306
# JWT
JWT_SECRET=hansung_gym_secret_key_2025
JWT_EXPIRE=7d
# Frontend URL
FRONTEND_URL=http://localhost:3000npm install# MySQL 접속
mysql -u root -p
# 데이터베이스 생성
CREATE DATABASE hs_health;
USE hs_health;
# 스키마 및 트리거 생성
source sql/HS_Health.sql;
# 테스트 데이터 삽입 (선택)
source sql/insert_dummy_data.sql;
source sql/insert_class_data.sql;node scripts/init_rewards.js# 개발 모드 (nodemon)
npm run dev
# 프로덕션 모드
npm start서버가 http://localhost:5001에서 실행됩니다.
POST /api/auth/login- 로그인POST /api/auth/register- 회원가입GET /api/auth/me- 현재 사용자 정보POST /api/auth/logout- 로그아웃
GET /api/members- 전체 회원 조회GET /api/members/:id- 특정 회원 조회POST /api/members- 회원 생성PUT /api/members/:id- 회원 정보 수정PUT /api/members/:id/profile- 프로필 업데이트DELETE /api/members/:id- 회원 삭제
POST /api/attendance/checkin- 입장POST /api/attendance/checkout- 퇴장GET /api/attendance/current- 현재 이용 인원GET /api/attendance/history/:memberId- 출석 기록
GET /api/exercises- 운동 목록POST /api/exercises- 운동 기록 추가GET /api/exercises/log/:memberId- 운동 기록 조회POST /api/exercises/list- 운동 종목 추가
GET /api/diet- 식단 기록 조회POST /api/diet- 식단 기록 추가GET /api/diet/foods- 음식 목록POST /api/diet/foods- 음식 추가
GET /api/goals/:memberId- 목표 조회POST /api/goals- 목표 생성PUT /api/goals/:id- 목표 수정PUT /api/goals/:id/achieve- 목표 달성DELETE /api/goals/:id- 목표 삭제
GET /api/points/:memberId- 포인트 조회GET /api/points/history/:memberId- 포인트 내역GET /api/rewards- 보상 상품 목록POST /api/rewards/exchange- 포인트 교환
GET /api/classes- 수업 목록GET /api/classes/:id/schedule- 수업 시간표POST /api/classes/register- 수강 신청DELETE /api/classes/register/:id- 수강 취소
POST /api/mentoring/request- 멘토링 신청GET /api/mentoring/matches- 매칭 목록PUT /api/mentoring/accept/:id- 매칭 수락DELETE /api/mentoring/cancel/:id- 매칭 취소
GET /api/health/:memberId- 신체 기록 조회POST /api/health- 신체 기록 추가GET /api/health/:memberId/latest- 최근 기록
GET /api/badges/:memberId- 획득 뱃지 조회GET /api/quests- 퀘스트 목록POST /api/quests/complete- 퀘스트 완료
GET /api/admin/stats- 통계 조회POST /api/admin/policies- 보상 정책 관리
- 회원 기본 정보 (학번, 이름, 연락처, 학과, 학년)
- 역할 타입 (일반/강사/멘토/멘티)
- 포인트 캐싱 (total_points)
- 정책 타입 (운동/식단/목표/출석)
- 달성 조건 (condition_value)
- 지급 포인트 (points_awarded)
- 포인트 획득 기록
- 정책 연결 (policy_id)
- 포인트 스냅샷
- 각 활동 기록
- achievement_id로 보상 연결
- 상품명, 필요 포인트, 재고
- 사용 포인트, 교환 일시
-
TRG_Achievement_Point_Earn
- AchievementLog 생성 시 Member.total_points 자동 증가
-
TRG_Exchange_Point_Use
- PointExchange 생성 시 Member.total_points 자동 감소
-
TRG_Exercise_Batch_Reward
- 운동 기록 N회 달성 시 자동 포인트 적립
-
TRG_Diet_Batch_Reward
- 식단 기록 N회 달성 시 자동 포인트 적립
-
TRG_Attendance_Batch_Reward
- 출석 N회 달성 시 자동 포인트 적립
-
TRG_Goal_Batch_Reward
- 목표 N개 달성 시 자동 포인트 적립
MIT License
HSU Gym Team
프로젝트 관련 문의사항은 이슈를 등록해주세요.