pile·
프론트엔드·쏘카쏘카·

쏘카프레임 블루투스 모듈 — iOS/Android 파편화된 BLE API를 통합 추상화한 모바일 SDK 설계

쏘카의 모바일 앱 프레임워크 SocarFrame의 블루투스 모듈 아키텍처를 소개한다. iOS CoreBluetooth와 Android Bluetooth API의 파편화 문제를 해결하기 위해 BluetoothHost/BluetoothRemote/BluetoothSpec/BluetoothHandle 4개 추상화 계층을 구축한 설계다. 쏘카 차량(STS), 일레클, 따릉이를 하나의 모듈로 제어하는 before/after 의사 코드와 함께 실용적인 설계 원칙을 보여준다.

핵심 포인트
  • iOS CBPeripheral·Android BluetoothDevice는 Low-Level API로 기기의 맥락(식별/통신규격/동작)을 응집하지 못함 — BluetoothRemote로 기기 정체성 추상화
  • iOS 단일 스캔 정책(중복 스캔 불허) vs Android 중복 허용 차이 — 가상 스캔 매니저로 다중 요청 병합해 OS에 단일 최적화 요청 전달
  • BluetoothSpec(정적 정체성: CarID/UUID)과 BluetoothHandle(동적 행동: aliveMessage/보안 커맨드) 분리 — 물리 연결 유지하며 비즈니스 로직 실시간 교체 가능
  • 새 기기 추가 시 BluetoothHost 수정 없이 BluetoothRemote 구현체만 추가(수평 확장), 기능 고도화는 상속으로(수직 확장)
  • BluetoothCore(범용 플랫폼 로직)와 BluetoothCommon(쏘카 전용 로직) 레이어 분리로 오픈소스 공개 가능성 확보
상세 정리
  • 비즈니스 배경: STS 단말(차량), 일레클, 따릉이가 블루투스+서버 혼합 통신, 블루투스 우선 → 실패 시 서버 폴백
  • 문제 1 — 맥락 파편화: 스캔/연결/송수신 Delegate 콜백이 분산, Raw Data에서 기기 맥락 직접 재구성 필요
  • 문제 2 — 플랫폼 동작 차이: iOS scanForPeripherals는 중복 스캔 불허, 가상 스캔 매니저가 앱 내 다중 요청 병합해 해결
  • BluetoothHost: 리모트 목록 관리 + 생명주기 이벤트 콜백(onCreate/onConnect/onFinish) 호출 담당
  • BluetoothRemote: 기기별 초기화 루틴·Read/Write 규칙 캡슐화, ConnectfulRemote 등 파생 레이어로 수직 확장
  • Before(플랫폼만): didConnect/requestUnlock/didReceive/handleError 각각에 device.type switch 분기 — 새 기기마다 4곳 수정 필요
  • After(쏘카프레임): BluetoothHandle 선언 + host.addHandle() + remote.request(commandUnlock) — 기기 추가는 모듈 단에만
  • 테스트 용이성: 하드웨어 의존성 분리로 Mock 객체 구현 가능, 연결 끊김·패킷 유실 등 물리 재현 불가 시나리오 코드 검증 가능
  • 오픈소스 레이어: BluetoothCore(Host/Remote/Handle/Spec)는 쏘카 비즈니스 로직 없는 범용 계층으로 공개 가능성 보유
왜 읽나여러 이기종 블루투스 기기를 통합 제어해야 하는 모바일 서비스의 SDK 아키텍처를 설계할 때 참고하기 좋다. Before/After 의사 코드와 BluetoothSpec/Handle 분리 패턴이 구체적이어서 바로 적용하기 쉽다.
쏘카
쏘카 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 프론트엔드·LINE EngineeringLINE Engineering·

    AI로 웹 엔지니어 없이 LINE 앱 안에서 그룹 영상 통화 서비스 만들기

    LINE Planet 팀의 PM과 Android 엔지니어 두 명이 웹 전문 엔지니어 없이 LINE 앱 내에서 그룹 영상 통화 서비스를 개발한 과정을 다룬다. LIFF(LINE Front-end Framework)와 LINE Planet SDK를 활용해 React/Vite 기반 웹 앱을 구성했고, Firebase Cloud Functions로 별도 서버 인프라 없이 구현을 완료했다.

    #react#webrtc#firebase+2