반복되는 코드에서 오는 피로감, 공통 모듈로 해결하기

바이브코딩으로 앱을 하나씩 만들 때는 같은 기능을 다시 만드는 일이 크게 거슬리지 않았다. 날짜 선택이나 테마 설정이 필요하면 AI에게 설명하고 코드를 받으면 됐다. 앱 하나만 볼 때는 새로 만드는 편이 더 빠르게 느껴지기도 했다.

앱이 늘어나자 생각이 달라졌다. 날짜와 시간 선택, 온보딩, FAQ, 앱 정보, 라이선스, 공유와 리뷰 요청, 문의 메일, 광고 동의, 알림 설정이 프로젝트마다 조금씩 다른 모습으로 쌓였다. 핵심 기능은 서로 달랐지만 앱을 둘러싼 기능은 계속 반복되고 있었다.

그래서 여러 Android 앱에서 함께 쓸 모듈에 next2great-android-common이라는 이름을 붙였다.

여섯 개 앱에서 반복되는 부분을 골랐다

기준은 Google Play에 공개했거나 비공개 테스트까지 진행한 여섯 개 앱이었다. 그중에는 Flutter 앱도 있어 실제 공통 모듈 적용은 Kotlin과 Compose로 만든 앱을 중심으로 진행했다.

기존 코드를 한곳에 복사하는 방식은 피했다. 여러 앱에서 실제로 되풀이되는지, 특정 앱에만 필요한 기능인지, 앱마다 다른 부분을 설정으로 넘길 수 있는지를 먼저 봤다. 그렇게 공통 기반 기능과 Compose UI, 온보딩, FAQ·앱 정보·라이선스·다른 앱 안내, 광고 관련 기능을 묶었다.

구분이 애매한 기능도 있었다. 화면은 비슷해도 사용 흐름이 다른 기능은 각 앱에 남겼다. 이 모듈은 모든 앱을 같은 모양으로 만드는 틀이 아니라 자주 꺼내 쓰는 부품을 모은 도구상자에 가깝다.

세 앱에 붙여보니 코드보다 데이터가 먼저였다

만든 모듈은 Kotlin 앱 세 개에 차례로 적용했다. 이때 확인한 것은 줄어든 코드의 양이 아니었다. 업데이트 뒤에도 기존 사용자의 테마, 온보딩 완료 여부, 알림 설정, 광고 제거 시간과 저장 데이터가 그대로 남는지가 더 중요했다.

한 앱에 먼저 적용하고 기존 기능과 데이터를 확인한 다음 다른 앱으로 넘어갔다. 공통 모듈의 작은 실수가 여러 앱으로 번질 수 있어서 한꺼번에 바꾸지 않았다.

정리 과정에서 예상하지 못한 문제도 찾았다. 공통 날짜 선택 기능으로 바꾸다가 돈기록장 앱에 있던 날짜 선택 오류를 발견해 수정했다. 비슷한 코드가 여러 프로젝트에 흩어져 있을 때는 지나쳤던 문제가 한곳에서 비교하니 보였다.

새 앱을 시작하는 방식이 달라졌다

새 Android 앱을 만들 때 테마, 공유, 리뷰 요청, FAQ와 라이선스 화면을 매번 처음부터 구현하지 않게 됐다. AI에게도 새 코드를 만들어 달라고 하기 전에 공통 모듈에 있는 기능부터 사용하라고 지시한다. 필요한 기능이 조금 부족하면 앱 안에 비슷한 코드를 하나 더 만들기 전에 공통 기능을 확장할 수 있는지 살펴본다.

날짜 선택이나 시간 표시 방식처럼 여러 앱에서 쓰는 기능은 한곳에서 고칠 수 있다. 수정한 내용을 각 앱에 적용하는 일은 남지만, 서로 다른 구현을 찾아다니며 같은 문제를 여러 번 고칠 필요는 줄었다.

공통 프로젝트에는 AGENTS.md와 CLAUDE.md도 두었다. 새 기능을 만들기 전에 기존 기능을 확인하고, 앱 고유의 업무 로직은 공통화하지 않으며, 중복 구현보다 기존 기능의 확장을 먼저 검토한다는 기준을 적었다. Claude와 ChatGPT를 번갈아 써도 어느 쪽이 작업하든 같은 기준에서 시작할 수 있게 됐다.

연결된 만큼 조심할 일도 늘었다

공통 모듈을 도입하는 초기 작업은 예상보다 길었다. 기존 코드를 비교하고 일반화한 뒤 세 앱에 다시 적용해 데이터와 화면을 확인해야 했다. 앱 한두 개를 만들고 끝낼 계획이라면 이 작업에 쓴 시간이 더 클 수 있다.

앱끼리 개발 환경도 연결된다. 공통 모듈의 Kotlin이나 Gradle, Compose 환경을 바꾸면 사용하는 앱에서도 버전을 맞춰야 할 때가 있었다. 공통 기능의 버그는 한 앱에서 끝나지 않는다. 그래서 변경한 기능을 한 앱에서 먼저 확인하고 나머지 앱으로 넓히는 순서를 지키고 있다.

설정값이 계속 늘어난다면 공통화가 잘됐다는 뜻도 아니다. 앱마다 다른 디자인과 흐름을 억지로 하나에 담으면 공통 모듈이 더 이해하기 어려워진다. 비슷해 보여도 앱의 핵심 경험과 가까운 기능은 앱 내부에 남기는 편을 택했다.

만드는 속도 다음에 관리가 보였다

바이브코딩 덕분에 앱 하나를 만드는 시간은 짧아졌다. 앱이 늘어난 뒤에는 “AI에게 앱을 만들어달라고 하는 것”보다 “여러 앱을 어떤 구조로 계속 관리할 것인가”를 더 자주 생각하게 됐다.

next2great-android-common은 완성된 프레임워크가 아니다. 새 Android 앱을 만들 때 필요한 기능을 추가하고, 이미 넣은 기능에서 문제를 발견하면 고쳐가는 개인용 Android SDK에 가깝다. 다음 앱에서도 반복되는 부분이 보이면 무조건 옮기기보다 이 도구상자에 넣을 만한 부품인지부터 판단할 생각이다.