가민 워치 앱 개발 (Connect IQ, Monkey C, 워치페이스)
마라톤 풀코스를 뛰어보겠다고 당근에서 중고 가민 워치를 장만했습니다. 그런데 워치를 손목에 차고 며칠 지나자 엉뚱한 생각이 들더군요. 이걸로 앱을 직접 만들 수는 없을까? 탈모약을 매일 까먹고, 웃음 연습 초시계도 따로 들고 다니던 저에게, 손목 위의 작은 화면은 갑자기 다르게 보이기 시작했습니다.
가민 워치를 샀더니 개발자 본능이 깨어났다
처음엔 그냥 러닝용으로 샀습니다. 좀 비싸서 당근마켓에서 중고로 샀고, 제 생애 첫 스마트워치였습니다. 가민은 러너들 사이에서 워낙 유명해서 망설임 없이 선택했는데, 막상 차고 보니 달리기 기록 말고도 뭔가 더 할 수 있을 것 같다는 느낌이 왔습니다.
매일 탈모약을 먹었는지 안 먹었는지 까먹는 게 저의 오랜 고민이었습니다. 핸드폰을 꺼내서 앱을 열고 체크하는 과정이 생각보다 번거롭거든요. 특히 핸드폰을 아예 안 가지고 나간 날은 그냥 포기하기 일쑤였습니다. 워치가 손목에 있으니, 버튼 하나로 “오늘 탈모약 먹음” 표시를 할 수 있으면 얼마나 좋을까 싶었습니다.
그뿐만이 아니었습니다. 당시 저는 예쁜 미소를 갖고 싶어서 매일 초시계를 들고 웃음 근육 훈련을 하고 있었고, 인터넷 사용을 줄이겠다는 목표로 D-day 카운터도 필요했습니다. 만약 목표를 어기면 카운터를 0으로 리셋하는 방식이었는데, 이걸 워치에서 바로 조작할 수 있다면 훨씬 습관 추적이 쉬울 것 같았습니다. 그렇게 Connect IQ 개발에 발을 들이게 됐습니다.
Connect IQ는 가민이 제공하는 웨어러블 앱 개발 플랫폼입니다. 쉽게 말해 애플 앱스토어나 구글 플레이처럼, 가민 기기에서 동작하는 앱을 만들고 배포할 수 있는 생태계 전체를 가리킵니다. 이 플랫폼 위에서 개발자는 워치페이스(Watch Face), 데이터 필드, 위젯 등 다양한 앱 유형을 제작할 수 있습니다. 가민 공식 개발자 문서(출처: Garmin Developer)에는 Connect IQ가 “Wear, Where, Ware”라는 세 가지 철학을 기반으로 한다고 나와 있는데, 단순히 디바이스를 넘어서 개발자가 가민 생태계 안에 직접 참여할 수 있다는 점이 핵심입니다.
Monkey C로 앱을 짜면서 밤을 새운 이야기
Connect IQ 앱은 Monkey C라는 언어로 작성합니다. Monkey C는 가민이 자체 설계한 객체지향 프로그래밍 언어입니다. 객체지향(Object-Oriented)이란 데이터와 기능을 하나의 덩어리로 묶어서 관리하는 방식인데, Java나 Python을 써본 분이라면 금방 익숙해집니다. 저도 처음 봤을 때 문법이 크게 낯설지 않아서 어느 정도 자신이 있었습니다.
그런데 직접 겪어보니, 자신감은 사흘도 안 가더군요. Monkey C가 쓰기 쉽게 설계된 건 맞지만, 가민 기기마다 화면 크기, 버튼 배치, 센서 구성이 조금씩 달라서 이 차이를 하나하나 맞춰가는 과정이 만만치 않았습니다. 가민 기기는 둥근 화면과 사각 화면이 따로 존재하고, 터치스크린 유무도 제품마다 다릅니다. API 단편화(API Fragmentation) 문제가 바로 여기서 생깁니다. API 단편화란 기기마다 지원하는 기능 목록이 달라서, 하나의 코드로 모든 기기를 동시에 커버하기 어려운 상황을 뜻합니다.
가민은 이 문제를 “기기에 기능이 있으면 해당 API를 제공하고, 없으면 제공하지 않는다”는 방식으로 풀었습니다. 예를 들어 지자기 센서가 내장된 기기라면 Magnetometer API를 사용할 수 있고, 없는 기기라면 그 API 자체가 존재하지 않습니다. 그리고 앱 안에서 has 연산자를 사용하면, 특정 API가 실제로 존재하는지 런타임(Runtime)에, 즉 앱이 실행되는 순간에 동적으로 확인할 수 있습니다. 이 덕분에 기기가 달라도 앱이 무조건 죽어버리는 상황을 어느 정도 방지할 수 있었습니다.
또 하나 신기했던 건 리소스 컴파일러(Resource Compiler)입니다. 리소스 컴파일러란 이미지나 폰트 같은 시각적 자원을 기기별 해상도와 색상 팔레트에 맞게 자동으로 변환해주는 도구입니다. 개발자가 직접 기기마다 이미지를 일일이 변환하지 않아도 된다는 뜻이라 처음 이 기능을 알았을 때는 꽤 편리하다고 느꼈습니다.
그럼에도 불구하고 솔직히 이건 예상 밖이었습니다. 당시는 지금처럼 AI가 코딩을 도와주던 시절이 아니라서, 한 줄 한 줄을 공식 문서와 커뮤니티 글을 뒤지며 손으로 짰습니다. 일이 끝나면 밤마다 워치 시뮬레이터를 켜고, 자정을 넘기기 일쑤였습니다. 어쩔 때는 진짜로 “누가 대신 만들어줬으면 좋겠다”는 생각도 들었습니다. 그래도 결국 어쩔 수 없이 너무 재밌어서 멈추지 못했습니다.
Connect IQ SDK가 지원하는 앱 유형은 크게 아래와 같이 나뉩니다.
- 워치페이스(Watch Face): 홈 화면에 표시되는 시계 화면. 심박수, 달린 거리 등 건강 데이터를 함께 보여줄 수 있습니다.
- 위젯(Widget): 버튼 한 번으로 빠르게 열 수 있는 간단한 기능 앱. 탈모약 체크처럼 단순한 입력에 적합합니다.
- 데이터 필드(Data Field): 러닝이나 사이클링 중 실시간 데이터를 화면에 표시하는 앱 유형입니다.
- 앱(App): 독립적으로 실행되는 완전한 애플리케이션. 미소 연습 타이머처럼 별도 UI가 필요한 기능에 어울립니다.
저는 이 중에서 워치페이스와 위젯, 앱을 섞어서 제가 원하는 기능을 하나씩 구현했습니다. 웨어러블 앱 개발의 생태계 전반에 대해서는 스마트워치 개발 관련 자료를 정리한 IEEE Xplore의 연구들(출처: IEEE Xplore)을 참고하면 개발 트렌드를 넓게 이해하는 데 도움이 됩니다.
내 손목 위에 올라간 나만의 앱들
수많은 밤을 거쳐서 완성한 앱은 총 네 가지입니다. 탈모약 체크 앱, 미소 연습 타이머 앱, 인터넷 사용 자제 D-day 앱, 그리고 홈 워치페이스입니다. 제 경험상 이건 좀 다릅니다. 시중에 나온 앱을 아무리 찾아봐도 딱 이 용도에 맞는 게 없었는데, 직접 만들고 나니 일상이 진짜로 달라졌습니다.
탈모약 체크 앱은 간단합니다. 워치에서 롱클릭 한 번이면 오늘 먹음 상태가 기록됩니다. 핸드폰을 꺼낼 필요도, 앱을 열 필요도 없습니다. 이 작은 차이가 습관을 만드는 데 생각보다 훨씬 크게 작용했습니다. 웨어러블 기기의 핵심 장점이 바로 이겁니다. 사용자가 기기를 찾아가는 게 아니라, 기기가 이미 몸에 붙어 있다는 것.
미소 연습 타이머는 초시계 형태로 만들었습니다. 워치 화면에 카운트가 올라가는 걸 보면서 웃음 근육을 훈련하는 방식인데, 핸드폰으로 초시계 앱을 켜고 바닥에 내려놓고 하던 것과 비교하면 편의성이 완전히 다릅니다. 제가 직접 써봤는데 꾸준히 쓰게 되더라고요.
D-day 앱은 인터넷 사용을 자제한 날수를 누적하는 방식입니다. API 레벨(API Level)이라는 개념이 여기서도 영향을 줬는데, API 레벨이란 기기가 지원하는 기능의 버전을 숫자로 표시한 것으로, 낮은 레벨의 기기에서는 최신 기능을 쓸 수 없습니다. 제 워치가 지원하는 API 레벨에 맞춰서 데이터 저장 방식을 조율해야 했고, 그 과정이 생각보다 복잡했습니다.
홈 워치페이스에는 현재 심박수와 이번 달 달린 총 거리를 한눈에 볼 수 있게 넣었습니다. 러닝 훈련을 하면서 월간 누적 거리가 워치 화면에 바로 보이니, 매일 뛰고 싶은 동기가 더 생기더군요. 제가 원하는 것들을 직접 구현해서 손목에 올려놨을 때의 그 뿌듯함은 정말 말로 표현하기 어렵습니다.
자주 묻는 질문
Q. 가민 워치 앱 개발은 프로그래밍 경험이 없어도 할 수 있나요?
A. 완전한 비전공자라면 진입 장벽이 꽤 높습니다. Monkey C 자체는 Java나 Python과 구조가 비슷해서 프로그래밍 기초가 있다면 비교적 빠르게 익힐 수 있지만, 기기마다 다른 API 지원 범위를 파악하고 디버깅하는 과정은 공식 문서를 꼼꼼히 읽어야 합니다. 기초 문법부터 차근차근 익힌 뒤 도전하시길 권합니다.
Q. Connect IQ 앱을 만들면 가민 스토어에 올릴 수 있나요?
A. 네, 가능합니다. Connect IQ Store를 통해 배포할 수 있으며, 본인만 사용하는 비공개 앱으로 유지할 수도 있습니다. 저처럼 개인 습관 추적용으로만 쓰는 경우라면 굳이 공개 배포를 하지 않아도 되고, 개인 기기에서 바로 설치해서 쓸 수 있습니다.
Q. Monkey C와 다른 앱 개발 언어의 차이가 뭔가요?
A. 가장 큰 차이는 메모리 관리 방식입니다. Monkey C는 레퍼런스 카운팅(Reference Counting)을 사용해서 더 이상 사용하지 않는 메모리를 자동으로 정리합니다. 레퍼런스 카운팅이란 객체를 참조하는 횟수를 추적해서 0이 되면 자동으로 해제하는 방식입니다. 웨어러블 기기의 제한된 자원 환경에서 개발자가 메모리를 일일이 신경 쓰지 않아도 되도록 설계한 것입니다.
Q. 가민 워치 앱 개발에서 가장 어려운 부분은 무엇인가요?
A. 제 경험상 가장 고생한 부분은 기기별 화면 해상도와 API 레벨 차이를 맞추는 것이었습니다. 시뮬레이터에서는 잘 돌아가는데 실제 기기에서 레이아웃이 깨지거나, 특정 API가 없어서 앱이 멈추는 상황이 자주 생깁니다. has 연산자로 API 존재 여부를 미리 확인하는 습관을 들이면 상당 부분 예방할 수 있습니다.
Q. AI 없이 가민 앱 개발이 가능한가요?
A. 저는 AI가 지금처럼 활성화되기 전에 개발했는데, 가능하긴 하지만 공식 문서와 가민 개발자 포럼을 정말 많이 읽어야 합니다. 지금이라면 AI 도구와 함께 개발하면 훨씬 수월할 것 같습니다. 당시 저는 한 줄 한 줄 손으로 짜면서 밤을 새웠는데, 그 시간이 아깝기보다는 오히려 더 깊이 이해하게 된 계기가 됐습니다.
결국 저는 제가 원하는 앱 네 개를 모두 완성했고, 지금도 매일 손목에서 그 앱들을 씁니다. 가민 워치가 러닝 기록계에서 저만의 습관 관리 도구로 바뀐 셈입니다. 워치앱 개발이 어렵다는 건 사실이지만, 핸드폰 없이도 손목 하나로 일상의 사소한 것들을 기록할 수 있다는 경험은 정말 달랐습니다. Connect IQ와 Monkey C에 관심이 생겼다면, 가민 공식 개발자 사이트에서 SDK를 무료로 내려받아서 시뮬레이터부터 돌려보시길 권합니다. 첫 워치페이스 하나만 완성해봐도 그 다음이 보이기 시작합니다.
—
참고: https://developer.garmin.com/connect-iq/connect-iq-basics/