Android 30

[Android] Type Safety Navigation With Compose

Compose에서 화면을 전환하기 위해서는 Navaigation 사용이 필수적이다.하지만 예전 버전의 경우 Route를 String으로 지정해줘야 하는 불편함이 있었다. 그런 불편함을 개선하고 새로 나온 Type Safety Navigation의 사용법과 주의점을 소개하고자 한다.    Dependencies"androidx.navigation:navigation-compose:2.8.0-beta04" // 2.8.0-alpha01 부터 가능"org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.0" // kotlin 2.0"org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3" // kotlin 1.9.22이렇게 두개..

[Android] Dagger Hilt, 제대로 알고 쓰자

Hilt가 뭘까??Hilt는 안드로이드 프로젝트에서 수동 의존성 주입 시 발생하는 보일러 플레이트를 줄이는 의존성 주입 라이브러리이다.Hilt는 Dagger가 제공하는 컴파일 시간 정확성, 런타임 성능, 확장성 및 Android Studio의 이점을 누리기 위해 인기 있는 DI 라이브러리인 Dagger를 기반으로 빌드되었다.  왜 쓰는 걸까??의존성 주입을 위해서는 많은 보일러플레이트가 존재한다. 이러한 보일러플레이트들을 줄이기 위해서 나온 것이 Hilt이다. 여러분들이 가장 많이 겪었을 상황을 아래 예시와 함께 보자.이렇게 ViewModel에 Repository를 Inject해주고 있다.이러한 코드를 사용하기 위해서는 ViewModel은 내부 파라미터를 지원하지 않기 때문에 반드시 DI를 해줘야한다. ..

Android Version Catalog를 야무지게 써보자

이제 안드로이드 프로젝트를 생성하게 된다면 아래처럼 Version Catalog로 설정이 된다.[versions]agp = "8.3.0"kotlin = "1.9.0"...[libraries]androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }junit = { group = "junit", name = "junit", version.ref = "junit" }...[plugins]androidApplication = { id = "com.android.application", version.ref = "agp" }...[bundles]orbit = ["orbit-core", "orbit-viewm..

Android 2024.05.08

Jetpack Compose : Strong Skipping Mode

주의 사항 : Strong Skipping Mode는 현재 실험적이고 아직 프로덕션 용도로 사용될 준비가되지 않았습니다. Compose 1.7에서 활성화 하는 것을 목표로 하고있습니다 Strong Skipping ModeCompose Compiler 1.5.4 version에 추가된 실험적인 모드입니다.Strong Skipping Mode를 적용시킨다면 아래와 같은 두가지 방법으로 동작을 변경시킵니다.- 불안정한 매개변수가 있는 컴포저블을 안정화(skippable)하게 변경합니다.- 불안정한 Lambda는 remember를 적용시킵니다.skippable : 컴파일러가 컴포저블을 건너뛸 수 있음. 리컴포지션이 되지 않음  Composable skippability기본적으로 Compose 컴파일러는 Comp..

Preference Datastore

언제 쓸까?로그인 세부 정보 저장, 다크모드 설정, 글꼴 크기 등 작고 간단한 데이터 세트에 적합대용량 or 복잡한 데이터 → Room을 쓰자.  Jetpack DataStore 라이브러리 → 데이터 저장을 위한 간단하고 안전한 비동기Preference DataStore : key-value로 저장Proto DataStore : 프로토콜 버퍼를 사용하여 스키마 정의 → Strong Type 데이터 유지 가능Proto DataStore는 type safety, 효율적이지만 구성과 설정이 필요함Preference DataStore는 쉽게 설정 가능  필수 추가 종속성implementation("androidx.datastore:datastore-preferences:1.0.0")implementation("..

Android 2024.04.25

구글 권장 앱 아키텍처

Clean : UI → Domain ← Data Google : UI → Domain(optional) → Data UI Layer UI 레이어 : 화면에 애플리케이션 데이터를 표시 사용자 상호작용 또는 외부 입력으로 인해 데이터가 변할 때마다 변경사항을 반영하도록 UI가 업데이트 돼야함. UI Element + UI State = UI State를 활용해서 UI를 나타내줘야함 우수 사례 data class NewsUiState( val isSignedIn: Boolean = false, val isPremium: Boolean = false, val newsItems: List = listOf(), val userMessages: List = listOf() ) data class NewsItemUiS..

Android 2024.04.19

Android Jetpack Comopse의 CompositionLocal을 이해하고 써보자

왜 나온걸까?Composable 함수는 Tree구조를 가지고 있다.이때, 상태(state)는 일반적으로 최상단 노드에 저장이 되어있어야 한다(상태 호이스팅)상위 트리에서 만든 상태를 하위 트리에서 매개변수로 받는 것이 아닌, 바로 접근할 수 있게 해준다.  왜 최상단에 저장되어있어야 할까?컴포넌트들은 상태를 모르는게 좋다. 최상단에서 전달해준 정보를 바탕으로 화면을 나타내는 것이 더 좋은 방법이라고 생각한다. 왜냐하면 상태를 컴포넌트 별로 다 가지고 있다면 이후 추적하는 것도 힘들고, 각각의 상태를 하나씩 참조하며 변경해줘야 하기 때문에 관리하기 더 어려워 진다. 그렇다면 상태가 최상단에 있고, 트리 개념으로 아래로 내려가는 UI 구조를 가진다고 했는데 “매번 변수로 state를 내려줘야..

패키지 이름이 중복일때 해결하는 방법 :(

android 개발을 할때 가장 마주치고 싶지 않은 상황중 하나인 패키지명을 수정하는 상황을 만났을 때 해결방법을 소개하고자 한다. 패키지명을 바꾸는 경우는 아래와 같다고 생각한다. 1. 패키지에 example이 있는 경우 - play스토어에 올리기 위해서는 com.example.~~~으로 시작하면 안된다. 어떻게 알았냐구요? 알고싶지 않았어요.... 2. 패키지명이 중복된 경우 - play스토어에 이미 같은 패키지가 올라가있는 경우 게시가 불가능하다. 이것도 직접 겪은 감동실화다... 예전에 작업할 때는 수정하는 방법을 몰라서 파일 전체를 날리고 다시 만드는 일을 한 적이 있다. 그때 공부해둔 방법을 이번에 프로젝트를 진행하며 적용하게 되었다. 수정할 당시 너무 긴장해서 스크린샷은 못찍었습니다 ㅎㅎ....

Android 2024.01.15

Coil이 항상 옳을까? Coil vs Glide

왜 이 주제를 선택했을까? 얼마전 당근에 다니고 계시는 선배님과 잠깐 전화로 이야기를 나눌 일이 있었다. 내 이력서를 보시고 다양한 코멘트 들을 해주셨는데 그 중 “내가 사용하는 기술에 대한 명확한 근거가 있어야 한다”라는 내용이 있었다. 그 이야기를 듣고 생각해보니 난 그저 관습적으로 늘 쓰던 기술을 사용한 것 뿐이지 왜 그 기술을 사용 했는지에 대한 명확한 근거가 없었다. 그래서 내가 사용하는 기술과, 그 대체재를 찾아보고 명확한 근거를 수립하여 이후 프로젝트에서 사용할 기술을 정하고자 한다. 이번 글에서 비교해볼 주제는 “이미지 로딩 라이브러리”이다. Coil이란? Coil은 Kotlin Coroutines로 만들어진 Android 백엔드 이미지 로딩 라이브러리로, Cououtine Image Lo..

RecyclerView와 SnapHelper - SnapHelper 커스텀

아래 두 동영상의 차이점이 뭘까? 왼쪽은 각 항목들이 호롤롤로롤로로 힘없이 넘어간다. 반면 오른쪽 동영상은 한칸씩 딱! 딱! 맞춰서 넘어간다. 이걸 구현하기 위해서 대부분은 ViewPager를 사용할 것이다. 이 상황에서는 맞는 방법이다. 하지만 이런 UI라면? Grid처럼 한 페이지에 여러 값이 존재하고, 그게 한칸씩 딱딱 맞춰서 넘어가야한다. 그리고 중요한점. 가운데 정렬이 아닌, 왼쪽 정렬이다 이거땜에 개빡쳤었다. 💡 이럴때는 ViewPager를 쓰는것도 나쁘지 않지만, RecyclerView도 활용해보자. 왜 굳이 ViewPager를 안쓰고 RecyclerView를 쓸까? 구현하기가 너무 귀찮았다그래서 RecyclerView를 Grid레이아웃으로 작성하고, Custom해서 VIewPager효과를 ..