DevLog

엔지니어링 블로그를 한 곳에서 탐색하고, 최근 발행 흐름을 빠르게 파악할 수 있는 서비스 입니다.

Quick Links

  • Latest Feed
  • Engineering Directory

Support

  • 소개
  • 개인정보처리방침

Contribute

  • 원하는 블로그 추가 (준비 중)
  • Feedback

© 2026 DevLog Inc. All rights reserved.

본 사이트는 공개 RSS 피드를 통해 콘텐츠를 수집하며, 모든 콘텐츠의 저작권은 원저작자에게 있습니다.

Back to Feed
Read Original

Contents

Continue Reading

  • More from 당근
  • Related reads#Android
#Mobile

200MB 모듈을 팀 단위로 해결하기: 당근 숏폼팀의 On-demand Dynamic Feature Module 도입

200MB 모듈을 팀 단위로 해결하기: 당근 숏폼팀의 On-demand Dynamic Feature Module 도입
01

Summary

"200MB 모듈이 0MB로?" 당근 숏폼팀의 기막힌 다이어트 비결, On-demand DFM

전 세계 2,000만 사용자에게 민폐 끼치지 않고 화려한 편집 기능을 넣는 법

당근 숏폼팀이 대규모 멀티 모듈 환경에서 비디오 편집 기능의 고용량 문제를 어떻게 해결했는지 상세히 다룹니다. 단순히 기술을 적용하는 것을 넘어, Hilt 의존성 주입 이슈부터 네이티브 라이브러리(STL) 충돌까지 실무에서 마주친 험난한 고비들을 돌파한 생생한 엔지니어링 기록입니다.

  • 01초기 200MB에서 40MB로, 다시 DFM으로 90% 추가 절감한 용량 최적화 여정
  • 02Hilt 어노테이션 프로세서의 한계를 EntryPoint 패턴으로 극복한 사례
  • 03SplitCompat을 이용한 동적 모듈 클래스 로더 패치 전략 공유
  • 04네이티브 라이브러리 로딩 시 발생하는 UnsatisfiedLinkError 해결 노하우
  • 05'완벽한 분리'보다 '안정적인 운영'을 택한 실용적인 아키텍처 의사결정

+RECOMMENDATION

앱의 특정 기능이 전체 용량의 큰 비중을 차지하거나, 특정 국가/그룹에게만 선별적으로 기능을 제공해야 하는 안드로이드 엔지니어에게 이 글은 완벽한 가이드가 될 것입니다.

The Problem

당근 숏폼 서비스인 '당근 스토리'에 비디오 편집 기능을 추가하면서 모듈 용량이 200MB까지 비대해졌으며, 리소스를 CDN으로 전환한 후에도 40MB의 용량이 남아 글로벌 사용자에게 큰 부담이 되었습니다. 영상 편집은 일부 사용자만 사용하는 기능임에도 모든 사용자가 이를 설치해야 하는 비효율성을 해결해야 했습니다.

The Solution

Android의 On-demand Dynamic Feature Module(DFM)을 도입하여 사용자가 편집 기능을 요청할 때만 모듈을 다운로드하도록 설계했으며, 기술적 복잡도를 낮추기 위해 기능 코드는 base 모듈에 유지하고 대용량의 SO 파일(네이티브 라이브러리)만 DFM으로 분리하는 전략을 취했습니다.

The Result

결과적으로 편집 기능 관련 용량을 90% 이상 절감하여 글로벌 서비스에 미치는 영향을 최소화했으며, 기능을 코드와 분리함으로써 DFM 로딩 실패 시에도 앱의 안정성을 확보하고 개발 편의성을 높였습니다.

Trade-off

코드는 base에 있고 라이브러리 파일은 DFM에 존재하는 비대칭 구조로 인해 구조가 생소해질 수 있으며, 런타임에 모듈 설치 여부 확인 및 SO 파일 로딩 흐름을 개발자가 직접 명시적으로 관리해야 하는 운영상의 복잡도가 존재합니다.

03

Key Concepts

Concept · 01

Dynamic Feature Module (DFM)

앱의 특정 기능을 별도의 모듈로 분리하여 설치 시점이 아닌 사용자가 필요한 시점에 동적으로 다운로드할 수 있게 하는 Android App Bundle의 핵심 기능입니다.

  • 사용자 요청 시 다운로드하는 On-demand Delivery 방식을 선택함
  • 기존 전체 설치 방식 대비 초기 앱 설치 용량을 획기적으로 줄임
Concept · 02

EntryPoint

Hilt를 사용하는 환경에서 DFM처럼 컴파일 타임에 의존성 그래프에 포함되지 않는 모듈이 base 모듈의 의존성을 가져오기 위해 사용하는 인터페이스입니다.

  • DFM에서 Hilt를 직접 사용할 수 없는 제약을 해결하기 위해 도입함
  • base 모듈에서 의존성을 노출하고 DFM에서 Dagger 컴포넌트를 수동으로 구성해 연결함
Concept · 03

SplitCompat

런타임에 추가로 설치된 split APK(DFM) 내의 클래스와 리소스를 앱이 올바르게 인식할 수 있도록 ClassLoader를 업데이트해주는 라이브러리입니다.

  • DFM 설치 후 발생하는 ClassNotFoundException을 방지하기 위해 적용함
  • Application 클래스에 install 로직을 추가하여 동적 설치 환경을 지원함
Continue reading · same source

당근More from 당근

View all posts from 당근
  • 혼자 시작해 전국 오픈까지, 당근 레슨/과외 빌딩 로그

    MarketplaceProduct Market FitFunnel Optimization
    2주 전
  • 디자인시스템 팀은 디자인시스템만 잘 만들면 될까

    Design SystemAI in DesignUX Patterns
    1개월 전
  • 당근 200+개 DB 를 옮기는 ELT 플랫폼, DT Platform 을 만든 이야기

    ELTApache SparkApache Airflow
    1개월 전
  • 누구나 찾아볼 수 있는 중고거래 서버 LLM 릴리즈 노트 도입기

    LLMGitHub ActionsNotion
    2개월 전
  • How We Protect Karrot’s Internal PyPI Proxy from Supply Chain Attacks

    PyPIAWS CodeArtifactSecurity Cooldown
    2개월 전

Related reads#Android

Explore #Android
NAVER D2

Android 앱의 의도치 않은 변경 방지하기

#Android1개월 전
NAVER D2

안드로이드 빌드 대기 시간 없애기

#Android1개월 전
Pinterest

모두를 위한 성능: 핀터레스트의 자동화된 성능 측정 시스템

#Android3개월 전
쏘카·Bluetooth

쏘카프레임 - 블루투스 모듈

#Android6개월 전
쏘카·Socar Frame

쏘카프레임 - 앱 프레임워크와 개발자 경험

#Android6개월 전

Source

당근
당근
Engineering Blog

Published · February 27, 2026

Topics

AndroidDFMApp BundleOn-demandOptimizationNative LibraryMulti-module