상세 컨텐츠

본문 제목

가민 Fenix 7에 KBO 실시간 점수 띄우는 워치페이스 만들기

개발

by 코드스키 2026. 7. 27. 15:12

본문

가민 Fenix 7 Pro Solar를 쓰는데, 야구 볼 때 폰을 매번 꺼내는 게 귀찮았다. 손목에서 우리 팀 점수가 실시간으로 보이면 좋겠다 싶어서 워치페이스를 직접 만들기로 했다. 만들다 보니 워치 플랫폼의 제약이 생각보다 빡빡해서, 워치 혼자로는 안 되고 폰을 끼워야 했던 이야기다.

 

Garmin Fenix 7 KBO 실시간 점수 워치페이스 제작기 대표 이미지
Garmin Fenix 7 KBO 실시간 점수 워치페이스 제작기 대표 이미지

 

Connect IQ 워치페이스의 기본

가민 워치 앱은 Connect IQ SDK로 만든다. 워치페이스는 그중에서도 시계 화면 자체를 그리는 종류인데, 시간·날짜 같은 기본 정보에 원하는 걸 얹어서 그린다. SDK를 설치하고 대상 기기를 fenix7pro로 잡은 다음, 시간과 날짜를 그리는 기본 골격부터 세웠다. 여기까지는 순조로웠다.

 

Garmin Fenix 7 Pro Solar 실제 착용 화면
Garmin Fenix 7 Pro Solar 실제 착용 화면

 

문제는 "실시간 점수"였다. 워치페이스가 스스로 인터넷에서 점수를 계속 긁어오게 만들고 싶었는데, 여기서 플랫폼 제약에 부딪혔다.

5분 실행 제한이라는 벽

Connect IQ 워치페이스는 백그라운드 실행 시간이 제한된다. 대략 5분 단위의 제약이 있어서, 워치페이스가 혼자 계속 네트워크를 폴링하면서 실시간 데이터를 받아오는 구조를 만들 수가 없다. 배터리를 아끼려는 플랫폼의 의도라 이해는 되는데, 실시간 스코어보드를 원하는 입장에선 벽이었다.

그래서 방향을 틀었다. 워치가 직접 데이터를 가져오는 대신, 폰이 데이터를 가져와서 워치로 밀어주는 구조로 갔다.

안드로이드 컴패니언으로 우회

폰 쪽에 안드로이드 컴패니언 앱을 붙였다. 이 앱이 15초마다 라이브 점수를 폴링하고, 경기가 진행 중일 때 그 값을 워치로 sendMessage를 통해 전송한다. 워치페이스는 폰에서 오는 메시지를 받는 수신부만 두고, 받은 점수를 화면에 그린다. 즉 무거운 네트워크 작업은 폰이 하고, 워치는 표시만 담당한다. 이렇게 나누니 5분 제한을 우회하면서도 손목에서 거의 실시간에 가까운 점수를 볼 수 있었다.

경기 중이 아닐 때는 굳이 야구 UI를 띄우지 않게 했다. 경기가 시작된 상태(STARTED)일 때만 스코어를 표시하고, 평소에는 일반 시계 화면으로 둔다. 응원팀 점수는 눈에 띄게 강조 색으로 처리했다.

화면 디자인

기왕 새로 만드는 김에 기존 페이스를 그대로 복제하기보다 내 취향대로 다시 디자인했다. 상단에 한글 요일과 날짜를 넣고, 강조 색 헤더, 정리된 데이터 그리드, 분 단위 진행 링을 얹었다. 경기 중에는 그 위에 라이브 스코어 라인이 뜬다. 가독성을 손목에서 확인하면서 몇 번 조정했다.

 

Garmin Connect IQ 공식 사이트
Garmin Connect IQ 공식 사이트

 

사이드로드에서 또 막힘

다 만들고 워치에 올리는 단계에서 마지막 함정이 있었다. macOS에서 Fenix 7을 USB로 꽂아도 /Volumes/GARMIN 같은 일반 저장장치로 마운트되지 않았다. 이 기기는 대용량 저장장치가 아니라 MTP 방식으로 붙기 때문이다. 그래서 파인더로는 파일을 못 넣고, OpenMTP나 libmtp 같은 MTP 도구를 써야 했다. 가민 Express가 떠 있으면 충돌하니 완전히 종료한 다음, 빌드한 .prg 파일을 워치의 GARMIN/Apps/ 경로에 복사하는 식으로 사이드로드했다.

 

OpenMTP — macOS에서 Garmin 워치를 MTP 기기로 인식해 파일을 옮기는 도구
OpenMTP — macOS에서 Garmin 워치를 MTP 기기로 인식해 파일을 옮기는 도구

 

정리하면 워치페이스 하나 만드는데 넘어야 할 벽이 세 개였다. 워치 플랫폼의 5분 실행 제한(폰 컴패니언으로 우회), 실시간성(15초 폴링 + sendMessage), 그리고 macOS에서의 MTP 사이드로드. 손목에서 점수 보는 소소한 목표였는데, 플랫폼 제약을 이해하고 역할을 나누는 좋은 연습이 됐다.

덧붙이면 점수 데이터를 어디서 가져오는지는 그 출처의 이용 조건을 확인하고 쓰는 게 맞다. 개인용으로 손목에 띄우는 것과 재배포는 다른 문제다.

참고

  • Garmin Connect IQ — Watch Face, 백그라운드 실행 제약
  • Connect IQ 앱 간 메시지 전달(sendMessage)
  • macOS에서 MTP 기기 접근(OpenMTP/libmtp), .prg 사이드로드 경로

공식 자료

워치·폰 메시지 API 확인

Garmin Connect IQ Toybox.Communications API 문서
Garmin Connect IQ Toybox.Communications API 문서

컴패니언 구조를 잡을 때는 워치 앱과 모바일 쪽이 어떤 메시지 형식을 주고받는지 Communications API에서 다시 확인했다. 폰이 점수를 가져오고 워치는 받은 상태만 그리는 경계를 유지하면 워치페이스의 실행 시간과 배터리 제약을 덜 건드릴 수 있다.

Toybox.Communications

관련글 더보기