5개로 흩어진 제조사 앱을 하나로 통합했습니다. MQTT 기반 실시간 명령, OTA 펌웨어 자동 배포, 생체 인증을 9개월간 설계·구현·운영했습니다.
24종 기기를 5개 다른 앱으로 제어해야 했고 펌웨어 업데이트는 수동 USB 방식, OTA 성공률 67%. 사용자 이탈이 누적되며 앱스토어 평점은 3.2점까지 떨어진 상태였습니다.
실시간성 · 신뢰성 · 배포 자동화 세 축에서 출발한 의사결정.
HTTP 폴링 대신 영구 연결 기반. QoS 1로 명령 유실 방지, Last Will로 기기 오프라인 즉시 감지.
iOS · Android 95% 코드 공유. 네이티브 모듈은 BLE/WiFi 페어링과 생체 인증 두 곳만 분리.
5% → 25% → 100% 카나리 배포. 실패율 임계치를 넘으면 자동 롤백, 펌웨어 성공률 67% → 99.2%.
Face ID/지문 인증 + 디바이스별 고유 인증서. 가전이 네트워크에 노출되어도 명령 변조 불가능.
단일 코드베이스로 iOS/Android. 생체 인증과 BLE 페어링은 네이티브 모듈로 분리. WebSocket으로 실시간 상태 수신.
Node.js Express + ws. JWT 인증과 디바이스 ACL 검증 후 MQTT 발행. Redis로 디바이스 온라인 상태 캐싱.
HiveMQ 클러스터 3노드. QoS 1로 명령 보장, Retain 메시지로 마지막 상태 복원, Last Will로 오프라인 즉시 감지.
AWS IoT Core Shadow로 디바이스 desired/reported 상태 분리. 오프라인 중 명령은 Shadow에 보관되었다가 재연결 시 적용.
앱스토어 공개 6개월 운영 평균 (2024.10-2025.03). 식별 정보는 익명 처리되었습니다.
MQTT QoS 1 + Last Will + Retain 조합이 오프라인 기기 상태 추적의 결정타였습니다. 앱에서는 늘 최신 상태가 즉시 보였고, 오프라인 전환은 평균 3초 안에 감지. Device Shadow와 결합하면서 사용자는 기기가 잠시 꺼져 있어도 명령을 자유롭게 보낼 수 있었습니다.
BLE/WiFi 듀얼 연결 시 상태 동기화 race condition. 페어링 직후 BLE 응답과 클라우드 Shadow 업데이트가 거의 동시에 도착하면서 앱 상태가 깜빡거리는 현상이 있었고, 초기 5주간 재현이 일정하지 않아 디버깅이 가장 까다로웠습니다. 최종적으로는 BLE 응답에 명시적 sequence 번호를 부여해서 해결.
처음부터 디바이스 시뮬레이터를 풍부하게 만들어 회귀 테스트를 자동화했을 것입니다. QA가 실물 기기 24종을 매번 확인하느라 회귀 테스트 1사이클이 평균 8시간 걸렸고, 이는 OTA 배포 속도의 직접적인 병목이었습니다. MQTT 가상 디바이스 풀과 시나리오 스크립트가 있었다면 CI 안에서 30분 안에 끝낼 수 있었습니다.