Android 아티클

Android 태그가 붙은 모든 Dove Letter 아티클입니다. Google Developer Expert (GDE)인 엄재웅 (skydoves)이 직접 작성한 심층 기술 아티클을 한국어로 만나보세요.

오프라인 우선 앱은 바뀐 것만 어떻게 동기화하는가

오프라인 우선offline-first 앱을 열면 콘텐츠가 곧바로 나타납니다. 로컬 데이터베이스에서 바로 읽어 오고, 그동안 백그라운드 동기화가 조용히 그 데이터베이스를 서버와 맞춰 나가기 때문입니다. Now in Android가 바로 이런 방식으로 동작합니다....

Android
2026년 7월 19일구독자 전용

Compose 레이지 리스트 스크롤바는 내부에서 어떻게 동작하는가

Compose는 부드러운 스크롤은 제공하지만, 정작 거기 어울리는 스크롤바까지 챙겨 주지는 않습니다. LazyColumn이나 LazyRow, LazyVerticalGrid는 콘텐츠 위를 미끄러지듯 지나가지만, 지금 내가 어디쯤 있는지 알려 주는 썸thumb,...

ComposeAndroid
2026년 7월 14일구독자 전용

AI 에이전트는 한 번도 본 적 없는 안드로이드 UI를 어떻게 만들어 내는가: a2ui 첫걸음

이제 AI 에이전트는 작업을 추론하고, 도구를 호출하고, 대화를 이어 갈 수 있습니다. 여전히 잘 해내지 못하는 것은 네이티브 화면을 보여 주는 일입니다. 항공권을 예약하는 에이전트는 선택지를 텍스트로 설명할 수는 있지만, 여러분의 안드로이드 앱에 진짜 날짜...

ComposeAndroid
2026년 7월 7일공개

Jetpack Compose 메커니즘 퀴즈: 열 문제 완전 해설

Jetpack Compose 메커니즘 퀴즈는 평범한 Compose 코드처럼 보이는 열 개의 문제를 던집니다. 스킵되기를 한사코 거부하는 매개변수, 낡은 값을 읽어 버리는 이펙트, 엉뚱한 방향으로 배치되는 Modifier 체인 같은 것들입니다. 각 문제는 런타임이...

ComposeAndroidKotlin
2026년 6월 29일구독자 전용

SavedStateHandle은 어떻게 프로세스 죽음을 견디며, ViewModel·Hilt·Navigation은 어떻게 하나의 레지스트리에 연결되는가

대부분의 안드로이드 개발자는 어떤 값이 프로세스 죽음process death 이후에도 살아남아야 할 때 SavedStateHandle을 꺼내 쓰고는 그대로 넘어갑니다. ViewModel에 주입한 뒤 get과 set을 부르거나 getStateFlow를 호출하면,...

Kotlin MultiplatformAndroidKotlin
2026년 6월 21일구독자 전용

Compose Navigation Graph: Android Studio에서 앱 전체 흐름 시각화하기

Jetpack Compose의 내비게이션navigation은 명령형 코드imperative code입니다. NavKey는 한 파일에서 선언되고, entry<Route { Screen } 람다lambda는 또 다른 파일에서 이를 컴포저블composable에...

Kotlin MultiplatformComposeAndroid
2026년 6월 14일공개

Android Binder IPC는 어떻게 동작하는가: 트랜잭션, Parcel, 그리고 스레드 풀

모든 안드로이드 개발자는 자신도 모르는 사이에 프로세스 간 통신inter-process communication, IPC에 기대어 코드를 짭니다. getSystemServiceContext.ACTIVITYSERVICE를 호출하면 여러분의 앱과는 다른 프로세스인...

Android
2026년 5월 28일구독자 전용

Android 메인 스레드는 어떻게 동작하는가: Looper, Handler, 그리고 MessageQueue 이벤트 루프

모든 안드로이드 개발자는 날마다 메인 스레드main thread를 다루면서도 그 정체를 깊이 생각해 보지는 않습니다. 백그라운드 스레드에서 되돌아오려고 HandlerLooper.getMainLooper.post { textView.text = result }를...

Android
2026년 5월 28일구독자 전용

Context 클래스 계층 구조: ContextWrapper, ContextImpl, 그리고 ContextThemeWrapper

모든 안드로이드 개발자는 Context를 끊임없이 사용합니다. 컴포저블 안에서 LocalContext.current를 읽고, 이미지 로더나 DataStore를 만들 때 누수를 피하려고 getApplicationContext를 호출하며,...

Android
2026년 5월 17일구독자 전용

Compose는 어떻게 Android Choreographer와 동기화하는가

Compose 애플리케이션에서 모든 프레임frame은 안드로이드 Choreographer의 신호로부터 시작됩니다. Choreographer는 디스플레이의 VSYNC 펄스에 맞춰 작업을 스케줄링하는 시스템 컴포넌트로, UI 업데이트가 일정한 주기보통 초당 60...

ComposeCoroutinesAndroid
2026년 5월 10일구독자 전용

Jetpack Compose에서 나만의 Landscapist 이미지 플러그인 만들기

Landscapist는 Jetpack Compose와 코틀린 멀티플랫폼Kotlin Multiplatform을 위한 컴포저블 이미지 로딩 라이브러리입니다. 여러 이미지 컴포저블 중에서도 LandscapistImage가 가장 권장되는 선택지인데, Jetpack...

ComposeAndroidKotlin
2026년 3월 28일공개

Compose Preview의 내부 동작 원리

Compose를 사용하는 모든 안드로이드 개발자라면 컴포저블 함수 위에 @Preview를 작성하고, Android Studio의 디자인 패널에 UI가 렌더링되는 것을 경험해 보셨을 것입니다. 하지만 이 어노테이션 하나가 실제 렌더링된 픽셀로 변환되기까지...

ComposeAndroidKotlin
2026년 3월 15일공개

Jetpack Compose 내부에 숨겨진 다섯 가지 알고리즘과 자료구조

Jetpack Compose는 겉으로 보기에 UI 툴킷에 불과하지만, 내부적으로는 수십 년에 걸친 컴퓨터 과학 연구 성과를 적극적으로 활용하고 있습니다. 런타임은 텍스트 에디터에서 차용한 자료구조를 사용하여 컴포지션Composition 상태를 저장하며,...

ComposeAndroidKotlin
2026년 3월 11일구독자 전용

Activity 생명주기 내부 구조: 프레임워크가 onCreate/onResume/onDestroy를 호출하는 원리

모든 안드로이드 개발자는 onCreate, onResume, onDestroy를 오버라이드해 본 경험이 있을 것입니다. 초기화 로직을 작성하고, 리스너를 등록하고, 리소스를 정리하면서 프레임워크가 적절한 시점에, 올바른 순서로 이러한 메서드를 호출해 줄 것이라고...

Android
2026년 2월 15일구독자 전용

Jetpack Compose로 구글 맵스 스타일 바텀 시트 만들기

구글 맵스Google Maps는 대부분의 안드로이드 개발자가 즉시 알아볼 수 있는 바텀 시트bottom sheet 패턴을 대중화했습니다. 화면 하단에서 살짝 올라온 작은 패널이 중간 높이까지 확장되어 간략한 정보를 보여주고, 전체 화면으로 드래그하면 상세 정보를...

ComposeAndroidKotlin
2026년 2월 15일공개

R8 Keep 규칙 해석: 안드로이드 컴파일러는 어떻게 코드의 생존 여부를 결정하는가

안드로이드 릴리스 빌드는 모두 R8을 거칩니다. R8은 코드를 축소shrink하고, 난독화obfuscate하며, 최적화optimize한 뒤 사용자에게 전달하는 전체 프로그램 최적화 컴파일러입니다. R8의 의사 결정 핵심에는 keep 규칙이 자리하고 있습니다....

Android
2026년 2월 3일구독자 전용

ViewModel: 구성 변경에서 살아남는 원리

안드로이드의 ViewModel은 가장 널리 사용되는 아키텍처 컴포넌트 중 하나이지만, 핵심 생존 메커니즘survival mechanism을 깊이 이해하는 개발자는 많지 않습니다. 클래스에 어노테이션을 달고 Activity에서 viewModels를 호출하면 화면...

AndroidKotlin
2026년 1월 28일구독자 전용

Jetpack Compose의 실험적 Styles API 소개

Jetpack Compose의 Modifier 시스템은 컴포저블에 시각적 속성을 적용하는 핵심 수단이었습니다. background, padding, border 등의 Modifier를 체이닝하여 UI 요소의 외관과 동작을 구성하는 방식인데, 이 접근법은...

ComposeAndroidKotlin
2026년 1월 21일공개

ViewModel 내부 메커니즘과 멀티플랫폼 아키텍처 심층 분석

안드로이드의 ViewModel은 현대 안드로이드 개발에서 필수적인 컴포넌트로 자리잡았습니다. 구성 변경configuration changes에도 유지되는, 생명주기 인식lifecycle-aware UI 데이터 컨테이너를 제공하기 때문입니다. API 표면만 보면...

CoroutinesAndroidKotlin
2026년 1월 6일구독자 전용

Jetpack Compose SlotTable 내부 구조 심층 분석

SlotTable은 Jetpack Compose 애플리케이션의 UI 트리를 메모리에 표현하는 핵심 자료구조입니다. 일반적인 객체 트리 형태가 아니라, 매우 빠른 UI 업데이트를 위해 고도로 최적화된 플랫flat 구조로 설계되어 있습니다. 이 글에서는...

ComposeAndroidKotlin
2025년 9월 28일구독자 전용

학습: 코틀린으로 간단한 의존성 주입 컨테이너 직접 구현하기

의존성 주입Dependency Injection, DI은 소프트웨어 설계의 핵심 패턴으로, 느슨한 결합loose coupling을 촉진하고 애플리케이션의 테스트 용이성과 확장성을 높여 줍니다. Hilt이나 Koin 같은 강력한 라이브러리가 프로덕션 안드로이드...

Android
2025년 8월 31일구독자 전용

Jetpack Compose 컴포넌트를 더 잘 만들기 위한 API 가이드라인 분석

Jetpack Compose 생태계는 최근 몇 년간 폭발적으로 성장했으며, 이제 안드로이드 애플리케이션에서 프로덕션 수준의 UI를 구축하는 데 널리 채택되고 있습니다. Jetpack Compose가 안드로이드 UI 개발의 미래라는 점은 이제 누구도 부정하기...

ComposeAndroidKotlin
2025년 8월 24일구독자 전용