본문 바로가기

전체 글

(92)
[Jetpack Compose] CompositionLocal 로 이벤트 처리하기 동기 Jetpack Compose 를 활용하여 UI 를 개발하다 보면, Composable 의 테스트 용이성과 재사용성을 높이기 위해 StateHoisting 을 적용하곤 합니다. 제 경우, StateHoisting 을 엄격하게 적용하려다 보니 수많은 람다 파라미터로 인해 Composable 메서드를 호출하는 부분이 과도하게 길어지고, 드릴링이 발생하는 문제가 있었습니다. 저는 이를 CompositionLocal 을 통해 해결하였고, 오늘은 이에 대해 간략하게 작성해보려 합니다. Stability 불필요한 Recomposition 의 발생을 최대한 줄이기 위해 이벤트 처리와 관련된 로직을 Stable 하게 만들어야 합니다. 이에 관한 내용은 아래에서 확인하실 수 있습니다. [Jetpack Compose]..
[Jetpack Compose] 불필요한 Recomposition 을 줄여 앱 퍼포먼스 개선하기 동기 Jetpack Compose 를 활용하여 개발 중인 앱 에는 드래그 앤 드랍과 같은 유저 인터랙션이 존재합니다. 다만 문제가 좀 있었습니다. 드래그 앤 드랍 시 화면이 버벅거린다는 점이었고, 이는 매우 치명적인 문제였습니다. 이를 해결하기 위해 다양한 솔루션들을 시도해보았고, 끝내 효과적인 방법 두 가지를 알게 되었습니다. Jetpack Compose 로 UI 를 구현하였지만 앱의 퍼포먼스 저하를 경험하고 계신 분들께서는 지금부터 기술할 방법들을 적용해보시면 좋을 것 같습니다. 권장사항 권장사항 준수 | Jetpack Compose | Android Developers 권장사항 준수 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 발생할 수 있는 일반적인 Compose..
[Jetpack Compose] HiltViewModel() 을 통해 주입된 ViewModel 의 생애 알아보기 동기 현대적인 구조로 앱을 개발하다 보면, ViewModel 의 사용을 피할 수 없습니다. 다양한 요구 사항 및 유저 플로우에 의해 변경되거나 유실될 수 있는 UI 데이터를 안정적으로 유지하여야 하기 때문입니다. Android Jetpack Library 중 하나인 Hilt 는 Jetpack Compose 를 사용하는 환경에서 ViewModel 의 사용을 보다 간편하게 해주는 기능을 제공하고 있으며, 이 것이 바로 포스트의 주제인 hiltViewModel() 입니다. 오늘은 이에 대해 학습한 것을 정리하고자 합니다. hiltViewModel() hiltViewModel() 메서드에 작성된 주석은 다음과 같습니다. Returns an existing HiltViewModel -annotated ViewMo..
OkHttp3 Interceptor 를 통해 표준화된 응답의 에러 처리하기 동기 저는 보통 프로젝트 진행 시, 백엔드 개발자분께 '표준화된 형태로 성공 및 실패 응답을 반환해달라'고 요청하는 편입니다. 하나의 data class 를 통해 응답을 내려 받아 이에 대한 핸들링을 용이하게 하기 위해서입니다. 일관된 방식으로 요청의 성공 및 실패를 처리할 수 있으며, 더 나은 가독성을 가진 코드를 작성할 수 있게 되죠. 이번에 새롭게 진행하게 된 프로젝트 역시 마찬가지로, 백엔드 동료분께 같은 요청을 드렸습니다. 오늘은 표준화된 JSON 에서 에러를 파싱하기 위해 수행한 과정에 대해 기록하고자 합니다. 응답 표준화의 목적 응답을 표준화하는 이유는 간단합니다. 요청의 성공 또는 실패에 대한 처리를 간편화, 일관화할 수 있습니다. data class CTResponse( val code:..
[Jetpack Compose] Reorderable LazyList 에 Drag&Drop to Remove 곁들이기 동기 DND 8기를 통해 알게 된 좋은 분들과 여전히 함께 이런 저런 작업을 하고 있습니다. 동아리 활동 이후 새롭게 시작한 프로젝트의 UI 중, 다소 복잡하게 설계되어 있는 부분을 담당하게 되었고, 이를 해결 및 구현한 과정에 대해 기록하고자 합니다. 요구 사항은 무엇이었나? 1. + 버튼을 누르면 화면 상단에 재료를 입력할 수 있는 박스가 생성된다. 2. 해당 박스 내의 InputField 에 특정 값을 입력하고 Done 버튼을 누르면 화면 하단의 그리드에 재료가 추가된다. 3. 화면 하단 그리드의 항목은 길게 누른 뒤 드래그하여 순서를 변경할 수 있다. 이게 요구 사항의 전부였다면, 구현하는 데에 큰 어려움이 없었을 것입니다. 관련 기능을 제공하는 유명한 라이브러리가 있기 때문입니다. 하지만 곤란하..
ParentFragmentManager, ChildFragmentManager 동기 간만에 Android View 를 활용해 개발하고 있습니다. Jetpack Compose 를 통해 UI 를 구현한 시간이 길다보니, Fragment 에 대한 지식이 가물가물한 상태입니다. 특정 Fragment 에서 다른 Fragment 를 표시하려는 과정에서, parentFragmentManager 와 childFragmentManager 사이에서 고민하게 되었는데, 이 과정에서 알게 된 것을 간략하게 기록해보고자 합니다. FragmentManager 안드로이드 개발에서 Fragment 는 굉장히 자주 사용됩니다. UI 를 모듈화할 수 있는 것이 특징인데요. 이를 통해 여러 View 를 하나의 Fragment 로 구성하여, 또 하나의 거대한 View 처럼 활용할 수 있기도 합니다. Fragment ..
Composable 파라미터 주의 사항 (feat.Recomposition) 동기 저는 Jetpack Compose 와 MVI 조합을 굉장히 좋아합니다. UI 상태는 uiState 라는 이름의 data class 를 주로 사용하는 편인데, 문득 uiState 를 통째로 넘겨 화면을 업데이트하고 있는 코드에 의문이 생겼습니다. '불필요한 Recomposition 은 Jetpack Compose 가 줄여준다고는 하지만, 확실한걸까?' 라는 의문이 말입니다. 이에 대해 시험한 결과와 함께, Jetpack Compose 사용 시 Composable 의 파라미터 선정에 대한 주의 사항을 기록하고자 합니다. 문제의 코드 @Composable private fun BoxScope.ColorBox(state: UiState) { Box( modifier = Modifier .align(Alig..
Service 를 운용하는 환경에서 앱을 완전히 종료하기 동기 지난 여름에 개발했던 앱 의 리팩토링이 한창입니다. 음악 플레이어 앱 특성 상, 음악을 재생 중이라면 앱이 종료되어도(된 것처럼 보여도) 플레이어의 상태가 유지되어야 합니다. 이러한 스펙을 구현하는 과정 중 학습했던 것을 기록합니다. 완전한 종료 공식 문서, Processes and app lifecycle 의 일부입니다. 다양한 앱 구성 요소의 수명 주기에 대한 이해가 부족하면 중요한 작업 도중 앱 프로세스가 종료될 수 있다는 내용인데, 이는 곧, 다양한 앱 구성 요소의 수명 주기에 대한 이해가 부족하면 앱 프로세스를 종료하고 싶어도 종료하지 못할 수 있다는 것을 의미하기도 합니다. 앱을 완전히 종료해야 하는 이유는 간단합니다. 나도 모르게 무한한 작업이 프로세스 내에서 진행되고 있거나, 미처 해..