
iOS와 Android의 파편화된 블루투스 API를 하나로 묶어 비즈니스 유연성을 극대화한 쏘카프레임 설계기
쏘카, 일레클, 따릉이 등 다양한 모빌리티를 하나의 앱으로 제어하기 위해 쏘카가 구축한 커스텀 블루투스 모듈의 핵심 설계를 소개합니다. 로우 레벨 API의 한계를 극복하고 기기의 정체성을 클래스 단위로 응집시킨 '쏘카프레임'의 아키텍처와 그 가치를 다룹니다.
다양한 하드웨어 기기와 통신해야 하는 모바일 서비스를 개발하거나, 플랫폼 간 API 동작 차이로 인해 코드 중복에 시달리는 엔지니어에게 이 아키텍처를 추천합니다. 특히 확장성 있는 블루투스 라이브러리를 직접 설계하려는 팀에게 매우 유용한 가이드가 될 것입니다.
iOS의 CoreBluetooth와 Android의 bluetooth API는 하드웨어 추상화 계층에 대응하는 Low-Level 인터페이스로 제공되어 기기의 정체성이나 하위 비즈니스 맥락을 응집력 있게 담아내지 못하는 한계가 있었습니다. 또한, 두 플랫폼 간의 스캔 정책 및 콜백 구조의 차이로 인해 코드 파편화가 발생하고, 새로운 기기 도입 시마다 중복된 통신 로직을 작성해야 하는 유지보수의 어려움이 존재했습니다.
플랫폼 API 위에 '쏘카프레임 블루투스 모듈'이라는 새로운 추상화 계층을 구축하여 기기의 정적인 정체성(Spec)과 동적인 행동(Handle)을 분리하고, 이를 관리하는 BluetoothHost와 BluetoothRemote 개념을 도입했습니다. 특히 iOS의 단일 스캔 제한과 같은 플랫폼별 동작 차이를 해결하기 위해 여러 스캔 요청을 논리적으로 병합하는 '가상 스캔 매니저'를 구현하여 아키텍처를 통일했습니다.
하드웨어 제어와 비즈니스 로직의 완전한 분리를 통해 개발자가 스캔, 연결, 세션 유지 등의 복잡한 절차 대신 비즈니스 의도 구현에만 집중할 수 있는 환경을 조성했습니다. 새로운 기기 도입 시 기존 코드를 수정하지 않고 확장할 수 있는 구조를 확보했으며, 하드웨어 의존성을 제거한 Mock 객체 활용이 가능해져 물리적 기기 없이도 테스트 코드로 시스템 안정성을 검증할 수 있게 되었습니다.
Trade-off
본문에 명시적인 한계점은 기술되지 않았으나, 플랫폼 고유 API 위에 추가적인 추상화 레이어를 도입함에 따라 개발자의 초기 학습 곡선이 발생하고 모듈 자체의 유지보수 비용이 추가될 수 있습니다. 또한, 극도로 정밀한 하드웨어 직접 제어가 필요한 특수 케이스에서는 추상화 계층이 제공하는 인터페이스 외에 추가적인 우회 경로 설계가 필요할 가능성이 일반적으로 예상됩니다.
블루투스 연결 관리자와 기기 대상을 추상화한 개념으로, 기기의 생명주기와 통신 콜백을 관리하는 핵심 인터페이스입니다.
기기의 고유 식별 정보와 실제 통신 과정에서 수행할 비즈니스 행동 지침을 분리하여 정의한 명세입니다.
OS의 스캔 정책 제약을 모듈 레벨에서 해결하기 위해 여러 스캔 요청을 논리적으로 병합하는 매니저입니다.




