Company Project@ 플럭시티2025 — 2026

Vgolf

골프장 경기관제 — GPS 카트 추적 & 실시간 라운드 관리

Role: Frontend Developer (경기관제 태블릿·모바일)

Overview

골프장 실시간 라운드 관리 플랫폼의 경기관제 앱입니다. 태블릿/모바일 듀얼 디바이스(Vgolf App, v1.1.24, 26K+ LOC)로 GPS 기반 카트 추적, Proj4 좌표 변환, 지오펜싱 자동 홀 전환, 움직이는 카트 환경에서의 터치 UX 최적화 등 골프장 특수 환경에 최적화된 기술을 구현했습니다. 현재 운영 중인 프로덕션 서비스로, 실사용 환경에서의 안정성과 마감 품질에 특히 주력했습니다. 같은 플랫폼의 F&B 주문·사이니지 서브시스템은 별도 프로젝트(VGOLF F&B)로 정리했습니다.

이 프로젝트의 핵심

프로덕션 운영 서비스

실사용 환경에서의 안정성·마감 품질에 주력

GPS 카트 추적

500ms 주기 GPS 읽기, Proj4 좌표 변환(위경도→코스맵 픽셀), 지오펜싱 자동 홀 전환

움직이는 카트 환경 터치 UX

Ghost Click 방지, useTap(30px 흔들림 허용), 더블클릭 가드

태블릿 140+ / 모바일 45+ 컴포넌트

듀얼 디바이스 공통 모듈 분리

나머지 1개 더 보기

네트워크 탄력성

ConsecutiveErrorGuard, Recoil Persist, React Query 캐싱, Teams Webhook 텔레메트리

Screens

현재 홀. GPS로 잡은 카트 위치에서 홀컵까지 남은 거리와 고저차를 코스 맵 위에 올린다. 오른쪽은 티샷 순서를 정하는 패널.
현재 홀. GPS로 잡은 카트 위치에서 홀컵까지 남은 거리와 고저차를 코스 맵 위에 올린다. 오른쪽은 티샷 순서를 정하는 패널.
홀 상세 — 그린 경사를 색으로 보여주고, 코스에서 주의할 점을 안내한다. 오른쪽에서 홀을 바로 골라 넘어갈 수 있다.
홀 상세 — 그린 경사를 색으로 보여주고, 코스에서 주의할 점을 안내한다. 오른쪽에서 홀을 바로 골라 넘어갈 수 있다.
스코어 카드. 전반·후반을 나눠 홀별 타수와 합계를 보여주고, 버디 이하는 하트로 표시한다.
스코어 카드. 전반·후반을 나눠 홀별 타수와 합계를 보여주고, 버디 이하는 하트로 표시한다.
전체 홀 경기 현황. 18홀에 흩어진 팀의 위치와 대기 팀을 한 화면에서 본다. 관제실에서 종일 띄워 두는 화면이다.
전체 홀 경기 현황. 18홀에 흩어진 팀의 위치와 대기 팀을 한 화면에서 본다. 관제실에서 종일 띄워 두는 화면이다.
그날 예약 목록. 팀마다 카트 번호와 전·후반 코스를 지정하고 라운드를 시작한다.
그날 예약 목록. 팀마다 카트 번호와 전·후반 코스를 지정하고 라운드를 시작한다.
라운드 시작 설정 — 캐디 유무, 부(部), 전·후반 코스, 티오프 시각을 고르고 플레이어를 채운다. 빠진 값이 있으면 시작 버튼이 잠긴다.
라운드 시작 설정 — 캐디 유무, 부(部), 전·후반 코스, 티오프 시각을 고르고 플레이어를 채운다. 빠진 값이 있으면 시작 버튼이 잠긴다.
캐디노트. 고객별 라운드 안내 동의와 클럽 장비 확인 상태를 체크하고, 관제·식음에서 온 메시지와 메모를 같이 본다.
캐디노트. 고객별 라운드 안내 동의와 클럽 장비 확인 상태를 체크하고, 관제·식음에서 온 메시지와 메모를 같이 본다.
식음 주문 — 그늘집·레스토랑·스타트하우스를 골라 담는다. 품절은 주문할 수 없게 막고, 포장 여부를 항목마다 고른다.
식음 주문 — 그늘집·레스토랑·스타트하우스를 골라 담는다. 품절은 주문할 수 없게 막고, 포장 여부를 항목마다 고른다.
주문 내역. 요청·취소·조리중 같은 상태가 매장에서 바뀌는 대로 따라 움직인다.
주문 내역. 요청·취소·조리중 같은 상태가 매장에서 바뀌는 대로 따라 움직인다.
라운드 중 특정 지점에 도달하면 뜨는 프로모션 안내.
라운드 중 특정 지점에 도달하면 뜨는 프로모션 안내.

실제 운영 화면입니다. 내장객·캐디 이름은 알아볼 수 없게 처리했습니다.

자세히

경기관제 앱 — GPS & 실시간 시스템6

GPS 카트 추적

500ms 주기 디바이스 GPS, 3초 주기 서버 전송 (대역폭 최적화)

Proj4 좌표 변환

위경도 → 코스맵 이미지 픽셀 좌표 매핑, 고도 기반 그린 슬로프 계산

지오펜싱

홀 폴리곤 영역 진입/이탈 감지로 자동 홀 전환, 해저드/이벤트 존 TTS 경고

라운드 상태 머신: START → OUT RUN → TURN → IN RUN → END, 9홀 추가·코스 변경 동적 대응

SSE 기반 다채널 실시간 동기화

예약, F&B 주문, 장비, 메시지

Android WebView + PlugGolf 브릿지

네이티브 GPS, 카메라, 알림 통합

경기관제 앱 — UX & 안정성7

움직이는 카트 환경 터치 최적화

Ghost Click 방지(preventGhostClick), useTap 훅(스와이프 vs 탭 구분, 30px 임계값)

더블클릭 가드

스코어 저장 등 중요 액션 보호

듀얼 디바이스 아키텍처

태블릿 140+ / 모바일 45+ 컴포넌트, 공통 모듈 분리

92+ Recoil 아톰 + recoil-persist

앱 재시작 시 서버 왕복 없이 상태 복원

ConsecutiveErrorGuard

연속 에러 시 폴링 자동 일시정지/재개

Teams Webhook 텔레메트리

에러 실시간 모니터링

4개 언어 동적 로딩 (한/영/일/태국어)

i18next

프로덕션 운영 & 마감 품질4

현재 운영 중인 프로덕션 서비스

실사용 골프장에서 매일 사용

엣지 케이스 꼼꼼한 처리

에러 큐잉, Pub/Sub 에러 핸들링, 중복 동작 방지

Docker + Nginx Alpine 정적 배포, 빌드 ID 자동 생성 (YYMMDDHHMI)

usePullToRefresh, useDragScroll 등 모바일 UX 커스텀 훅

Tech Stack

ReactTypeScriptViteRecoilReact QuerySCSSMUIi18nProj4WebViewDockerNginx