개요기존 android 프로젝트에서 CMP 프로젝트로 변경하며 SharedPreferences를 DataStore로 마이그레이션하게 되었다.기존 사용자들의 앱에 SharedPreferences로 저장된 기존 데이터들을 DataStore로 위임시킬 수 있다고 한다.기존 데이터 옮기기위임 패턴 사용하기(by)private val Context.dataStore: DataStore by preferencesDataStore( name = DATASTORE_FILE_NAME, produceMigrations = { context -> listOf(SharedPreferencesMigration(context, OLD_PREFS_FILE_NAME)) }, ..
Ktorfit이란?Ktorfit은 안드로이드의 네트워크 라이브러리인 Retrofit과 ktor를 합한 라이브러리이다. 현재 KMP로 기존 안드로이드 프로젝트에서 확장중이다. Retrofit은 내부적으로 OkHttp를 사용하는 안드로이드 전용 라이브러리이기 때문에 Retrofit을 멀티플랫폼 환경에서 사용 불가하다. 따라서 Retrofit과 같은 방식을 사용하되, 멀티 플랫폼에서 사용가능한 Ktorfit을 사용했다.의존성 추가build.gradle(app 단위)plugins { id("com.google.devtools.ksp") version "CURRENT_KSP_VERSION" id("de.jensklingenberg.ktorfit") version "2.7.2"}sourceSets { commo..
Coil개요이미지 로딩 라이브러리를 사용하는 이유는 무엇일까? 안드로이드에서 이미지를 직접 처리하면 다음과 같은 문제가 발생한다.네트워크 이미지 로딩안드로이드의 UI는 단일 스레드이다. 이 스레드에서 네트워크 요청을 처리하면 그 시간만큼 메인스레드는 블로킹 당하기 때문에 ANR이 발생할 수 있다. 따라서 반드시 백그라운드 스레드에서 비동기 처리가 필요하다.OOM(Out Of Memory Error) 발생안드로이드의 메모리 용량은 한계가 있다. 이 메모리에 여러 이미지 비트맵이 압축 해제된 상태로 메모리에 적재되면 메모리의 한계를 초과하게 된다.캐싱 구현안드로이드는 기본적으로 네트워크, 비트맵, 디스크 등의 캐싱을 제공하지 않는다. 이렇게 되면 이미지가 필요할 때마다 매번 다운로드와 디코딩이 필요하고, 성..
UI 패러다임명령형 UI (XML)XML의 UI 시스템은 명령형 패러다임을 따른다. 즉, 어떻게 UI를 변경할 것인가를 개발자가 단계적으로 지시하는 방식이다.XML은 UI의 초기 상태를 선언할 뿐이며, 실제 화면 변경은 런타임에 View객체를 직접 조작함으로써 이루어진다.textView.text = "Hello"progressBar.visibility = View.GONEbutton.isEnabled = false선언형 UI (Jetpack Compose)compose는 선언형 UI 패러다임을 기반으로 한다. 즉, 상태에 따라 UI를 어떻게 보여줄지를 선언한다.UI는 상태를 직접 보유하지 않으며, 상태가 변경되면 UI는 Recomposition을 하여 다시 그린다.Text(text = if (isLogi..
XML UIViewUI를 구성하는 가장 작은 단위를 말한다. 예를 들면 TextView, ImageView, Button 등이 있다.ViewGroupView를 여러 개 포함할 수 있는 컨테이너 개념이다. 예를 들면 LinearLayout, ConstraintLayout 등이 있다.ViewGroup 자체도 View의 일종이지만, 자식 View들의 Measure, Layout을 담당한다.View Tree 구조다음과 같이 XML으로 구성된 화면은 내부적으로 트리 구조로 이루어져 있다. 이 트리는 단순히 XML → 화면에 그려짐 처럼 동작하지 않는다. 그럼 어떻게 이 XML 코드가 View로 변경되고 화면에 그려질까?XML이 View 객체가 되는 과정XML은 UI를 정의하는 설계 파일이다. 이 XM..
작동 방식HiltHilt는 컴파일 타임에 KAPT/KSP를 통해 어노테이션을 분석한다.MetroMetro는 코틀린 플러그인 컴파일러 시점의 FIR 단계에서 어노테이션을 분석한다.FIR 단계는 IDE에서도 실행되기 때문에 실시간 오류 표시가 가능하고, 컴파일러가 내장되어 있기 때문에 별도의 추가 프로세서 호출이 필요 없어서 KAPT/KSP 보다 빠른 컴파일 속도를 제공한다. 하지만 Metro는 JAVA를 지원하지 않는다.DI 그래프 정의Hilt@HiltAndroidApp 어노테이션을 사용해 Application class에서 전역 그래프를 생성하며, 애플리케이션 시작 시점에 전역 그래프를 생성한다. 애플리케이션이 초기화 되는 시점에 그래프가 생성되므로 제어권은 프레임워크가 갖는다.@HiltAndroidAp..
ColdFlow콜드 플로우는 구독을 하면 데이터가 계속 흐르는 파이프이다. 따라서 누군가 collect()를 호출 즉, 구독을 해야 받을 수 있다. 콜드 플로우는 구독을 시작해야 emit이 가능하다.Flow콜드 플로우이다.Flow는 Coroutines의 일부분으로, 비동기 데이터 스트림을 처리하는 API이다. Flow는 소비자가 구독을 하면 데이터 생산이 시작되며, 이는 메모리 효율성을 높여준다는 장점이 있다. 비동기로 처리하게 되면 UI를 차단하지 않고 효율적으로 업데이트가 가능하다는 장점이 있다.HotFlow핫 플로우는 구독자가 있든 없든 이미 데이터가 흐르고 있는 파이프이다. 즉, 구독자가 있던 없던 emit을 통해 값을 계속 발행할 수 있다.대표적인 예로는 StateFlow와 SharedFlow가..
ViewModel 자동 DI1. 키생성@MapKey@Target(AnnotationTarget.CLASS)@Retention(AnnotationRetention.RUNTIME)annotation class ViewModelKey( val value: KClass,)다음과 같이 ViewModelKey 어노테이션 클래스를 생성한다. 이 어노테이션을 ViewModel에 달아주면 해당 ViewModel이 밑의 코드에 있는 viewModelProviders에 저장할 키 값임을 명시하는 것이다.2. 커스텀 ViewModelFactory생성@ContributesBinding(AppScope::class)class MetroViewModelFactory @Inject constructor( private v..
👍 Lottie의 장점Lottie는 gif와 비교해서 여러 장점이 있다.1. 파일의 크기git는 프레임마다 전체 이미지를 저장하는 비트맵 기반 포맷이다. 하지만 Lottie는 Json 기반으로 구현된 애니메이션 파일이기 때문에 gif 파일보다 낮은 용량을 사용하게 된다.낮은 용량을 사용하는 것은 로딩 속도가 그만큼 빨라지기 때문에, 사용자 경험에 만족을 줄 수 있다.앱의 크기 측면에서도 용량이 적기 때문에 이득이다.2. 품질gif 파일은 해상도가 정해져있는 파일이기 때문에, 크기에 따라 품질이 크게 깨진다. 만약 큰 화면에서 gif 파일을 보여주게 된다면 화면이 깨져 보일 것이다.하지만 Lottie는 Json으로 되어있고 백터로 렌더링하기 때문에 해상도가 정해져있지 않다. 따라서 화질이 깨지지 않는다...
문제"명예의 전당"이라는 TV 프로그램에서는 매일 1명의 가수가 노래를 부르고, 시청자들의 문자 투표수로 가수에게 점수를 부여합니다. 매일 출연한 가수의 점수가 지금까지 출연 가수들의 점수 중 상위 k번째 이내이면 해당 가수의 점수를 명예의 전당이라는 목록에 올려 기념합니다. 즉 프로그램 시작 이후 초기에 k일까지는 모든 출연 가수의 점수가 명예의 전당에 오르게 됩니다. k일 다음부터는 출연 가수의 점수가 기존의 명예의 전당 목록의 k번째 순위의 가수 점수보다 더 높으면, 출연 가수의 점수가 명예의 전당에 오르게 되고 기존의 k번째 순위의 점수는 명예의 전당에서 내려오게 됩니다.이 프로그램에서는 매일 "명예의 전당"의 최하위 점수를 발표합니다. 예를 들어, k = 3이고, 7일 동안 진행된 가수의 점수가..