6개 화물 플랫폼의 오더를 내비게이션 안으로신사업
화물 오더 수량 업계 2위 — 길안내 앱이 화물 운송 중개 시장에 들어선 출발점
- 정해진 규격이 없었다 — 6개사(화물잇고LG유플러스더운반CJ대한통운고트럭현대커머셜원콜화물맨등) 시스템이 제각각이라, 오더 수신부터 배차까지 이어지는 앱 간 연동 인터페이스를 설계해 문서로 만듦
- 그 문서가 6개사 연동 개발의 공통 기준 — 상대 회사들이 이 문서를 보고 자기 앱을 개발
- 스펙 협의부터 이슈 대응까지 개발자가 전담 — LG유플러스·CJ대한통운·현대커머셜 등과 커뮤니케이션
- Intent 앱투앱 · 버전 분기로 구현 — 앱 간 오더·경로 전달을 Intent로 잇고, 상대 앱 버전에 따라 동작을 나눠 처리
운영을 멈추지 않고 레거시를 Kotlin · 코루틴으로코드 품질
전면 재작성 없이 Java 앱을 Kotlin 52%까지 — 서비스를 운영하면서
- 한 번에 새로 짤 수는 없었다 — 약 1,130개 파일이 쌓인 대부분 콜백 기반 Java 코드베이스
- 기준을 나눴다 — 신규 기능을 만들거나 기존 네트워크 프로토콜을 수정할 때는 코루틴 위주로, 손대지 않는 레거시 콜백은 그대로
- 수정할 코드에 콜백이 중첩돼 있으면 함께 전환 — 콜백 기반이던 구글 로그인은 Credential Manager 전환과 함께 Firebase의 Task를 await()로 감싸 suspend 흐름으로 정리
- 신규·수정 API는 처음부터 suspend function — 포인트·다중경유지 상태 조회 등
- Kotlin 전환도 같은 기준 — 신규 개발은 전부 Kotlin, 레거시는 자주 손대는 코드부터 포팅해 수정할 때마다 null 안전성 확보
- 뷰 참조 방식도 함께 현대화 — Kotlin synthetic 지원 종료로 앱 전역의 뷰 접근을 ViewBinding·DataBinding으로 이전. 화면 단위로 5개월에 나눠 진행
로그에 안 잡히는 크래시를 C++ · 렌더링 계층에서 해결내비게이션 도메인
크래시프리율 99.8%를 받치는 기반 — 원인이 있는 계층에서 해결
- 왜 안 잡혔나 — 지도 렌더링과 경로 탐색·맵매칭이 모두 C++ 엔진에서 도는 앱이라, 크래시가 Kotlin 스택트레이스에 남지 않는 계층에서 발생
- 특정 GPU(Adreno)에서만 터지던 지도 크래시 — 렌더링 방식이 원인이어서 client vertex array를 VBO로 바꿔 해결
- use-after-free — 렌더 스레드가 경로 정점 배열을 읽는 동안 워커 스레드가 그 배열을 해제·교체하던 문제를 정점 배열 전용 락으로 차단
- shared_ptr refcount 레이스 — 맵매칭의 대입을 std::move로 바꾸고 진입점에 lock_guard를 걸어 해결
- double-free — 워커 스레드가 중복 생성되던 것을 초기화 재진입 가드로 차단
- 렌더 프레임이 끊기지 않도록 락 범위는 최소로
- C++ 계층의 Protocol Buffers — 경로 응답을 파싱하는 구간의 공유 변수를 제거·분리해 탐색 스레드 간 데이터 불일치를 없앰
- JNI 양방향 호출 — Kotlin이 엔진을 부르고 엔진이 다시 JVM을 콜백하는 구조라, 그 구간의 스레드 어태치 생명주기(GetEnv → AttachCurrentThread → DetachCurrentThread)까지 처리
백엔드 공백 2개월을 DB · 서버 · 앱 전 구간에서 메움경계 확장
DB 컬럼 추가 → 서버 프로토콜 확장 → 앱 연동까지 맡아 기획 일정 그대로 출시
- 검색 필터 확장 기획은 확정됐지만 백엔드 담당자가 2개월 장기 부재 중 — 두 달을 미룰 사안이 아니라고 판단. 자원해 승인 얻어 진행
- 문서에 변경을 남김 — 복귀한 담당자가 바로 파악할 수 있도록 Swagger·DB 테이블 문서에 기록
- 기존 데이터에 영향이 가지 않도록 새 컬럼에 기본값 지정
- 하위 호환을 검증 — 필드가 빠졌을 때 구버전이 정상 동작하는지까지 확인한 뒤 개발서버 선적용을 거쳐 서비스에 반영
주행 중에도 버튼 하나로 — 기사 간 실시간 음성 무전킬러 서비스
녹음·전송·수신·재생을 끊기지 않게 잇는 파이프라인을 설계
- 주행 중엔 화면도 타이핑도 못 쓴다 — 기사끼리 도로·상하차 상황을 주고받을 방법이 없던 것이 출발점
- 송수신 파이프라인 전체 설계 — MediaRecorder(AAC) 녹음 → 서버 전송 → 소켓 수신 알림 → MediaPlayer 재생
- 여러 사람이 동시에 보내도 재생은 하나씩 순서대로 — 수신한 음성을 재생 큐에 쌓고, 큐의 add·poll이 반드시 진입점 하나만 거치게 만든 뒤 락으로 감싸 동시 접근을 차단
- 재생에 실패한 음성은 큐 앞으로 되돌려 순서를 보존. 무전이 몰려도 메모리가 늘지 않도록 큐에 상한을 설정
- 별도 백그라운드 스레드가 짧은 주기로 상태를 확인해 다음 음성으로 넘기고, 길안내·통화 음성과 겹칠 때는 오디오 포커스로 조정
- 녹음·재생 동시 발생, 같은 음성 중복 전송 문제도 이 구조로 정리 — 소켓 재연결, Visualizer 레벨미터까지 구현
매출 0원에서 DAU의 10%가 구독하는 서비스로수익 모델 전환
가입부터 해지까지 결제 전 과정을 앱이 책임지는 구조
- 스토어 인앱결제 대신 자체 PG 직접결제를 택함 — 스토어가 대신해 주던 구독 상태 관리·갱신·이상 거래 방어가 전부 앱의 몫이 되는 선택. 스토어 수수료를 부담하지 않는 수익 구조는 이 선택의 결과
- 결제를 상태머신으로 설계 — 주문 중복 방어, 실패 유형별 복구 플로우
- 정기결제 라이프사이클 전체 구현 — 결제수단 CRUD·대표수단 판정, 출금동의 인증(카카오 알림톡), 현금영수증 발행
- 유료화 초기 가입 유도와 이후 조정 — 소개 화면을 끝까지 봐야 무료로 넘어가게 해 유료화 인지·가입률을 올리고, 컴플레인은 CS 집중 대응 기간에만 감수. 안정기 진입 후 강제 장치를 빼고 혜택을 한 화면에 모은 카드형으로 개편
- 카드 입력 단계 이탈 원인 추적 — 가입 퍼널에서 카드 입력 화면 이탈을 확인하고, 키패드 사용성·앱 오류 로그·서버 유효성 판단 로그로 오탈자가 생기는 지점을 찾음
- 오탈자 지점을 하나씩 제거 — 마스킹용 입력 타입이 키패드를 기본형으로 바꿔 오탈자를 유발하던 문제를 숫자 키패드는 유지하고 표시 텍스트만 마스킹으로 변환해 해소, 실패 원인(카드번호·유효기간·생년월일·비밀번호)별로 틀린 칸만 비우고 포커스를 옮겨 안내, 등록 직후 쿠폰·본인인증으로 자동 진행. 이탈 감소 확인
- 퍼널을 흐름별로 재정리 — 가입·결제수단·해지로 묶어 팀장·대표가 이탈 구간을 바로 확인
- Google Play Billing도 별도 구현·테스트 — 두 결제 체계를 모두 다룸
출시 다음 날 지표 회귀를 감지해 롤백 — 170회+ 릴리즈 운영운영 규율
출시 시간대 · 지표 감시 · 롤백 기준을 규칙으로 — 문제는 같은 날 안에 되돌리거나 고쳐서 재배포
- 배포는 오전에 올린다 — 자동 업데이트가 기기 유휴·충전 상태인 새벽에 몰리므로, 대다수에게 퍼지기 전 지표를 확인할 하루를 확보. 문제가 보이면 그날 오후에 고쳐 재출시
- 크래시프리 99.83% → 95% 회귀를 출시 후 지표에서 감지 — 내가 넣은 크래시 방어 패치가 원인
- 하루 안에 롤백 — 감지 당일에 이전 버전으로 되돌리고, 원인을 고쳐 재출시
- 변경 범위가 크거나 영향을 예측하기 어려우면 단계적 출시 — 일부 사용자에게 먼저 내보내 확인
'30일 후 앱 삭제' 통보를 받은 가입자 21만 앱을 지켜냄위기 대응
원인 분석 → 개선 배포 → 이의신청을 병행 — 기한 내 해소
- 통보문만으로는 무엇이 위반인지 특정할 수 없었다 — 기한 내 미조치 시 스토어에서 앱 삭제 예고. 정확한 위반 지점은 알려주지 않음
- 정책 문구와 앱 화면을 하나씩 대조해 원인 후보를 좁히고 개선 버전을 배포
- 동시에 이의신청·구글 정책팀과 직접 소통으로 판단 근거를 확인
- 이후 정책 변화를 선제 처리하는 루틴을 만듦 — App Links 전환, 차세대 기기 16KB 페이지 크기 대응 등
감으로 정하던 수십 곳 배송 순서를 엑셀 한 번으로신규 구축
엑셀 업로드 한 번이면 최적 방문 순서를 자동 산출 — 배송 완료까지 앱이 관리
- 클라이언트 파이프라인 전체 구축 — 엑셀(XLSX/CSV) 대량 업로드 파싱 → 주소 정제 → 순서 최적화 연동
- 최적화된 배송 태스크의 상태 관리 — 운송중·완료 처리, 드래그 순서 편집, 재최적화 요청
- 실사용 시나리오를 전용 UI 20여 화면으로 — 배송 목록 공유, 최종 목적지 분기(출발지 복귀 / 차고지 / 마지막 배송지)