Android 태그가 붙은 모든 Dove Letter 아티클입니다. Google Developer Expert (GDE)인 엄재웅 (skydoves)이 직접 작성한 심층 기술 아티클을 한국어로 만나보세요.
오프라인 우선offline-first 앱을 열면 콘텐츠가 곧바로 나타납니다. 로컬 데이터베이스에서 바로 읽어 오고, 그동안 백그라운드 동기화가 조용히 그 데이터베이스를 서버와 맞춰 나가기 때문입니다. Now in Android가 바로 이런 방식으로 동작합니다....
Compose는 부드러운 스크롤은 제공하지만, 정작 거기 어울리는 스크롤바까지 챙겨 주지는 않습니다. LazyColumn이나 LazyRow, LazyVerticalGrid는 콘텐츠 위를 미끄러지듯 지나가지만, 지금 내가 어디쯤 있는지 알려 주는 썸thumb,...
이제 AI 에이전트는 작업을 추론하고, 도구를 호출하고, 대화를 이어 갈 수 있습니다. 여전히 잘 해내지 못하는 것은 네이티브 화면을 보여 주는 일입니다. 항공권을 예약하는 에이전트는 선택지를 텍스트로 설명할 수는 있지만, 여러분의 안드로이드 앱에 진짜 날짜...
Jetpack Compose 메커니즘 퀴즈는 평범한 Compose 코드처럼 보이는 열 개의 문제를 던집니다. 스킵되기를 한사코 거부하는 매개변수, 낡은 값을 읽어 버리는 이펙트, 엉뚱한 방향으로 배치되는 Modifier 체인 같은 것들입니다. 각 문제는 런타임이...
대부분의 안드로이드 개발자는 어떤 값이 프로세스 죽음process death 이후에도 살아남아야 할 때 SavedStateHandle을 꺼내 쓰고는 그대로 넘어갑니다. ViewModel에 주입한 뒤 get과 set을 부르거나 getStateFlow를 호출하면,...
Jetpack Compose의 내비게이션navigation은 명령형 코드imperative code입니다. NavKey는 한 파일에서 선언되고, entry<Route { Screen } 람다lambda는 또 다른 파일에서 이를 컴포저블composable에...
모든 안드로이드 개발자는 자신도 모르는 사이에 프로세스 간 통신inter-process communication, IPC에 기대어 코드를 짭니다. getSystemServiceContext.ACTIVITYSERVICE를 호출하면 여러분의 앱과는 다른 프로세스인...
모든 안드로이드 개발자는 날마다 메인 스레드main thread를 다루면서도 그 정체를 깊이 생각해 보지는 않습니다. 백그라운드 스레드에서 되돌아오려고 HandlerLooper.getMainLooper.post { textView.text = result }를...
모든 안드로이드 개발자는 Context를 끊임없이 사용합니다. 컴포저블 안에서 LocalContext.current를 읽고, 이미지 로더나 DataStore를 만들 때 누수를 피하려고 getApplicationContext를 호출하며,...
Compose 애플리케이션에서 모든 프레임frame은 안드로이드 Choreographer의 신호로부터 시작됩니다. Choreographer는 디스플레이의 VSYNC 펄스에 맞춰 작업을 스케줄링하는 시스템 컴포넌트로, UI 업데이트가 일정한 주기보통 초당 60...
Landscapist는 Jetpack Compose와 코틀린 멀티플랫폼Kotlin Multiplatform을 위한 컴포저블 이미지 로딩 라이브러리입니다. 여러 이미지 컴포저블 중에서도 LandscapistImage가 가장 권장되는 선택지인데, Jetpack...
Compose를 사용하는 모든 안드로이드 개발자라면 컴포저블 함수 위에 @Preview를 작성하고, Android Studio의 디자인 패널에 UI가 렌더링되는 것을 경험해 보셨을 것입니다. 하지만 이 어노테이션 하나가 실제 렌더링된 픽셀로 변환되기까지...
Jetpack Compose는 겉으로 보기에 UI 툴킷에 불과하지만, 내부적으로는 수십 년에 걸친 컴퓨터 과학 연구 성과를 적극적으로 활용하고 있습니다. 런타임은 텍스트 에디터에서 차용한 자료구조를 사용하여 컴포지션Composition 상태를 저장하며,...
모든 안드로이드 개발자는 onCreate, onResume, onDestroy를 오버라이드해 본 경험이 있을 것입니다. 초기화 로직을 작성하고, 리스너를 등록하고, 리소스를 정리하면서 프레임워크가 적절한 시점에, 올바른 순서로 이러한 메서드를 호출해 줄 것이라고...
구글 맵스Google Maps는 대부분의 안드로이드 개발자가 즉시 알아볼 수 있는 바텀 시트bottom sheet 패턴을 대중화했습니다. 화면 하단에서 살짝 올라온 작은 패널이 중간 높이까지 확장되어 간략한 정보를 보여주고, 전체 화면으로 드래그하면 상세 정보를...
안드로이드 릴리스 빌드는 모두 R8을 거칩니다. R8은 코드를 축소shrink하고, 난독화obfuscate하며, 최적화optimize한 뒤 사용자에게 전달하는 전체 프로그램 최적화 컴파일러입니다. R8의 의사 결정 핵심에는 keep 규칙이 자리하고 있습니다....
안드로이드의 ViewModel은 가장 널리 사용되는 아키텍처 컴포넌트 중 하나이지만, 핵심 생존 메커니즘survival mechanism을 깊이 이해하는 개발자는 많지 않습니다. 클래스에 어노테이션을 달고 Activity에서 viewModels를 호출하면 화면...
Jetpack Compose의 Modifier 시스템은 컴포저블에 시각적 속성을 적용하는 핵심 수단이었습니다. background, padding, border 등의 Modifier를 체이닝하여 UI 요소의 외관과 동작을 구성하는 방식인데, 이 접근법은...
안드로이드의 ViewModel은 현대 안드로이드 개발에서 필수적인 컴포넌트로 자리잡았습니다. 구성 변경configuration changes에도 유지되는, 생명주기 인식lifecycle-aware UI 데이터 컨테이너를 제공하기 때문입니다. API 표면만 보면...
SlotTable은 Jetpack Compose 애플리케이션의 UI 트리를 메모리에 표현하는 핵심 자료구조입니다. 일반적인 객체 트리 형태가 아니라, 매우 빠른 UI 업데이트를 위해 고도로 최적화된 플랫flat 구조로 설계되어 있습니다. 이 글에서는...
의존성 주입Dependency Injection, DI은 소프트웨어 설계의 핵심 패턴으로, 느슨한 결합loose coupling을 촉진하고 애플리케이션의 테스트 용이성과 확장성을 높여 줍니다. Hilt이나 Koin 같은 강력한 라이브러리가 프로덕션 안드로이드...
Jetpack Compose 생태계는 최근 몇 년간 폭발적으로 성장했으며, 이제 안드로이드 애플리케이션에서 프로덕션 수준의 UI를 구축하는 데 널리 채택되고 있습니다. Jetpack Compose가 안드로이드 UI 개발의 미래라는 점은 이제 누구도 부정하기...