[팀 프로젝트] 헬스장 키오스크 만들기 (JavaGym)
https://github.com/jngsngjn/JavaGym
GitHub - jngsngjn/JavaGym: 헬스장을 이용하는 모든 사람들을 위한 키오스크
헬스장을 이용하는 모든 사람들을 위한 키오스크. Contribute to jngsngjn/JavaGym development by creating an account on GitHub.
github.com
개요
네이버 클라우드 캠프에서 진행한 첫 번째 프로젝트이자 나의 첫 번째 프로젝트이다. 자바의 AWT, Swing 등을 활용해 UI를 구성하고 데이터베이스와 연동한 백엔드를 구축해보는 것이 이번 프로젝트의 목표였다. 나를 포함한 6명의 팀원들과 함께했고, 약 3주 동안 진행되었다.
주제
헬스장에서 사용할 수 있는 키오스크를 개발하였다.
사용한 주요 기술
- JavaFX
- 뷰 영역을 자바 코드와 최대한 분리하기 위해 JavaFx를 통해 화면을 구성하기로 결정했다.
- MySQL
- Git & GitHub
내가 기여한 부분
(1) 프로젝트 세팅
구현 단계에서 시간을 최대한 줄이기 위해 초반 프로젝트 세팅을 하여 팀원들에게 공유했다. 라이브러리를 쉽게 추가하기 위해 gradle을 사용했고 커넥션을 쉽게 얻어 올 수 있는 유틸 클래스를 만들었다. 또한, 자주 사용될 것 같은 알림창 기능과 페이지 이동 기능을 제공하는 유틸 클래스도 만들었다.
(2) 회원가입 & 로그인
초기 버전의 회원가입의 경우 특정 사람의 전화번호만 알면 본인이 아닌 사람이 회원가입을 할 수 있다는 문제점이 있었다. 이 문제를 해결하기 위해 문자 인증 기능을 도입했다. 처음에는 막막했지만 외부 API를 사용하여 간단히 구현할 수 있다는 사실에 놀랐다. 이 외에도 사용자의 입력 값을 검증하는 로직에 힘을 들여 개발했다. 이 부분을 담당하면서 백엔드 영역은 정상 로직보다 검증 로직에 더 많은 시간과 노력이 들어간다는 사실을 알게 되었다.
(3) 관리자 페이지
관리자 페이지의 핵심은 회원과 트레이너에 대한 정보를 쉽게 확인하고 수정할 수 있는 것이라 생각했다. 개발 초기 단계에서는 회원과 트레이너 영역이 분리되어 있어 불편함이 있었다. 이것을 해결하기 위해 JavaFX가 지원하는 탭 기능을 사용하였고, 결과적으로 회원과 트레이너 영역을 쉽게 넘나들며 정보를 확인할 수 있게 되었다. 이 부분을 개발하면서 기본적인 데이터베이스 CRUD 작업에 대해 제대로 익힐 수 있었다.
(4) 결제 페이지의 장바구니 시스템
결제 페이지의 장바구니 시스템은 요구사항 정의 단계에서 생각해낸 키오스크의 핵심 기능이다. 이 기능을 구현하기 위해서는 결제 전까지 회원이 선택한 각 상품들에 대한 정보를 유지할 수 있어야 한다. 다형성과 인터페이스를 활용하여 서로 관련이 없는 클래스들에게 관계를 맺어주고 컬렉션 프레임워크의 Set을 사용하여 장바구니 기능을 완성했다.
(5) 기타
필수 요구사항 구현을 모두 마치고 사용자 경험을 향상시키기 위해 음성 기능과 애니메이션 기능을 추가했다. 두 기능 모두 JavaFX가 제공해주는 미디어 기능과 애니메이션 기능을 통해 쉽게 구현할 수 있었다.
느낀 점
그동안 내가 해 왔던 것은 누군가로부터 지식을 배우고 정리한 것이 전부였다. 그렇기 때문에 내가 배웠던 내용들을 활용해 보고 싶었는데 적절한 시기에 프로젝트가 진행되어 다행이라고 생각했다. 이번 프로젝트는 나의 첫 번째 프로젝트였기 때문에 여러 가지를 느끼고 배울 수 있었다.
우선, 구현 단계 전까지의 과정이 탄탄하게 진행되어야 구현 단계가 수월하게 진행된다는 것을 알게 되었다. 특히 요구사항 정의 단계에서 요구사항을 최대한 치밀하게 정의해야 구현을 막힘 없이 할 수 있었다. 실제로 요구사항 정의 단계에서 회원이 비밀번호를 재설정하기 위한 인증 수단을 이메일을 통해 진행하려고 했다. 하지만 개발 중간 단계에서 이메일을 통한 인증은 키오스크의 단순함과 편리함에 부합하지 않는다고 생각이 들었다. 이에 회원이 비밀번호를 재설정하는 기능을 만드는 대신 관리자 페이지에서 회원의 비밀번호를 초기화(회원의 전화번호로 메시지 전송)할 수 있는 기능을 만들었다. 이렇게 변경을 하고 난 이후 더이상 사용하지 않는 이메일 필드를 회원가입 폼에서 제거하려고 했다. 하지만 이메일을 제거하는 순간 너무나 많은 지점에서 코드의 변경이 불가피하게 일어나게 되어 결국에는 제거하지 못 했던 경험이 있다.
요구사항 정의를 마치고 데이터베이스 설계를 진행했다. 우리 팀은 데이터베이스 설계에서 많은 어려움을 겪었다. 회원이 구매할 수 있는 상품의 종류가 다양했고, 또 그 종류에 따른 특성이 상이했기 때문이다. 가장 간단한 방법은 각 상품마다 테이블을 생성하는 것이었지만 그렇게 할 경우 테이블 개수가 많아져 복잡해지는 문제가 있었다. 테이블 개수와 복잡도 사이에서 적절한 해결 방법을 찾기 위해 노력했다. 그 결과 회원이 구매할 수 있는 상품을 정의한 item 테이블, 회원이 구매한 정보를 저장하는 purchase 테이블을 만들었다. 분명 더 나은 설계 방법이 있었을 것이라 생각하고 있지만, 그 당시의 수준에서 주어진 프로젝트 기간 내에 만들 수 있는 가장 최선의 설계였다고 생각한다. 이러한 경험이 추후 데이터베이스 설계 시 분명 도움이 될 것이라 믿는다.
그 다음으로 내가 느꼈던 점은 협업 시 버전 관리의 어려움에 관한 것이다. 나는 팀 프로젝트가 처음이었기 때문에 협업을 할 때 상상할 수 있는 어려움이란 오로지 인간 관계에 대한 것이었다. 다행히 이러한 부분에서는 어려움이 없었지만 버전 관리에 있어서 많은 어려움을 겪었다. 우리 팀은 버전 관리를 위해 Git과 GitHub를 사용했다. 팀원들 중 이 분야에 대해 잘 알고 있는 팀원이 없었지만 Git은 필수적으로 배워야 하는 것이라 생각했기 때문에 이번 기회에 Git을 사용해 보기로 했다. 결과적으로 봤을 때 Git에 대한 최소한의 지식은 배웠다고 생각하지만 GUI를 사용했기 때문에 Git의 작동 방식이나 원리 등은 모른 채 프로그램의 도움을 많이 받았다. 프로젝트를 끝낸 지금 가장 먼저 Git을 배워야겠다고 다짐했다. CLI를 기반으로 add, commit, check-out, fork, fetch 등 기본적인 용어와 원리에 대해 처음부터 기초를 탄탄히 배우고 브렌치 전략에 대해서도 배워볼 생각이다.
결과적으로 이번 프로젝트에서 1등을 했지만, 부족한 부분이 많았다고 생각한다. 변경이 발생했을 때 수정할 지점을 최대한 줄이기 위해 노력했지만 생각만큼 쉽지 않았으며, 트랜잭션에 대한 고려도 없었다. 또한 내가 만든 관리자 페이지에서는 회원과 트레이너에 대한 간단한 CRUD 작업만 할 수 있다. 하지만 관리자라면 관리하고 있는 헬스장에 대한 전체적인 통계, 예를 들어 회원이 가장 많이 구매하는 헬스장 이용권은 어느 것인지, 헬스장에 가장 많이 방문하는 요일은 언제인지 등에 대한 정보도 확인할 수 있어야 한다고 생각한다. 이러한 아쉬움들은 아쉬움에만 그치지 않고 다음 프로젝트에는 꼭 적용해 보고 싶다.