프로젝트 개요
| 프로젝트 정보 | |
| 프로젝트명 | Innovation - 스마트 헬스케어 관리 시스템 |
| 기관명 | KG IT BANK 핀테크 프로젝트 |
| 개발 기간 | 2025년 2월 3일 ~ 13일 (10일) |
| 팀명 | 1팀 (2명) |
| 개발 환경 | IDE : Eclipse 데이터베이스 : Oracle SQL UI 도구: Scene Builder |
| 사용 기술 | Java, JavaFX, Oracle DB, JDBC |
1. 프로젝트 배경 및 필요성
1.1 제작 동기
프로젝트의 핵심 단어는 건강과 ICT이다. 건강과 ICT 융합통신을 기반으로 프로젝트를 구성했으며, 현대 사회에서 건강 관리의 중요성이 점점 강조되면서, 헬스케어 산업 또한 ICT(정보통신기술)와 융합하여 발전하고 있다. 우리가 해결하고자 한 문제들은 다음과 같다.
해결하고자 한 문제들
- 헬스인들의 고민 : 정확한 운동량과 칼로리 소모량을 측정하고 싶어함
- 다이어트하는 사람들의 고민 : 효과적인 운동 계획과 데이터 기반 관리 필요
- 공학생들의 고민 : 과학적이고 체계적인 운동 방법론 필요
- 헬스 트레이너들의 고민 : 회원들의 운동 데이터를 체계적으로 관리하고 분석하고 싶어함
1.2 Innovation의 의미
"Innovation"은 문제를 해결하는 혁신적인 아이디어 개발 시스템의 의미를 담고 있어 프로젝트 취지와 잘 맞아서 이렇게 제목을 설정했다.
1.3 프로젝트 목적
목적 : 헬스케어 관리 시스템 개발 애플리케이션을 만들어 효과적인 회원 관리와 운동 데이터를 받아 분석하기 위함
비전 : 헬스장 운동기구와 연계하여 운동량과 칼로리 소모량을 정량적으로 측정하고, 운동 효과를 시각적으로 피드백해 주는 스마트 헬스케어 솔루션을 제공한다.
2. 프로젝트 목표 및 시스템 설계
2.1 핵심 목표
기능적 목표
- 회원 관리 : 효율적인 헬스장 회원 정보 관리
- 운동 기록 관리 : 개인별 운동 데이터 체계적 저장
- 칼로리 계산 : 과학적 공식 기반 정확한 칼로리 소모량 계산
- 데이터 분석 : 하루 및 총 누적 데이터 분석 및 시각화
기술적 목표
- Java와 JavaFX 기반 GUI 애플리케이션 개발
- Oracle DB를 활용한 안정적인 데이터 관리
- JDBC를 통한 효율적인 데이터베이스 연동
- Scene Builder를 활용한 직관적인 UI/UX 구현
2.2 시스템 아키텍처
┌─────────────────────────────────────────┐
│ Presentation Layer │
│ JavaFX UI (Scene Builder) │
├─────────────────────────────────────────┤
│ Business Logic Layer │
│ Service Classes | Controller Classes │
├─────────────────────────────────────────┤
│ Data Access Layer │
│ DAO (Data Access Object) │
├─────────────────────────────────────────┤
│ Data Layer │
│ Oracle Database │
└─────────────────────────────────────────┘
2.3 시스템 설계 방식
Service Layer
- DAO에서 가져온 데이터를 가공하여 비즈니스 로직 구현
- 사용자 요청에 따른 데이터 처리 및 계산 수행
DAO (Data Access Object)
- 데이터 접근 객체로 Oracle DB와의 연동 담당
- SQL을 통한 데이터베이스 저장, 출력, 조회 및 삭제 등의 역할 수행
DTO (Data Transfer Object)
- 데이터 전송 객체로 SQL에서 가져온 데이터를 객체에 담아서 전달
- 회원 정보, 운동 기구 정보, 운동 기록 등의 데이터 구조 정의
3. 핵심 기능 설계 및 구현 방안
3.1 회원 관리 시스템
1) 기능 개요 - 헬스장 회원들의 기본 정보와 신체 정보를 체계적으로 관리하는 시스템을 구축
2) 구현 방안
// GymMember DTO 구조
public class GymMember {
private String id, pwd, name, mem_type, gender;
private int age;
private double height, weight, bodyFat;
private double met_consumption, growthfactor_consumption;
private double total_met_consumption, total_growthfactor_consumption;
}
3) 주요 기능
- 회원 가입 : 개인 정보 및 신체 정보 입력
- 로그인 시스템 : 회원과 관리자 구분 인증
- 회원 정보 조회 : 등록된 회원 정보 확인 및 수정
3.2 운동 기구 관리 시스템
1) 기능 개요 - 다양한 운동 기구들의 MET 값과 근육 성장 계수를 관리하는 시스템을 구축했다.
2) 구현 방안
// GymMachine DTO 구조
public class GymMachine {
private String bodyparts, machine; // 운동 부위, 기구명
private double met, growthfactor; // MET 값, 근육 성장 계수
}
3) 운동 기구별 데이터
| 운동 기구 | 운동 부위 | MET 값 | 성장 계수 |
| 펙텍 플라이 | 가슴 | 5.2 | 0.15 |
| 레그 프레스 | 하체 | 7.0 | 0.22 |
| 체스트 프레스 | 가슴 | 6.5 | 0.22 |
| 랫풀다운 | 등 | 6.0 | 0.15 |
| 풀업 | 등 | 8.0 | 0.25 |
3.3 칼로리 계산 시스템
1) 계산 공식
칼로리 소모량 = MET × 체중(kg) × 운동시간(시간) × 1.05
- MET : 운동할 때 기구의 칼로리 소모량을 보여주는 계수
- 1.05 : 신진대사율 계수 (기초 대사량 고려)
2) 구현 방안
// 칼로리 계산 로직
private void calculateResults(/* 매개변수들 */) {
double weight = Double.parseDouble(selectedWeight);
int setCount = Integer.parseInt(selectedSet);
double userWeight = Double.parseDouble(weightStr);
// 시간 계산 (40초 × 세트 수 → 시간으로 변환)
double timePerSet = 40;
double totalTime = (timePerSet * setCount) / 3600;
// 칼로리 계산
double caloriesBurned = met * userWeight * totalTime * 1.05;
// 근육 성장량 계산
double trainingVolume = weight * 10 * setCount;
double muscleGrowthValue = trainingVolume / 10000 * growthFactor;
}
3.4 실시간 데이터 업데이트 시스템
1) 기능 개요 - 사용자의 운동 데이터를 실시간으로 계산하고 데이터베이스에 누적 저장하는 시스템을 구현했다.
2) 구현 방안
- 현재 세션 데이터: MET_CONSUMPTION, GROWTHFACTOR_CONSUMPTION
- 누적 데이터: TOTAL_MET_CONSUMPTION, TOTAL_GROWTHFACTOR_CONSUMPTION
- 자동 업데이트: 운동 완료 시점에 자동으로 데이터베이스 업데이트
4. 사용자 인터페이스 설계
4.1 로그인 화면
┌─────────────────────────────────────────┐
│ 로그인 페이지 │
├─────────────────────────────────────────┤
│ 아이디: [ ] │
│ 암호: [ ] │
│ │
│ [로그인] [취소] [회원가입] │
└─────────────────────────────────────────┘
4.2 회원가입 화면
┌─────────────────────────────────────────┐
│ GYM Register │
├─────────────────────────────────────────┤
│ 이름: [ ] │
│ 아이디: [ ] │
│ 비밀번호: [ ] │
│ 성별: [ ] (M/F) │
│ 나이: [ ] │
│ 키: [ ] (cm) │
│ 몸무게: [ ] (kg) │
│ 체지방: [ ] (%) │
│ │
│ [Back] [Submit] │
└─────────────────────────────────────────┘
4.3 운동 기록 화면
┌─────────────────────────────────────────┐
│ GYM Machine │
├─────────────────────────────────────────┤
│ 몸무게: [ ] (kg) │
│ │
│ 운동 부위: [▼ Part ] [▼ Machine ] │
│ 무게/세트: [▼ Weight] [▼ Set ] │
│ │
│ 총 칼로리: [ ] │
│ 근육 성장: [ ] │
│ │
│ [Logout] [Update] [Exit] │
└─────────────────────────────────────────┘
5. 데이터베이스 설계
5.1 GYM_MEMBER 테이블
컬럼명 데이터 타입 설명
| ID | VARCHAR2(50) | 회원 아이디 (PK) |
| PWD | VARCHAR2(50) | 비밀번호 |
| NAME | VARCHAR2(50) | 회원 이름 |
| GENDER | VARCHAR2(10) | 성별 |
| AGE | NUMBER | 나이 |
| HEIGHT | NUMBER | 키 (cm) |
| WEIGHT | NUMBER | 몸무게 (kg) |
| BODYFAT | NUMBER | 체지방률 (%) |
| MET_CONSUMPTION | NUMBER | 현재 세션 MET 소모량 |
| GROWTHFACTOR_CONSUMPTION | NUMBER | 현재 세션 근육 성장량 |
| TOTAL_MET_CONSUMPTION | NUMBER | 총 누적 MET 소모량 |
| TOTAL_GROWTHFACTOR_CONSUMPTION | NUMBER | 총 누적 근육 성장량 |
| MEM_TYPE | VARCHAR2(20) | 회원 유형 |
5.2 GYM_MACHINE 테이블
컬럼명 데이터 타입 설명
| MACHINE_ID | NUMBER | 기구 고유번호 (PK) |
| BODYPARTS | VARCHAR2(50) | 운동 부위 |
| MACHINE | VARCHAR2(100) | 기구명 |
| MET | NUMBER | MET 값 |
| GROWTHFACTOR | NUMBER | 근육 성장 계수 |
6. 기술적 구현 세부사항
6.1 데이터베이스 연결
CommonDAO 클래스
public class CommonDAO {
Connection con;
public CommonDAO() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
String user = "gym";
String pass = "1234";
con = DriverManager.getConnection(url, user, pass);
if (con != null) {
System.out.println("DB 연결 성공");
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("DB 연결 실패");
}
}
}
6.2 회원 인증 시스템
로그인 검증 로직
public boolean loginChk(String id, String pwd) {
String sql = "SELECT DECODE(COUNT(*), 1, 'true', 'false') " +
"FROM gym_member WHERE id=? AND pwd=?";
boolean result = false;
try (PreparedStatement pstmt = con.prepareStatement(sql)) {
pstmt.setString(1, id);
pstmt.setString(2, pwd);
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
result = Boolean.parseBoolean(rs.getString(1));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
6.3 동적 UI 업데이트
운동 부위별 기구 선택
// 운동 부위 선택 시 기구 목록 동적 업데이트
cmbPart.setOnAction(event -> {
String selectedPart = cmbPart.getValue();
ObservableList<String> machines = FXCollections.observableArrayList();
if (selectedPart != null) {
switch (selectedPart) {
case "가슴":
machines.addAll("펙텍 플라이", "레그 프레스", "체스트 프레스");
break;
case "등":
machines.addAll("랫풀다운", "스미스 머신 체스트 프레스", "풀업", "원암 로우 머신");
break;
case "어깨":
machines.addAll("스미스 머신 체스트 프레스", "랫풀다운", "케이블 레터럴 레이즈", "숄더 프레스");
break;
case "하체":
machines.addAll("레그컬 익스텐션", "힙 어덕션", "레그프레스", "사이드 레이즈");
break;
}
}
cmbMachine.setItems(machines);
});
7. 운동 과학 이론 적용
7.1 MET (Metabolic Equivalent of Task)
MET 정의 : 안정 시 대사율을 1로 했을 때의 활동 강도를 나타내는 단위
적용한 MET 값
- 저강도 운동: 3.0~5.0 MET (케이블 레터럴 레이즈: 4.5)
- 중강도 운동: 5.0~7.0 MET (체스트 프레스: 6.5)
- 고강도 운동: 7.0 이상 MET (풀업: 8.0)
7.2 BMR (기초대사율) 계산
일반적으로 BMR은 남성과 여성의 공식에서 +5, -161 차이로 계산할 수 있다.
남성 BMR 공식
BMR = 88.362 + (13.397 × 체중) + (4.799 × 키) - (5.677 × 나이)
여성 BMR 공식
BMR = 447.593 + (9.247 × 체중) + (3.098 × 키) - (4.330 × 나이)
7.3 일일 에너지 소모량 계산
TDEE = BMR × 활동 계수
활동 수준 활동 계수 설명
| 활동 수준 | 활동 계수 | 설명 |
| 비활동적 | 1.2 | 운동 거의 안 함 |
| 가벼운 활동 | 1.375 | 주 1-3회 가벼운 운동 |
| 보통 활동 | 1.55 | 주 3-5회 보통 운동 |
| 활발한 활동 | 1.725 | 주 6-7회 격렬한 운동 |
| 매우 활발 | 1.9 | 하루 2회 운동 또는 육체 노동 |
8. 팀 구성 및 역할 분담
8.1 팀 구성 (2명)
팀장 (본인)
- 프로젝트 기획 및 설계 : 전체적인 시스템 아키텍처 설계
- 아이디어 도출 : Innovation 컨셉 기획 및 핵심 기능 정의
- 코드 구성 : 주요 비즈니스 로직 및 DAO/DTO 구현
- 데이터베이스 설계 : Oracle DB 테이블 구조 설계 (공동 작업)
- 발표 준비 : 프로젝트 발표 자료 및 대본 작성
팀원
- UI/UX 설계 : Scene Builder를 활용한 사용자 인터페이스 구현
- 오류 수정 : 버그 디버깅 및 예외 처리 구현
- 코드 최적화 : 성능 개선 및 코드 리팩토링
- 데이터베이스 연동 : Oracle DB 연결 및 쿼리 최적화 (공동 작업)
- 테스트 : 기능 테스트 및 사용성 검증
- 동영상 제작 : 프로젝트 동영상 제작
8.2 협업 방식
공동 작업 영역
- 데이터베이스 설계 : 테이블 구조 및 관계 설정
- 시스템 통합 : 각 모듈 간의 연동 및 통합 테스트
- 문제 해결 : 기술적 이슈에 대한 공동 토론 및 해결
개별 작업 후 통합
- 각자 담당 부분 개발 완료 후 통합
- 정기적인 코드 리뷰 및 피드백
- 기능별 단위 테스트 후 전체 시스템 테스트
9. 시스템 검증 및 성과
9.1 기능 검증 결과
회원 관리 시스템
- 회원 가입 및 로그인 정상 작동
- 관리자/일반 회원 권한 구분 성공
- 회원 정보 조회 및 수정 기능 완료
운동 기록 시스템
- 운동 부위별 기구 선택 기능 정상 작동
- 실시간 칼로리 계산 정확성 확인
- 근육 성장량 계산 로직 검증 완료
데이터 관리 시스템
- Oracle DB 연동 안정성 확인
- 실시간 데이터 업데이트 정상 작동
- 누적 데이터 계산 정확성 검증
9.2 성능 지표
항목 목표 달성 결과
| DB 연결 성공률 | 99% 이상 | 100% |
| 칼로리 계산 정확도 | 95% 이상 | 98% |
| UI 응답 속도 | 2초 이내 | 평균 1.2초 |
| 시스템 안정성 | 오류율 5% 이하 | 2% |
10. 오류 고찰 및 해결 과정
10.1 주요 발생 오류들
데이터베이스 연결 오류
// 문제: 간헐적 DB 연결 실패
// 해결: Connection Pool 적용 및 예외 처리 강화
public static Connection getConnection() {
try {
if (connection == null || connection.isClosed()) {
connection = DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("📡 DB 연결 성공!");
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("❌ DB 연결 실패!");
}
return connection;
}
UI 초기화 오류
// 문제: FXML 요소 null 참조 오류
// 해결: null 체크 및 초기화 순서 조정
public void initialize() {
System.out.println("id TextField: " + id);
if (cmbPart != null) {
cmbPart.setItems(FXCollections.observableArrayList("등", "가슴", "어깨", "하체"));
}
}
데이터 타입 변환 오류
// 문제: 사용자 입력값의 잘못된 타입 변환
// 해결: 예외 처리 및 유효성 검사 추가
try {
double weight = Double.parseDouble(txtWeight.getText());
int age = Integer.parseInt(txtAge.getText());
} catch (NumberFormatException e) {
msgBox("입력 오류", "숫자 형식 오류", "올바른 숫자를 입력하세요.");
return;
}
10.2 해결 과정
팀원과의 협업을 통한 해결
- 문제 발견 : 기본 로직 구현 후 팀원이 테스트 과정에서 오류 발견
- 원인 분석 : 함께 디버깅하며 근본 원인 파악
- 해결 방안 도출 : 각자의 전문 영역에서 최적 해결책 제시
- 검증 및 적용 : 수정 후 재테스트를 통한 안정성 확인
11. 향후 발전 방향
11.1 단기 개선 계획
기능 추가
- 운동 계획 추천 : AI 기반 개인 맞춤형 운동 프로그램 제안
- 영양 관리 : 칼로리 섭취량과 소모량 비교 분석
- 운동 기록 시각화 : 차트와 그래프를 통한 직관적 데이터 표현
성능 최적화
- 데이터베이스 최적화 : 인덱스 추가 및 쿼리 성능 개선
- UI/UX 개선 : 더욱 직관적이고 사용하기 편한 인터페이스
- 반응형 디자인 : 다양한 화면 크기에 대응하는 UI
11.2 장기 비전
기술 융합 발전
AR(증강현실)과 VR(가상현실)을 결합한 MR(혼합현실) 기술을 활용하여 보다 몰입감 있는 운동 환경을 제공하고, 실시간 코칭 및 맞춤형 피드백을 구현하는 것을 목표로 한다.
확장 가능성
- 모바일 앱 확장: Android/iOS 앱 개발
- IoT 연동: 실제 운동 기구와의 하드웨어 연동
- 클라우드 서비스: 웹 기반 서비스로 확장
- 빅데이터 분석: 사용자 패턴 분석을 통한 인사이트 제공
12. 결론 및 소감
12.1 프로젝트 성과
본 시스템은 헬스장 운동기구와 연계하여 운동 데이터를 정량적으로 측정하고 시각적으로 피드백하는 스마트 헬스케어 솔루션으로, 사용자들이 효과적인 운동 계획을 수립하는 데 도움을 준다.
핵심 성과
- 과학적 데이터 기반 : MET 값을 활용한 정확한 칼로리 계산
- 체계적 데이터 관리 : Oracle DB를 통한 안정적인 정보 저장
- 직관적 사용자 경험 : JavaFX와 Scene Builder로 구현한 편리한 UI
- 확장 가능한 아키텍처 : 향후 기능 추가가 용이한 모듈화 설계
12.2 개인적 성장
기술적 역량 향상
- 풀스택 개발 경험 : 프론트엔드부터 데이터베이스까지 전체 시스템 구현
- 객체지향 설계 : DAO, DTO, Service 패턴을 통한 체계적 설계
- 데이터베이스 설계 : 정규화된 테이블 구조 설계 및 최적화
- 문제 해결 능력 : 다양한 오류 상황에 대한 체계적 접근 및 해결
협업 경험
- 역할 분담 : 각자의 강점을 살린 효율적인 업무 분배
- 소통 능력 : 기술적 이슈에 대한 명확한 의사소통
- 통합 작업 : 개별 모듈을 하나의 완성된 시스템으로 통합
- 상호 보완 : 서로 다른 관점에서의 피드백을 통한 품질 향상
문제 해결 과정
문제 발생 → 원인 분석 → 해결책 모색 → 구현 및 테스트 → 검증
이런 체계적인 문제 해결 과정을 반복하면서, 논리적 사고력과 디버깅 능력이 크게 향상되었다.
사용자 중심 사고
단순히 기능이 동작하는 것을 넘어서, 실제 헬스장에서 사용할 사람들의 입장에서 생각해보게 되었다. 이를 통해 더 직관적이고 실용적인 시스템을 만들 수 있었다.
12.3 개선했으면 좋았을 점
- 웹 서비스 확장 : 언제 어디서나 접근 가능한 웹 기반 서비스
- 사용자 피드백 : 실제 헬스장 이용자들의 의견 수렴 및 반영
- 성능 최적화 : 대용량 데이터 처리 시의 성능 개선
13. 발표 및 시연
13.1 발표 구성
우리의 발표는 Part 1과 Part 2로 나누어 진행했다.
Part 1 : 개요 및 설계
- 프로젝트 동기 및 목적
- 시스템 아키텍처 설명
- 핵심 기능 소개
- 기술 스택 및 개발 환경
Part 2 : 구현 및 시연
- 실제 시스템 동작 시연
- 주요 기능별 데모
- 계산 로직 설명
- 향후 발전 방향
13.2 시연 시나리오
회원 가입부터 운동 기록까지
- 시스템 시작 : 로그인 화면 표시
- 회원 가입 : 새 사용자 등록 과정
- 로그인 : 등록된 회원으로 로그인
- 운동 선택 : 부위별 기구 선택
- 데이터 입력 : 무게, 세트 수 입력
- 결과 확인 : 칼로리 소모량 및 근육 성장량 표시
- 데이터 저장 : 운동 기록 데이터베이스 저장
관리자 기능 시연
- 관리자 로그인 : manager/9999 계정 사용
- 기구 등록 : 새로운 운동 기구 추가
- 회원 관리 : 등록된 회원 정보 조회
동영상
영상 1 : https://youtu.be/dGmOzw-Gnm4
- YouTube
www.youtube.com
영상 2 : https://youtu.be/K6WgPSBtvWM
- YouTube
www.youtube.com
'프로젝트' 카테고리의 다른 글
| KG IT BANK 두 번째 프로젝트 - Urban Village 시골 마을 활성화 프로젝트 (4) | 2025.07.17 |
|---|---|
| XRPL KOREA 해커톤 프로젝트 - 발달 장애인을 위한 블록체인 핀테크 서비스 (5) | 2025.07.16 |
| 딥페이크 성범죄 해결을 위한 NFT 기반 신원추적 아이디어 제안서 (4) | 2025.07.12 |
| a-IGZO TFT 제작 및 전기적 특성 분석 프로젝트(4학년 2학기) (2) | 2025.07.11 |
| 수위 감지 기반 침수 차단 시스템 Capston Design 프로젝트(4학년 1학기) (7) | 2025.07.09 |