프로젝트 주제: 피트니스 시설 관리와 회원 맞춤 서비스를 통합한 ERP 플랫폼 GYMHUB

사실 ERP라는 시스템을 처음 들었을 땐 막막했지만, 차를 타고 가다보면 항상 들리는 그 신나는 노래를 쓰는 광고에서 많이 들었다는 점에서 신기했다. 귀로만 들었던 광고를 제작해보는 프로젝트라니 재밌을 것 같았다.
아무튼 gymhub에선 헬스장 운영자의 대시보드에선 erp 사항을 넣고, 일반 헬스장 이용 사용자들은 헬스장 방문 예약, 본인들의 출석 현황, pt 예약등을 하게 해주어 헬스장과 회원 양측의 관점에서 있으면 좋을 기능이 무엇이 있을까? 고민하면서 만들며 평소 헬스를 좋아하는 조원들과 재밌게 아이디어를 내며 만들었던 것 같다.





📂 프로젝트 구조 (Directory Structure)
GYMHUB/
├── src/
│ ├── main/
│ │ ├── java/com/kh/gymhub/
│ │ │ ├── controller/ # 컨트롤러 (요청 처리)
│ │ │ │ ├── MemberController.java # 회원 관련 컨트롤러
│ │ │ │ ├── TrainerController.java # 트레이너 관련 컨트롤러
│ │ │ │ ├── GymController.java # 헬스장 운영자 관련 컨트롤러
│ │ │ │ ├── BookingController.java # 방문 예약 관련 컨트롤러
│ │ │ │ ├── NoticeController.java # 공지사항 관련 컨트롤러
│ │ │ │ ├── MachineController.java # 기구/락커 관리 컨트롤러
│ │ │ │ └── StockController.java # 재고 관리 컨트롤러
│ │ │ ├── service/ # 서비스 인터페이스
│ │ │ │ ├── MemberService.java
│ │ │ │ ├── GymService.java
│ │ │ │ ├── AttendanceService.java
│ │ │ │ ├── StockService.java
│ │ │ │ └── ... (기타 서비스 인터페이스)
│ │ │ ├── service/impl/ # 서비스 구현체
│ │ │ │ ├── MemberServiceImpl.java
│ │ │ │ ├── GymServiceImpl.java
│ │ │ │ └── ... (기타 서비스 구현체)
│ │ │ ├── model/
│ │ │ │ ├── vo/ # VO (Value Object)
│ │ │ │ │ ├── Member.java
│ │ │ │ │ ├── Gym.java
│ │ │ │ │ ├── Stock.java
│ │ │ │ │ └── ... (기타 VO 클래스)
│ │ │ │ └── mapper/ # MyBatis Mapper 인터페이스
│ │ │ │ ├── MemberMapper.java
│ │ │ │ ├── GymMapper.java
│ │ │ │ └── ... (기타 Mapper 인터페이스)
│ │ │ ├── config/ # 설정 클래스
│ │ │ └── GymhubApplication.java
│ │ ├── resources/
│ │ │ ├── application.properties # 데이터베이스 설정
│ │ │ └── mappers/ # MyBatis Mapper XML
│ │ │ ├── member-mapper.xml
│ │ │ ├── gym-mapper.xml
│ │ │ ├── attendance-mapper.xml
│ │ │ ├── stock-mapper.xml
│ │ │ ├── notice-mapper.xml
│ │ │ └── ... (기타 Mapper XML 파일)
│ │ └── webapp/
│ │ ├── resources/
│ │ │ ├── css/
│ │ │ │ └── common.css # 공통 스타일
│ │ │ ├── js/
│ │ │ └── images/ # 이미지 리소스
│ │ └── WEB-INF/
│ │ └── views/ # JSP 뷰 페이지
│ │ ├── member/ # 회원 전용 페이지
│ │ │ ├── memberDashboard.jsp
│ │ │ ├── memberInfo.jsp
│ │ │ └── ...
│ │ ├── trainer/ # 트레이너 전용 페이지
│ │ │ ├── trainerDashboard.jsp
│ │ │ └── ...
│ │ ├── gym/ # 헬스장 운영자 전용 페이지
│ │ │ ├── gymDashBoard.jsp
│ │ │ ├── gymMemberManagement.jsp
│ │ │ ├── gymStockManagement.jsp
│ │ │ └── ...
│ │ ├── notice/ # 공지사항
│ │ │ ├── noticeList.jsp
│ │ │ ├── noticeDetail.jsp
│ │ │ └── ...
│ │ ├── booking/ # 방문 예약
│ │ │ └── booking.jsp
│ │ ├── common/ # 공통 컴포넌트
│ │ │ └── sidebar/ # 사이드바 컴포넌트
│ │ └── index.jsp # 메인 페이지
│ └── test/ # 테스트 코드
├── gymhub.sql # 데이터베이스 스키마
├── pom.xml # Maven 의존성 관리
├── IMPLEMENTATION_GUIDE.md # 구현 가이드
└── README.md # 프로젝트 소개
- 주요 기능 (Key Features)
더보기
👤 회원 기능
- ✅ 회원가입 / 로그인 / 로그아웃
- 일반 회원, 트레이너, 헬스장 운영자 회원가입
- BCrypt를 이용한 비밀번호 암호화
- 세션 기반 인증 관리
- ✅ 회원 정보 관리
- 회원 정보 조회 및 수정
- 비밀번호 변경
- 프로필 이미지 업로드
- 회원 탈퇴
- ✅ 대시보드
- 출결 현황, 회원권 정보, PT 일정 요약
- 최근 인바디 기록 조회
- ✅ 회원권 및 상품 관리
- 회원권 조회 및 구매
- PT 이용권 구매 및 예약
- 락커 이용권 구매 및 배정
- 구매 내역 조회
- ✅ PT 예약 관리
- 트레이너별 PT 일정 조회
- 예약 가능한 시간대 확인
- PT 예약 신청 및 취소
- ✅ 출결 관리
- 입실/퇴실 기록
- 출결 이력 조회
- ✅ 인바디 기록 관리
- 인바디 측정 기록 등록
- 인바디 기록 목록 조회
- 최신 인바디 기록 조회
- ✅ 운동 목표 관리
- 운동 목표 추가/삭제
- 목표 달성 상태 토글
- 목표 목록 조회
- ✅ 헬스장 정보 조회
- 헬스장 목록 조회 및 검색
- 헬스장 상세 정보 조회
- 헬스장 혼잡도 조회
- 헬스장 기구 목록 조회
- ✅ 방문 예약
- 헬스장 방문 예약 신청
- 예약 시간 선택 및 등록
- ✅ 운동 영상 시청
- 헬스장별 운동 영상 목록 조회
- YouTube URL을 통한 영상 시청
- ✅ 공지사항 조회
- 헬스장별 공지사항 목록 조회
- 공지사항 상세 조회
🏋️ 트레이너 기능
- ✅ 트레이너 대시보드
- PT 일정 요약
- 회원 관리 현황
- ✅ PT 일정 관리
- PT 일정 조회
- 날짜별 PT 일정 필터링
- 회원 PT 예약 승인/거절
- ✅ 회원 관리
- 담당 회원 조회
- 회원 출결 현황 조회
- ✅ 공지사항 조회
- 헬스장 공지사항 조회
- ✅ 회원 정보 관리
- 트레이너 정보 수정
- 비밀번호 변경
- 회원 탈퇴
🏢 헬스장 운영자 기능
- ✅ 헬스장 정보 관리
- 헬스장 정보 등록 및 수정
- 헬스장 상세정보 관리 (시설, 운영시간 등)
- 헬스장 이미지 업로드
- 헬스장 탈퇴 처리
- ✅ 대시보드
- 매출 통계 및 현황
- 회원 현황 요약
- 기구 관리 현황
- 출결 통계
- ✅ 회원 관리
- 회원 목록 조회 (페이징)
- 회원 상세 정보 조회
- 회원 정보 수정
- 회원 삭제
- 회원 구매 상품 조회
- ✅ 트레이너 관리
- 트레이너 목록 조회
- 트레이너 등록
- 트레이너 삭제
- 트레이너 조회
- ✅ 상품 관리
- 회원권 상품 등록/수정/삭제
- PT 이용권 등록/수정/삭제
- 락커 이용권 등록/수정/삭제
- 상품 목록 조회 (AJAX)
- ✅ PT 관리
- PT 예약 현황 조회
- PT 예약 승인/거절
- 날짜별 PT 예약 필터링
- ✅ 락커 관리
- 락커 등록
- 락커 목록 조회
- 락커 상태 변경 (빈/사용중/수리중)
- 락커 상세 정보 조회
- ✅ 기구 관리
- 기구 등록 (이미지 업로드 포함)
- 기구 목록 조회
- 기구 정보 수정
- 기구 삭제
- 기구 상태 관리
- ✅ 재고 관리
- 재고 목록 조회
- 재고 등록 (물품명, 목표 재고 수량, 가격)
- 재고 정보 수정
- 재고 입출고 처리
- 재고 삭제
- 입출고 내역 조회
- ✅ 매출 관리
- 매출 통계 조회
- 일별/월별 매출 현황
- 상품별 매출 분석
- ✅ 공지사항 관리
- 공지사항 등록/수정/삭제
- 공지사항 목록 조회 (페이징)
- 공지사항 상세 조회
- 공지사항 고정 기능
- 파일 첨부 지원
- ✅ 운동 영상 관리
- YouTube URL 등록
- 운동 영상 목록 조회
- 운동 영상 삭제
- ✅ 출결 관리
- 출결 체크 페이지
- 실시간 출결 현황 조회
- 출결 통계 및 혼잡도 관리
- 현재 헬스장 이용자 수 조회 (AJAX)
- ✅ 방문 예약 관리
- 방문 예약 목록 조회 (페이징)
- 예약 상태 변경 (대기/승인/거절)
- 날짜별 예약 필터링
📋 공통 기능
- ✅ 헬스장 목록 조회 및 검색
- 메인 페이지에서 헬스장 목록 조회
- 헬스장명, 지역별 검색
- ✅ 헬스장 상세 정보 조회
- 헬스장 기본 정보
- 헬스장 상세 정보 (운영시간, 시설 등)
- 헬스장 이미지 조회
- ✅ 공지사항 조회
- 헬스장별 공지사항 목록 조회
- 공지사항 상세 조회
- 고정 공지사항 우선 표시
- ✅ 파일 업로드
- 프로필 사진 업로드
- 헬스장 사진 업로드
- 기구 사진 업로드
- 공지사항 파일 첨부
- 파일 경로 관리
🔮 개선사항 및 향후 계획 (Improvements & Future Plans)
1. 아이디/비밀번호 찾기 기능
현재 문제점
- 로그인 페이지에 아이디·비밀번호 찾기 링크가 존재하지만 실제 기능이 구현되어 있지 않음
- 사용자가 로그인 정보를 잃어버리면 서비스 이용이 불가능한 문제 발생
구현 계획
- 이유: 아이디/비밀번호를 찾기 위해 이메일을 통한 인증이 필요
- 방법: Spring Mail 사용, Gmail SMTP 서버 활용
- 목표 구현:
- 이름과 이메일 입력 시 MEMBER 테이블에서 일치 여부 확인
- 6자리 인증번호 생성 후 서버 세션에 5분 동안 저장
- JavaMailSender를 통해 인증번호가 담긴 이메일 발송
- 사용자가 인증번호 입력 시 아이디 제공 또는 임시 비밀번호 발급
- 이메일을 통한 비밀번호 재설정 기능
기대 효과
- 계정 복구 기능 정상 제공
- 전체적인 사용자 편의성 및 서비스 이용 안정성 향상
2. 카카오맵 API 연동
현재 문제점
- 헬스장 정보가 텍스트 형태의 주소만 제공되어 실제 위치를 빠르게 파악하기 어려움
- 처음 방문하는 지역일 경우 주소만 보고 위치를 찾는 데 시간이 걸림
- 사용자 경험 저하
구현 계획
- 이유: 헬스장 위치를 지도로 보여주면 사용자 경험 향상
- 방법: 카카오 개발자 센터에서 앱키 발급 후 JavaScript SDK 사용
- 목표 구현:
- 헬스장 상세 모달에 지도 표시
- Geocoding API를 사용해 헬스장 주소를 위도·경도 좌표로 변환
- 변환된 좌표에 마커 표시
- 브라우저의 Geolocation API로 사용자 현재 위치 수신
- 카카오맵 거리 계산 기능을 이용해 현재 위치와 헬스장 사이의 거리 측정
- 500m, 1km, 3km 등 원하는 거리 범위 안의 헬스장만 보여주는 필터 기능 구현
기대 효과
- 헬스장 위치를 직관적으로 확인 가능
- 가까운 헬스장을 빠르게 찾을 수 있어 전반적인 사용 편의성 향상
3. WebSocket 기반 실시간 알림 기능
구현 계획
- 구현 요소:
- WebSocket 서버 설정
- 서버 → 클라이언트 알림 전송 로직
- 클라이언트 알림 수신 구조 (알림 클릭 시 관련 페이지 즉시 이동)
기대 효과
- 중요한 정보 즉시 전달되어 새로고침 불필요
- 사용자 경험(UX) 향상
- 관리자 → 전체 회원 공지 실시간 일괄 broadcast
4. 네이버 예약 API 연동
구현 계획
- 연동 전체 구조:
- 네이버 예약 플랫폼과 GymHub 시스템 간 예약 데이터 동기화
- 연동 절차:
- 파트너 승인 후 API 명세서 수령
- 인증키 발급
- Webhook 엔드포인트 개발 - 네이버가 예약/취소 이벤트 발생 시 우리 서버로 POST 요청 전송
- 자체 예약 → 네이버 예약 동기화 API 개발
- 개발 요소:
- Webhook API 서버 개발 (네이버 → 우리 서버: 예약 생성/취소 이벤트 수신)
- 내 시스템 예약을 네이버로 전달하는 API 개발
- 예약 변경/취소 동기화
- 타임슬롯 동기화 로직 구성
기대 효과
- 네이버 예약 플랫폼을 통한 추가 고객 유입
- 예약 관리의 통합 및 효율성 향상
후기
실질적으론 20~21일 정도의 팀 프로젝트를 하며 어떻게 시간이 지났는지도 모르겠다.
조장이라는 역할 안에서 팀원들과 함께 소통하고 진행상황을 공유하는 것이 중요하다는 것을 많이 깨달았다.
또한 업무 배분을 할 때, 더 세세히 어떤 기능을 어떤방식으로 구현하면 좋을지 브레인 스토밍이나 각자 회의 자료를 가져와서 의견을 나눠서 하면 팀업이 극대화 될 것 같아서 다음 프로젝트가 기대된다.
git 사용에 서툰점이 많이 느껴졌다. 항상 pull request를 main에다가 해버리는 실수와, dev 브랜치는 만들어놓고 거의 활용을 못했고... 되돌릴 수 없는 실수를 한다면 치명적이였을텐데, 다행히 그런 일은 발생하지 않았기에 여기까지 올 수 있었던 것 같다.
다음엔 git에 기능을 철저히 이해하고 전략을 잘 짜서 운용을 해서, 만족스러운 사용을 해봐야겠다.
'일기' 카테고리의 다른 글
| KPT-회고_2025) 2025년을 돌아보며 2026 새해 다짐 (0) | 2026.01.05 |
|---|---|
| 2025/12/13 경기 기후 바이브 코딩 해커톤) 미래에서 온 뉴스 (1) | 2025.12.14 |
| [KPT 회고] JavaScript에 대해서 배운 시간 (2025.09.15 ~ 09.21) (0) | 2025.09.22 |
| [KPT 회고] Java와 Oracle을 함께 사용하기 시작한 한 주 (2025.08.25 ~ 08.31) (1) | 2025.09.01 |
| [KPT 회고] Java의 기능을 보았던 한 주 (2025.08.18 ~ 08.24) (0) | 2025.08.25 |