하루하루 발전할 수 있도록 노력하는 개발자, 전희훈입니다.

Email
[email protected]
Phone Number
010-8950-7211
Blog
https://citytexi.tistory.com/
Github
citytexi - Overview
Portfolio
https://pleasurehun99.notion.site/portfolio
https://notion-ga.ohwhos.now.sh/collect?tid=G-4TZ9HCZ58V&host=pleasurehun99.notion.so&page=/notion-resume
Contents
간단 소개
Android 개발 만 3년, KMP · Compose Multiplatform 단일 코드베이스로 신규 앱 2종을 런칭했고, 기존 Android 앱 1종의 CMP 전환을 맡았습니다. 런칭한 앱은 이후 운영까지 이어서 담당했습니다.
BLE 자체 패킷 프로토콜, RTSP 라이브 뷰, Unity 임베드처럼 하드웨어·네이티브 인접 영역도 직접 다뤘습니다.
Experience

아이나비시스템즈
Android / KMP 개발 (모빌리티개발셀)
2024.08 ~ 재직 중
주임 연구원
아이나비 스탬프 - 오르다
2026.04 ~ 진행 중 (SKT 친구찾기와 병행)
코스 따라가기, 만보기, 등산, 자전거 등 운동 기록을 관리하고 GPS 기반 스탬프를 모으는 건강 관리 앱
- 역할: 팀 약 20명 중 1명. 기존 Android 앱을 CMP로 전환하는 시드 작업과 디자인 시스템 초기 구축을 맡았고, 이후 Wear OS 앱을 단독 개발
- 담당: 오르다 유지보수, 신규 기능 추가, 웨어러블 앱 신규 개발
- 전환 초기 구조(모듈 경계, 화면 추가 패턴, 디자인 시스템 기본 컴포넌트)를 잡아두고, 이후 합류한 팀원이 같은 패턴으로 화면을 이어 붙이도록 정리
Wear OS 앱 신규 개발 (2026.07 착수 ~ 진행 중)
- 진행 상태: 1차 버전 플레이스토어 배포 대기. 아래 항목이 그 1차 버전 범위
- 워치 생체, 모션 데이터를 1Hz 스냅샷으로 수집하는 파이프라인 구성
- Samsung Health Sensor SDK 기반 SpO2 주기 측정, Health Services, SensorManager 가속도, FusedLocation 수집기를 공통 인터페이스로 통합
- 센서 값이 없는 구간에 직전 값이 그대로 남던 문제. 수집기가 availability 상태와 무관하게 마지막 값을 내보낸 게 원인이라, 센서별 유효 · 무효를 게이트로 함께 기록하도록 변경
- 가속도 센서에
maxReportLatency 배치를 걸어 AP 웨이크업을 줄였더니 버퍼가 비는 구간이 생김. 배치 주기와 1Hz drain 주기가 어긋난 것이라 두 주기를 맞춰 배치 간격 재조정
- 폰 ↔ 워치 세션 채널 연동
- Wearable Data Layer 메시지 path 계약과 채널을 정의
- 폰 세션이 끝나도 채널이 닫히지 않고 남던 누수. 종료 경로에 채널 해제가 빠져 있어 세션 종료 플로우에 해제를 명시적으로 추가
- 워치 콜드스타트 시 폰의 녹화 상태를 되물어 자동 재연결
- 연결 핸드셰이크의 경쟁 상태, 재진입, 리스너 누수 등 동시성 버그 다수 수정
- 워치 앱 UI를 MVI 구조로 도입해 권한 · 녹화 세션 · 홈 상태를 분리
- 폰 앱(KMP)에는 워치 연동을
expect/actual DataSource로 노출하고, 페어링 · 근거리 · 앱 도달 여부 확인과 원격 기동을 UseCase로 정리. 공통 모듈에 Android 전용 코드가 섞이지 않도록 분리해 iOS 빌드까지 함께 통과
SKT 친구찾기
2025.08 ~ 진행 중 (오르다와 병행)
KMP, Compose Multiplatform 단일 코드베이스로 만든 통신사 LBS 친구 찾기 앱. 기존 출시된 10만 다운로드 친구찾기, 자녀안심 앱 서비스 리뉴얼
- 역할: 첫 커밋부터 합류한 코어 4명(CMP 3명 + 서버 1명) 중 CMP 1명
- 맡은 영역: 디자인 시스템, 지도 SDK 추상화, 통신사 인증 연동, KMP 모듈 구조 정리, KMP 컨벤션 · 온보딩 가이드
- 운영: 양 플랫폼 동시 운영 중
- 디자인 시스템 구축 (23개 카테고리)
- 디자이너가 따로 검수할 수 있도록 미리보기 앱을 별도 분리
- iOS 빌드가 깨지던 문제. Android 전용 의존성(Firebase SDK, T-Auth)이 commonMain에 섞여 들어간 게 원인이라, 해당 의존성을 별도 셸 모듈로 분리해 구조로 차단. 재발 여부는 머지 전 iOS 로컬 빌드로 확인(당시 CI에 iOS 빌드는 없었음)
- iNavi Maps Native SDK 를
commonMain 에 expect/actual 로 추상화
- Android + iOS xcframework cinterops 연동
- 마커 · 경로 · 원 그리기, 카메라 이벤트, 라이프사이클 등 Composable 7종
- 통신사 인증: KMC 본인확인 WebView JS Bridge를 양 플랫폼에 구현하고, T-Auth · T-ID 연동에 성인/미성년자/보호자 다단계 가입 분기까지 처리
- KMP 컨벤션 · 온보딩 · 코드 생성 자동화 가이드를 사내 표준 라이브러리로 만들어, 새로 합류한 팀원이 별도 설명 없이 같은 패턴으로 화면을 추가할 수 있도록 개발
Heptone TINA
2024.11 ~ 2025.10
KMP, CMP 단일 코드베이스로 만든 Web3 위치기반 데이터 크라우드소싱 리워드 앱
- 역할: 기획 · 디자인 포함 6명 팀에서 개발 3명 중 1명
- 2024.11 초기 셋업부터 2025.10 타 조직 인계까지 담당
- 모듈 경계 설계(단독): service와 source를 인터페이스/구현 페어 모듈로 분리. 백엔드 DTO가 바뀌어도 수정 범위가 구현 모듈 안에서 끝나도록 경계를 나눔
- 자체 디자인 시스템 구현(공동)
- 컴포넌트 32종(그중 절반 이상 직접 구현), Typography 18계열
- 자식 슬롯 구조(trailing/leading/content)를 일괄 통일
- Preview를 androidMain에서 commonMain으로 옮겨 양 플랫폼에서 함께 확인 가능하도록 수정
- MapLibre Native 11.9를 Android · iOS xcframework cinterops로 듀얼 구현(공동)
- Web3 지갑 통합(Wepin + phantom) 공동 구현
BMW ACE 3.0
2024.10 ~ 2025.01
BMW - MINI Global OEM 액세서리 옵션 대시캠(Advanced Car Eye 3.0) 연동 앱
row / na / cn 권역별 멀티 플레이버 대응
- 역할: 팀 6명 중 1명으로 영상 재생, BLE 페어링, WiFi 자동 연결, 다운로드, 펌웨어 OTA 도메인 유지보수
- WiFi 연결 직후 썸네일 로드가 간헐적으로 실패하던 문제
Personal Experience