
전 세계 2,000만 사용자에게 민폐 끼치지 않고 화려한 편집 기능을 넣는 법
당근 숏폼팀이 대규모 멀티 모듈 환경에서 비디오 편집 기능의 고용량 문제를 어떻게 해결했는지 상세히 다룹니다. 단순히 기술을 적용하는 것을 넘어, Hilt 의존성 주입 이슈부터 네이티브 라이브러리(STL) 충돌까지 실무에서 마주친 험난한 고비들을 돌파한 생생한 엔지니어링 기록입니다.
앱의 특정 기능이 전체 용량의 큰 비중을 차지하거나, 특정 국가/그룹에게만 선별적으로 기능을 제공해야 하는 안드로이드 엔지니어에게 이 글은 완벽한 가이드가 될 것입니다.
당근 숏폼 서비스인 '당근 스토리'에 비디오 편집 기능을 추가하면서 모듈 용량이 200MB까지 비대해졌으며, 리소스를 CDN으로 전환한 후에도 40MB의 용량이 남아 글로벌 사용자에게 큰 부담이 되었습니다. 영상 편집은 일부 사용자만 사용하는 기능임에도 모든 사용자가 이를 설치해야 하는 비효율성을 해결해야 했습니다.
Android의 On-demand Dynamic Feature Module(DFM)을 도입하여 사용자가 편집 기능을 요청할 때만 모듈을 다운로드하도록 설계했으며, 기술적 복잡도를 낮추기 위해 기능 코드는 base 모듈에 유지하고 대용량의 SO 파일(네이티브 라이브러리)만 DFM으로 분리하는 전략을 취했습니다.
결과적으로 편집 기능 관련 용량을 90% 이상 절감하여 글로벌 서비스에 미치는 영향을 최소화했으며, 기능을 코드와 분리함으로써 DFM 로딩 실패 시에도 앱의 안정성을 확보하고 개발 편의성을 높였습니다.
Trade-off
코드는 base에 있고 라이브러리 파일은 DFM에 존재하는 비대칭 구조로 인해 구조가 생소해질 수 있으며, 런타임에 모듈 설치 여부 확인 및 SO 파일 로딩 흐름을 개발자가 직접 명시적으로 관리해야 하는 운영상의 복잡도가 존재합니다.
앱의 특정 기능을 별도의 모듈로 분리하여 설치 시점이 아닌 사용자가 필요한 시점에 동적으로 다운로드할 수 있게 하는 Android App Bundle의 핵심 기능입니다.
Hilt를 사용하는 환경에서 DFM처럼 컴파일 타임에 의존성 그래프에 포함되지 않는 모듈이 base 모듈의 의존성을 가져오기 위해 사용하는 인터페이스입니다.
런타임에 추가로 설치된 split APK(DFM) 내의 클래스와 리소스를 앱이 올바르게 인식할 수 있도록 ClassLoader를 업데이트해주는 라이브러리입니다.




