About / Experience
모바일 엔지니어
김민준입니다.
Swift 기반 iOS 개발을 중심으로 React Native 앱까지 개발·심사·출시·운영해 왔습니다(경력 4년 4개월). B2B 데이터 수집 SDK와 인증 서버를 설계하고, 사내 CI/CD도 맡았습니다. 구현에는 AI 코딩 에이전트를 쓰고, 결과는 직접 검증합니다. 문제는 측정과 재현으로 원인부터 찾고, 결정과 근거를 문서로 남깁니다.
01 / Experience
Personal AI(구 SNPLAB)
개발팀(구 앱팀) · 선임연구원 · 정규직
2022.06.02 — 2026.10.19
MyD의 iOS 기능 개발·심사·배포를 맡았고, React Native 앱의 양 플랫폼 출시와 모바일 신분증 모듈 통합을 수행했습니다. 2026년에는 사내 고객 문의 자동 답변(RAG)을 운영에 연결했고, B2B 고객사 앱이 공공기관 데이터(건강검진·안전교육 이수)를 가져오게 하는 SDK와 인증 서버를 설계했습니다. 구현은 AI 코딩 에이전트 위주로 하고, 결과는 직접 검증했습니다. 사내 CI·배포·모니터링 구성도 맡았습니다.
- 주력 기술
- Swift · SwiftUI · Swift Concurrency
- 크로스플랫폼
- React Native · TypeScript
02 / Projects
주요 프로젝트
프로젝트별로 직접 개발한 기능, 해결한 문제, 참여 범위를 정리했습니다.
- 2022.06 — 2026.10
MyD · 개인 데이터 지갑
iOS 기능 개발 · 데이터·인증 연동 · 심사·배포(2022.06 이후 87개 버전 출시, 심사 제출 대부분 직접) · 운영
2026년 7~9월 MyD iOS 앱 전체의 crash-free 세션 비율은 99.8%였습니다(Crashlytics 기준).
- iOS 26.4 업데이트 직후 발생한 스플래시 정지를 네트워크 확인 타이밍 문제로 특정하고, 긴급 심사 요청으로 제출 8시간 만에 패치를 배포했습니다.
- 홈에서 뒤로 가기 스와이프 후 화면과 터치가 멈추는 원인을 찾았습니다. SceneDelegate의 뒤로 가기 제스처 설정이 항상 허용을 반환하고 있었습니다. 돌아갈 화면이 있고 다른 화면 전환이 없을 때만 허용하고, Flutter 화면 전환 전후에 설정을 저장·복원했습니다. 허용 조건은 회귀 테스트로 고정했습니다.
- 2024년 Flutter 도입 후 중단된 iOS Jenkins CI/CD를 이어받아 개발·스테이징·운영 환경별로 다시 구축했습니다. Fastlane에는 내부 테스트용·출시 후보용 TestFlight 업로드 lane 2개를 만들었습니다. TestFlight·Play 내부 트랙 업로드는 2026년 7월 GitHub Actions에 구성했고, 10월에 GitLab CI로 옮겼습니다. 이 구성으로 운영 출시한 기록은 없습니다. 같은 이름의 배포 인증서 2개 때문에 release 서명이 실패했습니다. 인증서를 SHA-1 지문으로 지정해 해결했습니다.
- 데이터 거래 개편의 6개 핵심 화면과 서버 API 연동, 건강검진·금융 데이터 연동을 구현했습니다. 본인인증은 인증이 필요한 응답을 받으면 인증 화면으로 보내는 흐름과 MyD·금융 본인인증 분리를 맡았습니다. 2026년 5월 홈·온보딩 리뉴얼을 iOS·Android에 동시 출시했습니다.
기능 상태를 표현하던 Bool 4개(16가지 조합)를 상태·액션·효과를 나눈 enum 상태 머신으로 설계하고 iOS 기능 브랜치에 구현했습니다(운영 반영은 확인되지 않음). 설계안으로 iOS·Android의 상태 정의와 테스트 기준을 맞췄습니다.
- 2025.09 — 2026.10
tbn교통방송 앱 고도화 사업 · React Native 앱
tbn교통방송 모바일 앱 · iOS·Android 기능 개발 · 발주처 소통 · 심사·출시 · 출시 후 운영
- 강제 업데이트의 시작 순서를 스플래시 → 정책 조회(timeout) → 권한 요청으로 고정했습니다. 정책은 Firebase Remote Config에서 받습니다. 정책 조회에 실패하면 차단하지 않고 진입을 허용합니다(fail-open). 정책 조회 장애가 전체 사용자 차단으로 번지지 않게 한 설계입니다. 게이트는 출시 뒤 추가해 iOS 2.1.1·Android 4.1.1부터 적용했습니다.
- 발주처(도로교통공단) 실무자와의 소통은 처음에는 PM을 돕다가, PM이 빠진 뒤 전담했습니다. 요구사항을 듣고 반영했고, 조율이 필요한 요구는 조율했습니다. 요구사항 범위와 일정은 발주처와 협의해 정했습니다.
- 공동 개발 중 주력 개발자로 방송·오디오, 편성, 교통 제보, 푸시, KMC 본인인증, Kakao·Apple 로그인을 개발하고(일부는 먼저 만들어진 기능을 이어받음), 앱 서명과 스토어 심사를 직접 해 2026년 5월 28일 양 플랫폼에 정식 출시했습니다.
- 현재 위치를 방송권역에 매핑하던 직선거리 방식이 경계 지역을 잘못 판정했습니다(예: 천안 → 충북). 시도 행정구역 경계로 판정하게 바꾸고, 판정 결과를 기본 방송국·지역 알림·제보 전화 지역에 연결했습니다.
- 발주처 운영 서버의 DB가 관리자 웹 통계 조회 부하로 멈춘 장애 때 현장에 나가 통계 조회를 먼저 막아 복구했습니다. 이후 일정과 안정성을 근거로, 통계 요구 대부분은 Google Analytics로 대신할 수 있다고 발주처를 설득해 합의했습니다.
- 동시 요청마다 따로 실행되던 토큰 갱신을 갱신 큐 하나로 묶고, 인증·푸시 토큰·동의 상태 저장을 차례로 실행하게 했습니다. 저장은 여러 값을 한 번에 쓰는 AsyncStorage.multiSet 한 번으로 바꿨습니다.
- 홈 이모티콘 SVG 16개를 PNG로 바꿔, 마운트하는 네이티브 뷰를 1,500여 개에서 16개로 줄였습니다. 이 수치는 실측이 아니라 SVG가 도형마다 뷰를 1개 만드는 구조로 계산한 값입니다.
- 원인 불명이던 Android CI 실패는 AI 코딩 에이전트가 cgroup 메모리를 측정해 원인을 찾았습니다. 9GiB 한도에서 clang++ 22개가 동시에 실행되어 Gradle이 메모리 부족(OOM)으로 종료됐습니다. 컴파일 동시 실행 수를 제한해 PR 검사의 release 컴파일을 처음 통과시켰습니다.
- 2024.11 — 2025.11
장병체감형 원스톱 서비스 플랫폼 구축사업
국방부 장병e음 앱 내 모바일 신분증 솔루션 · iOS 모듈 개발·통합 · Android 기능 단위 보완
- 회사 모바일 신분증 솔루션의 iOS 코드(DID 생성·서명·발급·토큰 갱신, 오프라인 검증)를 직접 만들고, Swift·SwiftUI 기반 장병e음 앱에 통합했습니다.
- 온라인 검증을 SSE에서 WebSocket으로 전환해 구현했습니다. 오프라인 검증은 영지식 증명(Groth16) proof를 QR로 만들어 30초 안에만 유효하게 구현했고, App Store 공개 앱에 반영했습니다. 암호 라이브러리는 외부 것을 썼습니다.
- QR이 30초마다 갱신될 때 진행 중 검증이 끊겼습니다. 원인은 WebSocket 연결을 하나만 쓰는 구조였습니다. 검증 요청마다 연결을 따로 여는 Android 구조를 iOS에 옮기고, 응답 대기 시간을 단계별로 나눴습니다(QR 45초·증명 30초·검증 15초).
- 앱 잠금·생체인증, 화면 캡처 방지, 무효화·재발급을 구현하고 보안 SDK 2종(보안 키패드 NFilter, 탈옥·디버거 탐지 ORA-X)을 통합했습니다. 여러 차례의 취약점 점검(CWE)에 맞춰 대응 코드를 반영했습니다.
담당 범위는 앱 내 모바일 신분증 솔루션입니다. Android 핵심 신분증 흐름은 다른 개발자가 만들었고, 저는 기능 단위로 보완했습니다.
03 / Additional experience
RAG·SDK·서버·배포 자동화
MyD 고객 문의 자동 답변(RAG) (2026.06 — 2026.07)
Jira로 들어온 MyD 앱 고객 문의에 FAQ 근거로 답하는 사내 답변 서버를 맡아 n8n으로 운영에 연결했습니다. FAQ를 bge-m3로 임베딩해 ChromaDB에 저장하고, 사내 서버의 로컬 LLM이 검색한 근거로 답합니다. 근거 점수가 기준보다 낮으면 답하지 않고 운영자에게 넘깁니다. 샘플 FAQ를 실제 FAQ 9개 문서로 바꿔 실제 고객 문의에 적용했고, 2026년 10월까지 운영했습니다. 구현은 AI 코딩 에이전트로 했고, 저는 에이전트가 지킬 조건을 정하고 결과를 검증했습니다.
B2B 데이터 SDK와 인증 서버 (2026.08 — 2026.09)
B2B 고객사 앱에 넣는 공공기관 데이터 수집 SDK(iOS·Android, 고객사 전달 전 중단)와 Node.js·PostgreSQL 인증 서버를 설계했습니다. 구현은 AI 코딩 에이전트 위주로 했고, 저는 에이전트가 지킬 조건을 정하고 결과를 검증했습니다. 고객사의 영구 API 비밀키를 앱에 넣지 않도록 짧은 수명 토큰과 서버가 서명한 정책을 SDK가 검증하는 구조를 만들었습니다. Android SDK 테스트가 2,400세션 중 15건 간헐적으로 실패했습니다. 원인(제품 코드의 실행 순서 경합, race)은 AI 코딩 에이전트가 찾아 고쳤고, 저는 같은 2,400세션 반복에서 실패가 0건임을 확인했습니다.
배포 자동화와 사내 인프라 (2026.07 — 2026.10)
Runner를 새 서버로 옮긴 뒤 마이주식 Android 빌드는 413초에서 174초가 됐습니다. 유휴 상태의 이전 Runner와 캐시가 있는 새 Runner를 비교한 값입니다. CI 서버 디스크 100% 장애를 정리하고, 다시 차지 않게 정리 작업을 5분마다 자동으로 돌리며 디스크가 찰수록 오래된 데이터를 더 일찍 지우게 했습니다. 웹 프론트 배포는 공개 응답의 SHA-256이 빌드 결과물과 같을 때만 성공으로 판정하도록 재설계했습니다. 구현은 대부분 AI 코딩 에이전트가 했고, 저는 에이전트가 지킬 조건을 정하고 결과를 검증했습니다.
마이주식 · 인턴 프로젝트 기술 지원 (2026.09 출시)
Firebase Functions에서 Apple 연결 해제와 Google·Naver 토큰 흐름, 개인정보 보존을 맡고(카카오·네이버 연결 해제와 7일 유예는 인턴 구현) App Attest 기반 App Check를 연동했습니다. 인턴 2명의 프로젝트로, 앱 로직·UI는 인턴들이 맡고 저는 보조로 보안·배포·서버리스 백엔드를 지원했습니다. 1.1.0 업데이트 출시 당일, 아직 1.0.0을 쓰던 사용자의 회원가입이 실패했습니다. 원인은 제가 넣은 새 필수 필드였습니다. 새 필드가 없는 1.0.0 요청을 따로 구분해 받고, 별개 원인인 손상된 Apple 비밀키도 바로잡아 소셜 가입 방식 4종을 복구했습니다.
기술 조사·설계 (2024)
모바일 신분증 도입에 앞서 App Attest·DID·VC·ZKP를 조사하고 iOS Attestation 샘플을 구현·검증했습니다.
04 / Side projects
개인 프로젝트
Runstir · 앱 개발 환경 준비·실행 도구 (alpha)
앱 개발자가 환경 설정과 실행 준비에 쓰는 반복 작업을 줄이는 오픈소스 도구입니다(Swift 6.2, alpha). 처음 목표는 git clone 뒤 mobile up만으로 앱을 띄우는 것입니다. 1.0.0 범위는 Native·React Native·Flutter 앱을 iOS·Android에서 빌드·설치·실행하는 것입니다. 지금 alpha는 버전을 고정한 공개 React Native 앱으로 검증했습니다. Native 앱 실행 경로, Flutter SDK 준비, macOS GUI는 main에 병합했고, alpha 검증은 아직 하지 않았습니다. 다른 프로젝트의 Metro 서버를 재사용해 실패를 성공으로 보고하던 문제는, 실행 중인 Metro가 이 프로젝트 것인지 확인하게 해 고쳤습니다. alpha.4 기준 테스트 482개, 설계 결정 기록(ADR) 40건입니다.
smallnext · LLM 기반 플래너 (SwiftUI + Rust API, 미출시)
LLM 호출을 생성기와 검사기로 나누고, 비용을 예약·정산 원장으로 통제합니다. 검사 지연의 대부분이 추론 토큰임을 측정으로 확인하고 출력 범위를 줄였습니다. 생성·검사 전체 시간 중앙값은 50.7초에서 42.1초가 됐고, 품질 검사 47건은 모두 통과했습니다. 로컬 CLI에서 순서를 바꿔 4쌍으로 측정한 값입니다.
Tech Notes 예제 코드
기술 글에 실린 Swift·TypeScript 코드를 글마다 테스트 파일로 두고 CI에서 실행합니다. fail-open 강제 업데이트 판정, actor 기반 초기화 공유, ImageIO 다운샘플링, 배포 공개 응답 검증을 다룹니다.
05 / Skills
사용 기술
- iOS
- Swift · SwiftUI · UIKit · Swift Concurrency · SwiftPM · XCFramework
- 크로스플랫폼
- React Native · TypeScript · Kotlin/Android · Flutter 연동
- 서버
- Node.js · Rust(axum) · PostgreSQL · Firebase Functions
- 테스트·배포
- XCTest · Jest · GitLab CI · Fastlane · Jenkins
- 인증·보안
- KMC · Kakao·Apple 로그인 · DID·VC · App Attest · JWS
06 / Education
학력
세종대학교 데이터사이언스학과 · 학사
2018.03 — 2022.02 · 소프트웨어융합대학 수석 졸업 · 학점 4.42 / 4.5