
어떤 해는 버티는 것만으로 충분하고, 어떤 해는 달리는 것만으로 숨이 차다. 나에게 2025년은 그 두 가지가 묘하게 섞인, 그러면서도 '확장'이라는 단어가 가장 잘 어울리는 시간이었다. 안드로이드라는 익숙하고도 안전한 울타리를 넘어 플랫폼의 경계를 허무는 법을 배웠고, 결핍 속에서 설계의 본질을 마주했다. 1년이라는 긴 시간 동안 내가 남긴 선명한 궤적들을 문장으로 정리해 본다.
'행운복권' 마이그레이션
2025년 가장 기억에 남는 사이드 프로젝트는 단연 '행운복권' 서비스의 마이그레이션이었다. 어느 날 마주한 서버의 부재는 개발자에게 마치 산소 공급이 중단된 것과 같은 위기였지만, 나는 이 결핍을 시스템의 자생력을 기르는 기회로 삼기로 했다. 서버 의존성을 과감히 걷어내고, 로컬 DB(Room)와 Alarm Manager를 통해 서비스의 심장을 다시 뛰게 만들었다.
이 과정에서 나를 구원한 것은 다름 아닌 '클린 아키텍처'였다. 계층이 엄격히 분리되어 있었기에, 핵심 로직이 담긴 도메인 레이어는 건드리지 않은 채 데이터 레이어의 구현체만 교체하는 '우아한 전환'이 가능했다. "좋은 설계는 변화에 유연해야 한다"는 교과서적인 문장이 내 손끝에서 실체화되는 순간, 나는 비로소 아키텍처가 선사하는 미학을 온전히 이해할 수 있었다.
2025년 한 해 동안 555명의 새로운 사용자가 앱을 만났고, 누적 다운로드 수 또한 견고하게 쌓여갔다. 기술적인 이식은 성공적이었고, 그 진짜 성적표는 단순히 살아남는 것을 넘어 '자생하는 데이터'로 증명되었다.
[비용은 제로, 수익은 온전한 자산으로]
가장 고무적인 성과는 수익 구조의 혁신이었다. 서버 유지비라는 고정 지출을 0원으로 완전히 걷어내면서, 발생한 광고 수익은 온전히 서비스의 자산이 되었다. Google AdMob을 통해 2025년 한 해 동안 $42.50(US)의 수익을 창출했으며, 이를 포함한 전체 누적 수익은 약 $128.43(US)에 달했다. 서버 비용에 대한 부담이 사라지자 서비스의 생존 기간은 무한해졌고, 안정적인 수익 모델을 유지하며 다음 단계로 나아갈 동력을 얻었다.
[숫자 너머에 담긴 독립의 가치]
2026년의 문턱에서 마주한 데이터는 더욱 놀라웠다. 1월 3일 기준, 누적 일일 신규 사용자 획득 수가 모든 국가 합산 1,223명에 달했다. 최근 28일간 MAU 43명, 기기 획득 37개라는 지표는 언뜻 작아 보일 수 있지만, 이는 서버 없이 로컬 DB와 Alarm Manager만으로 이뤄낸 '완전한 독립'의 결과물이라는 점에서 의미가 깊다. 마케팅 비용 한 푼 없이 기술적 최적화만으로 신규 유입을 끌어내고(기기 획득 수 95% 증가) 수익을 만들어내는 구조를 완성했기 때문이다.
결국 이번 마이그레이션은 단순히 코드를 옮기는 작업을 넘어, 비즈니스의 지속 가능성을 기술로 증명해낸 시간이었습니다. "서버가 없어서 안 돼"라는 핑계 대신 "서버 없이도 가능한 구조"를 고민했던 그 밤들이, 매일 아침 찍히는 십여 명의 신규 사용자라는 숫자로 보상받는 기분이다.
일상 속의 소소한 행운을 전하는 행운복권이 궁금하시다면 구글 플레이 스토어에서 만나 볼 수 있다. 또한, 서버 없는 자생적인 구조를 위해 클린 아키텍처를 어떻게 적용했는지 궁금한 동료 개발자분들을 위해 Repository의 문도 활짝 열어두었다. 작은 아이디어가 기술을 만나 실질적인 수익과 유저의 유입으로 이어지는 여정을 함께 살펴봐 주다면 더할 나위 없는 기쁠 것 같다.
KMP + CMP의 파도를 타다
안드로이드 개발자에게 Kotlin은 익숙하고 다정한 모국어와 같다. 하지만 2025년, 나는 이 익숙한 언어를 들고 낯선 영토로 발을 내디뎠다. 바로 Kotlin Multiplatform(KMP)과 Compose Multiplatform(CMP)이라는 도구를 통해서 말이다.
[Web과 App, 경계 없는 포트폴리오의 탄생]
먼저 도전한 것은 나만의 색깔을 담은 웹/앱 통합 포트폴리오 개발이었다. 이전에는 웹을 만들기 위해 JavaScript의 생태계를 새로 익혀야 했지만, KMP는 그 장벽을 단숨에 무너뜨렸다.
하나의 코드베이스 위에서 비즈니스 로직을 공유하고, CMP를 통해 UI 레이어까지 통일성 있게 구축했다. 안드로이드에서 짜던 그 감각 그대로 웹 브라우저 위에 화면이 그려지는 순간, 플랫폼이라는 물리적인 제약에서 벗어난 진정한 '자유'를 느꼈다. 덕분에 생산성은 극대화되었고, 나를 표현하는 방식은 더욱 다채로워졌다.
그 결과 완성된 웹사이트는 https://junjange.github.io/ 와 같다. 이 웹사이트는 KMP와 CMP가 어떻게 웹과 앱의 경계를 허물고, 개발자에게 더 넓은 표현의 장을 제공하는지 직접 보여주는 살아있는 증거이다.
KMP와 CMP를 활용한 프로젝트 구조나 구현 방식에 대해 궁금한 점이 있으시다면 언제든 Repository에 Issue나 Pull Request를 통해 의견을 남겨주면 좋을 것 같다. 동료 개발자분들의 피드백은 나를 더 깊게 고민하게 만드는 가장 좋은 자극제가 된다. 만약 이 프로젝트가 여러분의 멀티플랫폼 여정에 조금이라도 영감이 되었다면, 따뜻한 'Star' 한 방으로 응원해 주시면 큰 힘이 될 것 같다.
[Android와 iOS, 하나의 로직으로 숨 쉬는 서비스]
실제 서비스 개발에서도 KMP의 위력은 대단했다. 그 대표적인 결실이 바로 '링크레터(LinkLetter)'이다. Android와 iOS라는 서로 다른 두 세계를 잇기 위해, 핵심 비즈니스 로직을 담은 Shared Module을 정교하게 설계했다. 네트워크 통신, 데이터 파싱, 그리고 복잡한 도메인 로직을 단 한 번만 작성함으로써 두 플랫폼 사이의 로직 파편화를 완벽히 방지했다. 단순히 로직만 공유하는 것을 넘어 UI까지 CMP로 구성하며, iOS 앱을 개발할 때 느꼈던 생소함을 Kotlin의 익숙함으로 치환했다.
플랫폼마다 다른 언어로 같은 기능을 두 번씩 구현하던 비효율의 시대는 지났다. 이제는 "어떤 플랫폼인가"보다 "어떤 가치를 전달할 것인가"에 더 집중할 수 있게 된 것이다. KMP와 CMP는 나에게 단순한 기술 스택 그 이상의 의미, 즉 '세상을 바라보는 더 넓은 시야'를 선물해 주었다. 링크레터의 탄생 과정과 기술적 구조가 궁금하다면 Repository에서 확인 할 수 있다.
함께 숨 쉬며 성장하는 즐거움, 그리고 취업
성장이란 결코 혼자서 완성할 수 있는 것이 아님을 잘 안다. 2025년은 동료들과 끊임없이 대화하고, 지식을 나누며, 그 에너지를 실무의 성과로 치환하는 역동적인 시간이었다.
[학습의 깊이가 실전의 무기가 되기까지]
내면의 단단함을 채우는 작업은 쉼 없이 계속되었다. 특히 《코틀린 동시성 프로그래밍》을 읽으며 Coroutine의 내부 구조와 비동기 처리의 정수를 익혔다. 책장 속의 이론은 현장에서 강력한 무기가 되었다. 복잡한 비동기 로직이 얽힌 트러블 슈팅 상황에서, 원인을 정확히 짚어내고 해결하는 과정은 단순한 코딩을 넘어 '엔지니어링'의 즐거움을 깨닫게 해주었다.
[커뮤니티에서 나눈 온기]
기술은 결국 사람을 향한다는 믿음으로 커뮤니티에 몸을 던졌다. 드로이드나이츠(DroidKnights) 컨트리뷰터로 활동하며 보이지 않는 곳에서의 헌신이 생태계를 어떻게 지탱하는지 배웠고, GDG Korea Android와 유스콘(YouthCon) 등 수많은 컨퍼런스에서 만난 동료들의 눈빛은 나를 늘 깨어 있게 만들었다. 참여자에서 기여자로, 다시 학습자로 순환하는 이 과정이 나를 지치지 않게 하는 연료가 되었다.
[페이타랩에서 증명한 '진짜 개발'의 시간]
이러한 치열한 기록들은 마침내 '취업'이라는 결실로 이어졌다. 이제는 사이드 프로젝트를 넘어 '패스오더'라는 실전 무대에서 비즈니스의 성장을 직접 견인하고 있다. 단순히 기획안을 코드로 옮기는 것을 넘어, 기술이 어떻게 매출과 사용자 유입의 마중물이 될 수 있을지 끊임없이 고민했다.
비즈니스의 폭발적 성장을 지원하는 '선물하기 지원금' 기능을 개발했다. 레거시 코드의 복잡함 속에서도 신규 기능을 안정적으로 안착시켰다. 배포 후 일일 평균 선물 발송 건수가 약 398% 급증하고, 수신자가 서비스에 안착하며 신규 가입자가 약 567% 증가하는 드라마틱한 지표를 목도했다. 기술이 비즈니스의 폭발적 성장을 뒷받침할 때의 전율은 무엇과도 바꿀 수 없는 소중한 경험이었다.
UX의 디테일로 결제의 허들을 낮춘 'OCR 및 법인카드 결제' 기능을 개발했다. 결제의 진입장벽을 낮추기 위해 OCR 카드 등록 프로세스를 고도화했다. 스캔 결과 확인 화면에 도달한 유저의 등록 완료율 87%라는 높은 전환율을 기록하며, UX의 미세한 디테일이 비즈니스 지표에 미치는 영향을 데이터로 확인했다. 더불어 법인카드 결제 기능을 성공적으로 추가함으로써 서비스의 결제 스펙트럼을 넓히고, B2B 유저들의 실질적인 니즈까지 충족시킬 수 있었다.
팀의 생산성을 위한 '자체 MVI 아키텍처' 도입했다. 외부 라이브러리에 의존하지 않고 우리 팀에 최적화된 MVI 구조를 직접 설계하고 적용했다. 이를 통해 코드의 유지보수성을 높였을 뿐만 아니라, 팀 내 코드 이해도를 상향 평준화하여 협업의 효율을 한 단계 끌어올리는 토대를 마련했다.
신뢰를 지키는 '선제적 리스크 관리'와 대응했다. 사용자 경험의 단절을 막기 위해 노력했다. 네트워크 에러로 결제 수단이 노출되지 않는 상황에서 '재시도 다이얼로그' 표시를 제안하고 직접 구현하여 사용자 이탈을 최소화했다. 또한, 까다로운 구글 정책 리젝 상황에서도 신속한 정책 검토와 대응으로 배포 지연을 막아내며 서비스의 연속성을 견고히 지켜냈다.
2026년 다시, 선을 긋는 마음으로
지난해가 '확장'의 해였다면, 다가올 2026년은 그 확장의 깊이를 더하고 울림을 만드는 해로 정의하고 싶다.
KMP + CMP 마스터로 거듭나겠다. 이제 '사용해 봤다'는 수준을 넘어, 멀티플랫폼 환경에서의 성능 최적화와 아키텍처 패턴을 나만의 방식으로 정립하려 한다. 특히 2025년 로컬 마이그레이션을 성공적으로 마친 '행운복권' 앱을 KMP로 다시 한번 마이그레이션하여 기술적 완성도를 높이고, 이 외에도 꾸준히 운영을 이어갈 새로운 KMP 기반 서비스를 런칭할 계획이다.
공유의 가치를 실현하는 Speaker에 도전하겠다. 그동안 컨퍼런스 객석에서 누군가의 성공과 실패를 경청해 왔다면, 이제는 내가 무대 위에 서려 한다. 지난 유스콘에서 자신의 고민과 시행착오를 당당하게 펼쳐 보이던 동료이자 친구들의 모습은 나에게 말로 다 못 할 깊은 영감을 주었다. 그 뜨거웠던 자극을 발판 삼아, 2026년에는 '듣는 사람'에서 '나누는 사람'으로 거듭나려 한다. 아직은 어떤 주제로 첫 무대에 서게 될지 고민하는 단계이지만, 나의 시행착오가 누군가에게는 이정표가 될 수 있도록 진솔한 기록을 쌓아가겠다.
시야의 완성을 위해 백엔드와 개발 철학을 다지겠다. 클라이언트를 넘어 서비스의 전체적인 흐름을 이해하기 위해 백엔드 학습을 병행하려고 한다. 필요하면 직접 API를 설계하고 구축하며 비즈니스 전체를 조망할 수 있는 'T자형 인재'로 거듭나고자 한다. 더불어 다양한 기술 서적을 통해 개발자로서의 철학을 공고히 다지는 시간도 게을리하지 않을 것이다.
'Memoir' 카테고리의 다른 글
| 2024년 회고 (feat. 우아한테크코스) (7) | 2024.11.22 |
|---|---|
| 우아한테크코스 6기 서류, 프리코스, 최종 코딩테스트 / 최종합격 (4) | 2023.12.28 |
| 부스트캠프 웹・모바일 8기 멤버십 회고 (1) | 2023.12.18 |
| 부스트캠프 웹・모바일 8기 멤버십 합격 (0) | 2023.08.20 |
| 부스트캠프 웹・모바일 8기 챌린지 회고 (2) | 2023.08.07 |