이수현 (SooHyun Lee)
Android Software Engineer · 7년 차 (2020.01 ~ 현재)
- 이메일: dlqtn36@gmail.com
- GitHub: github.com/3dagger
- LinkedIn: linkedin.com/in/수현-이-614a0b25b
- 블로그: blog.nuyhoos.com
MAU 150만 멤버십 플랫폼 CJ ONE의 Android 앱에서 홈·라운지·커뮤니티 등 고객 접점이 많은 도메인을 담당하며, 고객이 혜택을 발견하고 콘텐츠를 작성하고 계열사 서비스로 이동하는 흐름을 개선하고 있습니다. Kotlin, Jetpack Compose, Coroutines·Flow, Hilt를 주력으로 사용하며, Multi Module + Clean Architecture와 MVI 구조 위에서 개발하고 있습니다. 점진 전환 전략 수립, 디자인 시스템 초기 설계, 코드리뷰 규칙 정착처럼 팀이 함께 따르는 구조와 개발 기준을 정하는 일을 주도해 왔습니다.
- 운영 중인 서비스의 구조 전환 — 모놀리식 Java 앱을 서비스 중단 없이 Multi Module(41개 모듈) + Clean Architecture, MVI 구조로 점진 전환하는 전략을 세워 진행하며, 단위 테스트 100여 개로 도메인 로직을 회귀 검증하고 있습니다.
- 팀 개발 기준 정착 — MR 리뷰 승인 없이는 develop에 머지할 수 없는 코드리뷰 규칙을 제안해 정착시키고, 주간 기술 세션 OneDroidTalk 운영과 GitLab CI 기반 AI 1차 리뷰 자동화로 팀의 리뷰·학습 체계를 만들었습니다.
- 디자인 시스템 구축 — 화면마다 제각각 구현되던 공통 UI를 CJ ONE Compose 디자인 시스템(Foundation + 공통 컴포넌트 19종)으로 표준화하며, 초기 설계부터 구현까지 담당했습니다.
- 신규 서비스 개발 — 하나의 앱에서 국내/글로벌 모드를 전환하는 글로벌 서비스(영어·일본어)의 진입 구조부터 글로벌 홈, 웹뷰 인증 연동까지 핵심 흐름을 구현했습니다.
- 고객 경험을 지표로 개선 — 커뮤니티 글쓰기 플로우 전반을 설계·구현하고 단계별 이탈 지점을 기준으로 UX를 다듬어, 개선 이후 일평균 콘텐츠 생성 수 40% 증가에 기여했습니다.
- 결제·인증 흐름 경험 — 매장 결제용 OTP·기프트카드 바코드를 제공하는 CJ ONE Watch(Wear OS) 운영, 웹뷰 세션 토큰 갱신 연동, NHN PAYCO·다날 결제 연동을 맡았습니다.
기술 스택
- Language — Kotlin, Java
- UI — Jetpack Compose, Material3, XML View
- Architecture — Multi Module + Clean Architecture, MVI, MVVM
- Async·DI — Kotlin Coroutines, Flow, RxJava3, Hilt, Koin
- Data·Network — Retrofit, OkHttp, kotlinx.serialization, Room, DataStore, Paging3, WorkManager
- Image — Coil, Glide
- Test — JUnit, MockK, kotlinx-coroutines-test
- Build·Deploy — Gradle Kotlin DSL, Version Catalog, Convention Plugin, GitLab CI/CD, Fastlane, Firebase App Distribution
- Monitoring — Firebase Crashlytics, Google Analytics, Adobe Analytics
- AI Tooling — Claude Code, MCP
경력
CJ올리브네트웍스 — ONE서비스팀 / Android Software Engineer (2024.09 ~ 현재)
- 담당 서비스: CJ ONE, CJ ONE Watch(Wear OS), CJ ONE 원더락(락스크린)
CJ ONE (2024.09 ~ 현재)
쇼핑·외식·문화·엔터테인먼트 등 CJ 계열사 이용 시 포인트 적립과 혜택을 제공하는 MAU 150만 규모의 라이프스타일 멤버십 플랫폼
주요 기여: 글로벌 서비스 신규 개발, 커뮤니티 글쓰기 경험 설계, 홈 개편·Compose 디자인 시스템 구축, Android 16(targetSdk 36) 대응
글로벌 서비스 신규 개발 (영어·일본어) · 2026.2Q ~ 현재
- 방한 외국인이 CJ 계열사 혜택을 이용할 수 있도록, 하나의 앱에서 국내/글로벌 모드를 전환하는 신규 서비스의 핵심 흐름을 개발했습니다. 모드 설정 도메인·데이터 레이어와 런처 진입 분기를 구현하고, OkHttp Interceptor로 Accept-Language 헤더를 주입해 화면별 분기 코드 없이 API 응답과 앱 내 문구가 함께 전환되도록 했습니다.
- 초기의 프로세스 종료·재실행 방식은 재시작 지연과 화면 깜빡임으로 전환 경험이 나빠, 프로세스를 유지한 채 태스크만 초기화해 런처 진입점부터 재시작하는 방식으로 개선했습니다. 전환 시점에는 FCM 등록 해제 등 모드 종속 상태를 단일 지점에서 초기화해, 국내 모드 푸시가 글로벌 모드에서 수신되는 사이드 이펙트를 차단했습니다.
- 글로벌 홈은 서버 응답 기반 모듈 렌더링(SDUI) 구조로 구현해 배포 없이 지면 구성을 변경할 수 있게 했고, Retrofit·OkHttp 기반 글로벌 전용 네트워크 모듈 분리, 스켈레톤 UI·Pull-to-Refresh, 강제/권장 업데이트·긴급 공지 분기를 포함한 스플래시 진입 흐름을 함께 구성했습니다.
- 웹 세션 만료 시 앱이 suspend 기반으로 access token을 갱신해 JS 콜백으로 돌려주는 인증 연동을 구현하고 웹뷰 요청 헤더에 토큰을 주입해, 웹뷰 화면에서 재로그인 없이 세션이 유지되도록 했습니다. 웹-앱 커스텀 스킴은 화면 이동·새 창·외부 브라우저·로그아웃·토큰 갱신 등 액션 단위 핸들러로 분리해, 웹 팀과 규격 문서 기준으로 병렬 협업했습니다.
- 글로벌 모드에서는 국내 전용 홈 위젯·앱 숏컷을 노출하지 않도록 정리했습니다.
Android 16(targetSdk 36) 대응 — 앱 전반 edge-to-edge 적용 · 2026.2Q
- targetSdk 36부터 edge-to-edge가 기본 적용되는 정책 변경으로 레거시·신규가 섞인 앱의 전 화면이 영향권이었습니다. 화면별 개별 대응은 누락과 중복 작업이 불가피하다고 판단해 시스템 바 인셋 처리 공통 헬퍼를 먼저 만들고, 진입 Activity부터 Fragment·Compose 화면, 바텀시트, 바코드·결제 화면까지 약 15개 주요 화면에 순차 적용해 대응 비용을 낮췄습니다.
- 적용 과정에서 드러난 바텀시트 하단 터치 불가, 플로팅 뷰 인셋 중복 적용 같은 화면별 이슈를 핫픽스로 정리하고, minSdk 상향(28→29)에 따른 분기 코드를 함께 제거해 글로벌 서비스 개발과 병행하면서도 분기 내 대응을 마쳤습니다.
스플래시 광고 지면 신설 · 2026.1Q
- 앱 시작 화면에 GIF 광고 지면을 신설했습니다. 시작 시점에 광고를 내려받으면 진입이 느려지기 때문에, 앱 프로세스와 무관하게 사전 다운로드를 보장하는 WorkManager로 리소스를 미리 받아 두고 캐시가 준비된 경우에만 노출하는 방식을 택해, 시작 시간에 영향 없이 지면을 오픈했습니다.
- 광고 유무에 따라 진입 흐름이 끊기지 않도록 노출 조건과 BI 애니메이션 타이밍을 조정했습니다.
홈 개편 — 동적 탭 구조와 Compose 디자인 시스템 · 2025.3Q ~ 4Q
- 멤버십, 라운지, TVING·온스타일 등 계열사 탭이 지속적으로 추가·개편되는 홈을, 서버 구성 기반으로 동적 확장할 수 있는 모듈 구조로 설계해 탭 추가·변경에 드는 클라이언트 수정 비용을 낮췄습니다.
- 탭을 오갈 때마다 데이터를 다시 불러오던 문제를 탭별 캐싱으로 제거하고, 로딩·오류·빈 상태별 스켈레톤·Placeholder 화면과 특정 탭으로 바로 진입하는 딥링크 처리를 정리했습니다.
- 화면마다 제각각 구현되던 공통 UI를 표준화하기 위해, 색상·타이포그래피·아이콘·간격의 Foundation과 버튼, 입력, 다이얼로그, 스낵바, 바텀시트, 탭, 칩, Top/Bottom Navigation 등 공통 컴포넌트 19종으로 구성된 Compose 디자인 시스템을 초기 설계부터 구축해, 이후 신규 화면이 공통 컴포넌트 위에서 개발되는 기반을 만들었습니다.
- 기존 XML 기반 탭/헤더 커스텀 뷰를 Compose로 재구현하고, 레거시 View·Fragment·WebView와 신규 Compose 화면이 공존하는 환경에서 상태, 생명주기, 화면 전환, 공통 UI 기준을 정리했습니다.
아키텍처 개선 · 2024.4Q ~ 현재
- 경계가 없는 모놀리식 Java 구조라 수정 영향 범위를 예측하기 어려웠습니다. 운영 중인 서비스라 빅뱅 전환 대신 신규 기능은 새 구조로 개발하고 기존 화면은 수정 시점에 옮기는 점진 전환 전략을 세워, 현재 41개 모듈의 Multi Module + Clean Architecture와 MVI 기반으로 상태 관리·이벤트 처리 구조를 정리하고 있습니다.
- 점진 전환 중인 구조와 컨벤션을 팀 전체가 같은 기준으로 지키도록, GitLab MR 리뷰 승인 없이는 develop에 머지할 수 없는 규칙을 제안해 정착시키고 오프라인 코드리뷰를 병행했습니다.
- Version Catalog, Convention Plugin 도입으로 모듈 생성 시 반복되는 의존성·빌드 설정을 표준화해 신규 모듈 추가 비용을 낮추고, 신규 커뮤니티 기능을 새 아키텍처 기반으로 개발했습니다.
- UseCase, data–domain 매퍼, ViewModel, 딥링크 핸들러에 JUnit·MockK 단위 테스트 100여 개를 작성해 도메인 로직과 레이어 간 모델 변환을 회귀 검증했습니다.
- QA가 개발·검증·운영 환경을 오가며 확인해야 했던 비용을, 빌드 타입별 applicationId·앱 아이콘·Firebase 설정 분리(한 기기 동시 설치)와 CI 빌드 타입별 배포 구성으로 줄였습니다.
커뮤니티 글쓰기 경험 설계 — 일평균 콘텐츠 생성 수 40% 증가 · 2024.3Q ~ 2025.3Q
- 신규 커뮤니티·피드 서비스의 글쓰기 플로우 전반을 설계·구현했습니다.
- 오픈 이후 Adobe Analytics 퍼널(작성 화면 진입 → 작성 완료)로 주제 선택, URL 입력, 제목·본문 작성, 사진 선택·편집, 권한 허용 각 단계의 이탈 지점을 정의하고, 이탈이 큰 구간부터 흐름을 재설계해 일평균 콘텐츠 생성 수 40% 증가로 이어졌습니다.
- 작성이 중단된 지점을 복구하는 임시저장·이어쓰기를 제공하고, 주제별 입력 안내와 URL 유효성 검증·미리보기, 사진 권한 부분 접근(Selected Photos Access) 대응을 적용했습니다.
- 갤러리·편집 화면에서 크롭, 회전, 원복, 편집 취소 확인을 제공하고, 비즈 혜택 서비스 오픈 시 피드/상세 화면 대응과 노출 지표 API 연동을 담당했습니다.
팀 개발 문화 — OneDroidTalk 운영과 AI 활용 · 2026.1Q ~ 현재
- CJ ONE Android 개발자 3명과 함께 매주 금요일 OneDroidTalk를 운영하며 Compose 전환 스터디, 아키텍처 개선 논의, AI 활용 학습을 진행하고 있습니다.
- GitLab CI에 Claude 기반 MR 자동 리뷰 잡을 구축해, 변경분을 AI가 먼저 리뷰하고 봇 계정이 MR 댓글로 남기도록 만들어 사람 리뷰 전 1차 검토를 자동화했습니다.
- 프로젝트 루트 CLAUDE.md에 아키텍처 컨벤션과 팀 규칙을 정의해 레거시 Java→Kotlin 마이그레이션과 MR 리뷰 초안 작성에 활용하고, Figma를 MCP로 연결해 디자인 시안에서 Compose 컴포넌트 초안을 생성하는 워크플로를 실험했습니다.
CJ ONE Watch
CJ ONE 모바일 앱의 멤버십 바코드, 포인트 적립, 체크인, 기프트카드 결제 경험을 Wear OS 환경으로 확장하는 앱
- 매장에서 사용하는 멤버십 카드·기프트카드 바코드와 결제용 OTP, 체크인 화면을 제공하고 Wearable Data Layer로 모바일 앱과 연동되는 Kotlin 기반 Wear OS 앱의 운영과 릴리즈 관리를 담당하고 있습니다.
- Kotlin 2.0·AGP 8.5로 업그레이드하면서, R8 난독화 환경에서 Gson 리플렉션 기반 직렬화가 깨지는 알려진 문제를 사전에 확인하고 공식 권장 ProGuard 규칙을 적용해 난독화 릴리즈 빌드의 API 응답 파싱을 검증했습니다.
- 중복 선언된 buildFeatures 등 빌드 스크립트 설정을 정리하고, AGP 패치 버전 이슈를 확인해 업데이트로 대응했습니다.
CJ ONE 원더락 (2024.09 ~ 현재)
잠금 화면을 포인트 적립 창구로 활용하는 CJ ONE 멤버십 잠금화면 앱 — 매일 잠금 해제만으로 CJ ONE 포인트를 쌓을 수 있는 서비스
빌드 타입별 개발·검증 환경 정비
- 연동 대상인 메인 CJ ONE 앱 패키지명이 운영 패키지 기준으로 하드코딩되어 있어, 개발·검증 빌드에서는 메인 앱과의 연동 동작을 확인하기 어려웠습니다. 연동 패키지를 빌드 타입별 BuildConfig 필드로 분리하고 package visibility(
<queries>) 설정을 빌드 타입별로 구성해, debug/dev/release 빌드가 각각 같은 환경의 메인 앱과 연동되도록 개선했습니다. - applicationIdSuffix 도입으로 한 기기에 빌드 타입별 앱을 동시에 설치할 수 있게 하고 google-services.json을 소스셋 단위로 정리했으며, GitLab CI에서 빌드 타입별 Firebase App Distribution 업로드를 분기해 환경별 QA 배포가 가능하도록 구성했습니다.
보안 대응과 운영
- 통신 구간 암호화를 위해 cleartext 트래픽을 비활성화하고 잔여 HTTP 엔드포인트를 HTTPS로 전환했으며, 환경 설정 코드에 남아 있던 HTTP 관련 분기를 제거했습니다.
- 앱 보안 솔루션(FxShield)이 루팅 등 위협을 탐지했을 때 고객에게 사유를 안내하고 앱을 종료하는 다이얼로그 UI와 리소스를 정비했습니다.
- Firebase Crashlytics 기반으로 크래시·오류를 모니터링하고, Android OS 업데이트·정책 변경과 주요 라이브러리 버전 호환성 이슈를 분석해 대응했습니다.
- APK → AAB 전환과 스토어 배포 구조 변경, 앱 서명 키 전환을 진행하며 배포 파이프라인과 서명 체계를 점검했습니다.
NHN Bugs — 개발4팀(여행박사) / Android Software Engineer (2023.01 ~ 2024.08)
여행박사 Android 앱
자유/패키지 여행, 하프팩, 패스/티켓, 현지투어 등 해외여행 서비스를 제공하는 커머스 앱
- 레거시 Java 중심 구조를 Kotlin 기반으로 전환해 Kotlin 비율을 40%에서 95%로 높이고, 모듈 경계와 의존성 관리 체계를 정리했습니다.
- Clean Architecture 기반으로 모듈을 세분화하고 JUnit 단위 테스트를 도입해, 레거시 로직을 검증 가능한 구조로 재편했습니다.
- 수동으로 전달하던 QA·테스트 배포를 GitLab CI/CD와 Fastlane 기반 파이프라인과 Firebase App Distribution 자동 배포로 표준화했습니다.
- 메인 지면을 서버 응답 기반 모듈 렌더링(SDUI) 방식으로 개편해 배포 없이 지면 구성을 변경할 수 있게 하고, 검색 화면 UI 개편과 딥링크 처리 리팩터링, Splash Screen API·Adaptive App Icon API 적용으로 외부 유입 진입 경험을 개선했습니다.
- Google Analytics 이벤트 트래킹과 Firebase Crashlytics 오류 수집을 연동했습니다.
- Koin → Hilt, Gradle Groovy DSL → Kotlin DSL 마이그레이션과 Version Catalog 도입으로 빌드·DI 체계를 현대화하고, NHN AppGuard·NHN Cloud Push·NHN PAYCO 결제를 연동했습니다.
주식회사 에임스 — SW팀 / Android Software Engineer (2020.01 ~ 2023.01)
전기 스쿠터·자전거, 배터리 교환 스테이션, B2B 온도 제어 등 모빌리티 도메인에서 사용자 앱, B2B 제어 앱, 하드웨어 연동 패널 앱을 MVP·MVVM 기반 단일 모듈 구조로 개발했습니다.
나누(NANU) 사용자 애플리케이션 (2021.12 ~ 2022.12)
자사 전기 스쿠터 사용자의 스쿠터·배터리 상태와 전국 스테이션 정보를 제공하는 애플리케이션
- 일별·월별 배터리 사용량 시각화(MPAndroidChart 커스터마이징), QR 스캔·암호화 전송(ZXing), NaverMap 마커 클러스터링, 다날 결제 연동, 커스텀 Pull-To-Refresh 등 사용자 핵심 기능을 개발했습니다.
- RxJava3 기반 비동기 네트워크 처리와 Koin DI를 적용한 MVVM 구조로 개발하고, 공지사항·이벤트·배터리 저전압 경고 Notification Service를 구현했습니다. Dokka 코드 문서화를 도입했습니다.
온달(Ondal) 애플리케이션 (2021.08 ~ 2021.11)
MQTT 프로토콜 기반으로 배달용 스쿠터 적재함의 온도를 원격 제어하는 B2B 서비스
- MQTT 클라이언트 라이브러리 기반으로 적재함 제어·상태 수신 통신을 구현하고, 터치 이벤트로 온도 조절·On/Off를 제어하는 커스텀 다이얼 뷰를 구현했습니다.
- FCM 기반 실시간 배터리 전압 경고 Notification Service를 구현했습니다.
나누 스테이션(NANU Station) 패널 애플리케이션 (2021.07 ~ 2021.12)
자사 전기 스쿠터의 배터리를 교환하는 무인 스테이션 서비스
- Windows 기반 패널의 에뮬레이터(BlueStacks5, MIMU) 환경에서 구동되는 스테이션 앱을 개발하고, SerialPort 통신으로 스테이션 내부 하드웨어를 직접 제어했습니다.
- 옥외 무인 운영 환경을 고려해 관리자 모드와 BackgroundService 기반 상태 체크·원격 재실행 기능을 구현했습니다.
나누 바이크(NANU Bike) 애플리케이션 (2021.02 ~ 2021.06)
MQTT 프로토콜 기반 전기 자전거 대여 서비스
- KT GigaGenie 연동 음성인식 대여 기능을 구현하고, WebSocket으로 자전거 상태·배터리 정보를 실시간 표시했습니다.
학력
- 한국방송통신대학교 컴퓨터과학과 (재학 중)
- 신구대학교 (2017.03 ~ 2020.02)