최종 프로젝트에서 스프린트 2부터는 작업자의 건강 데이터를 수집할 필요가 생겼습니다.
가장 먼저 떠오른 방법은 웨어러블 디바이스를 활용한 데이터 수집이었습니다.
하지만 스프린트 주기가 2주였고, 실제 개발은 1주일 내에 완료되어야 테스트 및 피드백을 반영할 수 있었기 때문에 매우 빠듯한 일정이었습니다.
새로운 디바이스를 구매하기에는 시간이 부족했고, 마침 팀원 중 몇 명이 갤럭시 워치를 보유하고 있어, 이를 활용하여 Wear OS 앱 개발을 진행하게 되었습니다.
앱 개발을 시작할 때, 고려한 언어는 Kotlin과 React Native였습니다.
당시에는 아래와 같은 직관적인 판단으로 Kotlin을 선택했습니다:
"두 언어 중 익숙한 Java와 문법이 유사한 Kotlin이 낫겠지!"
회고를 쓰는 지금 되돌아보았을 때, 다행히도 올바른 선택이었습니다.
아래는 실제 Wear OS 앱 개발에 있어 세 언어를 비교한 표입니다:
| 항목 | Kotlin | Java | React Native |
|---|---|---|---|
| 🏆 구글 공식 권장 | ✅ 최우선 권장 | ⚠️ 지원되지만 구식 | ❌ 공식적으로 Wear OS 비권장 |
| 📦 Wear OS SDK 연동 | ✅ 완전 지원 | ⚠️ 사용 가능하나 복잡 | ❌ 직접 사용 불가, Native 모듈 필요 |
| 📲 센서 접근 / 배터리 최적화 | ✅ 최적화 용이 | ⚠️ 수동 처리 많음 | ❌ 불리함 (제한적 접근) |
| 🔄 Google Play Services 연동 (DataClient, FCM 등) | ✅ 쉬움 | ✅ 가능 | ⚠️ 복잡한 연동 필요 |
| 🔧 비동기 처리 | ✅ Coroutine 사용 가능 | ⚠️ Callback 위주 | ⚠️ Promise/Callback, Native 제약 존재 |
| 🧹 코드 간결성 / 생산성 | ✅ 높은 생산성, 간결한 문법 | ❌ verbose(장황함) | ✅ 간결하지만 커스터마이징 어려움 |
| 🧰 Jetpack / AndroidX 호환성 | ✅ 최상 | ⚠️ 제한적 | ❌ 직접 사용 불가 |
| 🌐 커뮤니티 / 문서 | ✅ 활발함 | ✅ 많음 | ⚠️ 웨어러블 관련 매우 적음 |
| 🧪 테스트 용이성 | ✅ 테스트 도구 풍부 | ✅ 가능 | ⚠️ Native 연동 테스트 복잡 |
웨어러블 앱을 본격적으로 개발하려면?
👉 Kotlin이 가장 적합합니다. (Google이 공식 권장)
기존 Java 앱을 사용하는 경우?
👉 Kotlin으로 점진적 마이그레이션을 권장
웹 기반 개발자지만 웨어러블은 부가 기능이라면?
👉 React Native는 모바일까지는 가능하나, Wear OS는 권장되지 않음
언어와 디바이스를 확정한 후, 데이터 수집 담당 팀원과 함께 하루 이틀 간 Android Studio 및 Kotlin 문법을 익히는 시간을 가졌습니다.
이후, 작업자를 식별하고 건강 데이터를 수집한 뒤 서버로 전송하는 구조를 설계하게 되었습니다.
초기에는 웨어러블 앱 자체에서 MQTT의 Pub 기능을 사용해 데이터를 전송했습니다.
해당 작업자 데이터 수집과 전송은 모두 포그라운드 서비스로 등록하였지만, 이 방식은 예상보다 배터리 소모가 매우 심했고, 웨어러블 기기의 사용성을 저하시켰습니다.
문제를 분석해보니, 일반적으로 Wear OS 앱은 센서 데이터를 수집만 하고,
데이터 전송은 Bluetooth나 DataClient를 통해 모바일 앱에서 수행하는 것이 일반적이라는 것을 알게 되었습니다.
이후 구조를 개선하여 다음과 같이 역할을 분리하였습니다:




짧은 시간 안에 처음 도전한 Wear OS 개발이었지만,
Kotlin의 간결한 문법과 Google의 강력한 공식 지원 덕분에 빠르게 구조를 개선하고 안정적인 시스템을 구축할 수 있었습니다.
특히 실전 환경에서 배터리 이슈와 통신 효율성을 직접 겪으며,
아키텍처를 유연하게 설계하는 경험을 얻을 수 있었던 점이 가장 큰 수확이었습니다.
다만, 배터리 효율을 고려해 MQTT 연결은 모바일 앱에 위임할 수밖에 없었고,
이로 인해 웨어러블과 모바일 간 거리가 멀어지는 경우 전송 실패 가능성이 생길 수 있습니다.
이를 보완하기 위해 앞으로는 다음과 같은 방안을 고려할 수 있을 것 같습니다: