도넛 홀 스킵핑과 상태 읽기 지연, 뭐가 다를까?
·
우아한테크코스/레벨1
들어가며얼마전에 레아가 리컴포지션 관련해서 아티클을 공유해주셨어요. 그래서 제가 알고있던 한가지 최적화 기법과 닮아있다고 생각이 들었고 의문이 들었어요. 🤔"도넛 홀 스킵핑이랑 Defer State Read가 결국 같은 말 아닌가?둘 다 '상태를 어디서 읽느냐'의 문제 아님???"직관적으로는 틀린 말이 아니라고 생각해요. 실제로 두 기법의 공통 철학은 "상태를 읽는 위치를 최대한 좁혀라" 이면서 "불필요한 재실행을 줄이는 것." 이라는 목표도 같아요.차이점은 동작하는 레이어가 다릅니다. 목표는 같지만 다른 계층에서 작동하는 두 개의 최적화에 대해서 이 글은 그 차이를 명확하게 짚는 것을 목표로 합니다. 👍🏻1. 전제조건 - Compose의 렌더링 파이프라인두 기법의 차이를 이해하려면 Compose가..
ProcessPhoenix 제거, 자기전에 생각날거야
·
Android/Compose
저는 안드로이드 개발을 하면서 에뮬레이터, 실제 디바이스를 오가면서 앱을 테스트하고 있어요. 디바이스의 경우에는 패드와 저/고사양 기기로 총 3가지를 사용하는데요. 그중에서 저사양 기기에서 앱이 재시작 되는 로직에 프레임드랍이 생기거나 재시작이 무시되는 경우가 종종 발견됐습니다. 처음엔 단순히 기기 성능 문제라고 생각했습니다. 그러나 충분히 최적화 가능하지 않을까? 라는 생각으로 코드를 뜯어보니 사용하던 ProcessPhoenix 라이브러리가 생각보다 무거운 작업을 하고 있었습니다.좀 무거운듯하이링구얼 프로젝트에서는 토큰 만료, 로그아웃, 회원탈퇴의 경우 앱을 재시작하고 있습니다. 그래서 ProcessPhoenix라는 라이브러리를 사용했습니다. 많은 안드로이드 프로젝트에서 사용하는 검증된 라이브러리였으니..
DisposableEffect대신 LifecycleEffect
·
Android/Compose
프로젝트를 진행하면서 Compose의 생명주기를 다루는 방식에 대해 고민하게 되는 건 당연한 것 같습니다. 특히 안드로이드의 생명주기와 컴포저블의 생명주기가 만나는 지점에서 어떤 선택을 해야 하는지는 항상 고민이 되는데요.최근 presentation:home 모듈을 리팩터링하면서 이 문제를 깊이 있게 들여다볼 기회가 있었습니다. 그 과정에서 배운 것들을 공유하고자 합니다.문제 상황앱이 백그라운드에서 다시 활성화될 때마다 알림 권한 상태를 확인해야 하는 요구사항이 있었어요. 자연스럽게 DisposableEffect를 사용했습니다.@Composablefun HomeRoute(viewModel: HomeViewModel) { val lifecycleOwner = LocalLifecycleOwner.cur..
StateFlow를 활용한 네비게이션 상태 관리와 UI 로직 분리
·
Android/Compose
안녕하세요, 최근 Hilingual 프로젝트의 네비게이션 로직을 리팩토링했봤는데요. 이번 글에서는 @Composable에 의존하던 내비게이션 상태 로직을 UI와 분리된 상태 홀더 패턴과 StateFlow를 통해 개선한 과정을 공유하려 합니다. [REF/#182] Refactor navigation with AppState and simplify dialog handling by angryPodo · Pull Request #183 · Hi-lingual/HilingRelated issue closed [REF] MainNavigator Refactor #182 Work Description ✏️ MainNavigator를 MainAppState로 통합 및 리팩토링 기존 MainNavigator의 탐색 ..
Compose에서 안전하게 Side Effect 처리하기 (flowWithLifecycle)
·
Android/Compose
Compose에서 개발을 하다보면 ViewModel에서 발생한 이벤트를 LaunchedEffect로 수집하여 스낵바를 표시하거나 화면을 전환하는 패턴을 자주 사용합니다. 하지만 LaunchedEffect는 안드로이드 생명주기를 인식하지 못해 백그라운드 상태에서도 계속 동작하는 경우가 있어요.이번 글에서는 flowWithLifecycle API를 활용하여 생명주기에 맞는 이벤트 처리 방법과 이를 재사용 가능한 확장 함수로 구현한 경험을 정리했습니다. [REF/#180] Use collectSideEffect extension for side effect handling by angryPodo · Pull Request #181 · Hi-lingual/Hilingual-AnRelated issue 🛠 ..
[Android Compose] Effect Handlers 딥다이브
·
Android/Compose
안녕하세요! 최근 개발 실력이 나름 늘어간다고 생각이 들면서, 이전까지 모호하게 알고 있다고 생각이 들었던 것들에 대해 다시 기초부터 다지는 중인데요. 내가 컴포즈로 개발을 하면서 사이드 이펙트에 대해 고민을 하고 코드를 작성하고 있었나?라는 생각이 들어 정리를 해봤습니다. 다른 분들에게도 도움이 됐으면 좋겠네요!사이드 이펙트란?사이드 이펙트는 컴포저블 함수의 범위를 벗어나 외부 상태가 변경되는 작업을 말해요. 네트워크 요청, 데이터베이스 접근, 파일 시스템 조작 등이 대표적인 예시예요.왜 문제가 될까요?컴포저블 함수는 언제든지, 몇 번이든 호출될 수 있어요. 리컴포지션은 상태 변화, 부모 컴포저블의 변화, 시스템 설정 변경 등 다양한 이유로 발생하죠. 만약 컴포저블 함수 내에서 직접 네트워크 요청을 한..