본문 바로가기

Android/Tech

(52)
[Jetpack Compose] CompositionLocal 은 어떻게 동작하는가? 동기 Jetpack Compose 를 꽤 오랜 시간 사용해 왔지만, 여전히 모르는 부분이 많습니다. 그중 가장 가려웠던 부분은 CompositionLocal 인데, 언제 어떻게 사용해야 하는지에 대해서는 알고 있으나, 어떠한 과정으로 적용되는지에 대해 자세히 모르고 있어 포스팅하게 되었습니다. 두 개의 Composable @Composable @OptIn(InternalComposeApi::class) fun CompositionLocalProvider(vararg values: ProvidedValue, content: @Composable () -> Unit) { currentComposer.startProviders(values) content() currentComposer.endProviders..
Glide 와 Coil 은 각각 어떻게 이미지를 불러오는가? 동기 수많은 안드로이드 이미지 처리 라이브러리가 있습니다. 그 중 가장 선호되는 것은 당연히 Glide 와 Coil 일 겁니다. Fresco, Picasso 등이 있지만, 현재는 그다지 많이 사용되진 않는 것 같아요. 프로젝트를 위해 기술 논의를 하던 중, Glide 와 Coil 을 두고 깊이 고민하였습니다. 결국엔 Coil 을 선택하였고요. 가장 주된 이유는 Jetpack Compose 와 통합이 잘 되기 때문이었습니다. (Glide 를 이용하면 작은 처리에도 더욱 많은 코드가 필요합니다.) Glide 와 Coil 에 대해 비교한 포스트는 작성해두었으니, 참고하시면 되겠습니다. [Jetpack Compose] Glide 와 Coil, 무엇을 사용하면 좋을까. 이미지 처리 라이브러리 개발시, 저는 UI에..
VersionCatalog 적용기 동기 현재 진행 중인 네이버 부스트캠프의 학습 스프린트 기간이 종료되고 본격적으로 그룹 프로젝트 개발에 착수했습니다. CleanArchitecture 기반의 앱 서비스를 만들기 위해 모듈화를 진행했습니다. 문득 제가 개발자로 있는 프로젝트 팀의 동료분께서 VersionCatalog 적용에 대한 의사를 여러 번 표하셨던 것이 생각 나, 이번 기회에 먼저 적용해보았습니다. VersionCatalog VersionCatalog 는 의존성 선언 시 선택할 수 있는 방법 중 하나입니다. 기존 방식의 문제점 우리에게 친근한 기존의 방식은 단일 모듈 프로젝트 생성 시 사용이 간편합니다. 별도로 파일을 추가할 필요 없이, 생성되는 모듈 수준의 build.gradle 에 필요한 의존성을 추가하면 됩니다. 그러나, 프로젝..
Activity Lifecycle 의 각 콜백 메서드에서는 어떤 처리를 하는가? 동기 최근 면접 준비를 위해 안드로이드 지식에 대해 다시금 탐구하고 있습니다. 가장 최초로 탐구하려고 했던 주제는 Activity Lifecycle 입니다. 물론 어떠한 순서로 호출이 되고, 특정한 상황에는 또 어떻게 호출되는지에 대해서도 알고 있지만, 호출 되는 시점에 어떠한 일이 발생하는지, 화면은 언제 보여지고 또 언제 숨겨지는지, 숨겨지는 것과 별개로 또 언제 제거되는지 등에 대해서는 잘 모르고 있어 학습하고 포스팅하게 되었습니다. 상속 구조 Activity 는 기본적으로 위와 같은 구조를 지닙니다. 이후 AppCompatActivity 의 하위 타입인지, 아니면 ComponentActivity 의 하위 타입인지에 따라 다르긴 합니다만, 일단 Activity 부터는 기본적으로 같습니다. 그럼, 차..
LayoutInflater 가 xml 을 객체화 하는 과정 동기 네이버 부스트캠프 멤버십 과정에 참여 중인데, xml 기반으로 UI 를 작성하라는 요구 사항이 있어 오래간만에 xml 관련 코드를 잔뜩 작성하고 있습니다. 다만, 최근에 Jetpack Compose 에서의 렌더링에 대해 공부하고 있다 보니, xml 은 어떻게 UI 가 될까? 라는 궁금증이 생겼고, 이를 해결하기 위해 LayoutInflater 를 찾아가보기로 했습니다. LayoutInflater Layout 은 알겠는데, Inflate 라는 단어는 다소 생소해서 찾아봤는데, Inflate 는 '부풀리다'를 의미합니다. xml 에 작성된 코드를 바탕으로 UI 를 그려내니, 부풀리다는 의미가 썩 어울리는 것 같습니다. LayoutInflater 에 작성된 주석에는 해당 클래스의 역할과 생성 등에 관해 ..
[Retrofit] Call<T>.enqueue() 와 suspendable 메서드 호출 방식의 차이 Retrofit 안드로이드의 네트워크 통신은 Retrofit 등장 이전과 이후로 나뉜다고 해도 과언이 아니라고 생각합니다. 그만큼 Retrofit 은 안드로이드 프로그래밍 생태계에 지대한 영향을 미쳤습니다. Retrofit 을 사용하는 방법은 크게 두 가지로 나뉠 텐데요. 첫 번째는 Retrofit 이 제공하는 Callback 클래스를 이용하는 방법이고, 두 번째는 Kotlin Coroutines 와 함께 사용하는 방법이 되겠습니다. 저는 Coroutines 에 익숙해지고 나서부터 보통 두 번째 방법을 이용해왔습니다. 그 전에는 (Java 로 개발 공부하던 시절) 당연히 첫 번째 방법을 이용했고요. HttpUrlConnection 과 AsyncTask 도 활용해보고 그랬었는데, 확실히 Retrofit 을..
RecyclerView 의 업데이트와 DiffUtil 갑자기 RecyclerView? DiffUtil? Jetpack Compose 를 꽤 오래 사용했지만, 현재 참여중인 네이버 부스트캠프 멤버십 과정에서의 UI 관련 요구 사항들은 대부분 View 를 기반으로 주어지는 상황이라 최근에는 xml 코드를 많이 작성하고 있습니다. View 를 기반으로 안드로이드 UI 를 구현하다보면, RecyclerView 를 정말 많이 사용하게 되고, 그에 따라 RecyclerView Adapter 역시 여러 번 구현하게 됩니다. Jetpack Compose 를 오래 전부터 사용하다보니 Adapter 를 어떻게 구현하는지 기억이 안 나서 당황스러웠던 기억도 있네요. RecyclerView Adapter 는 보통 RecyclerView.Adapter 로 구현하게 되는데, 목록에..
Android ViewModel 의 onCleared() 는 언제 호출되는가? ViewModel ViewModel 은 이제는 안드로이드 프로그래밍에 있어서 필수 불가결한 존재가 되었습니다. 특히 MVVM, MVI, MVW 등, 관심사의 철저한 분리가 요구되는 아키텍처에는 꼭 필요합니다. 특정 아키텍처를 적용하지 않더라도, View 가 표시할 상태나 데이터를 위해 ViewModel 이 필요하기도 하고요. Rx라이브러리를 이용하거나 ViewModel 내에서 특정 리소스를 Observing 하는 경우에는 메모리 릭에 대한 리스크를 관리하기 위해 ViewModel 의 onCleared() 에서 관련 작업 또는 리소스들을 해제해주어야 합니다. 이는 다소 제네럴한 지식이고요. 문득, onCleared() 가 언제, 또 어떻게 호출되는지 궁금해졌습니다. 내부 동작 방식 ViewModel 의 o..