- Hilt 기반으로 Network Module을 구성했는데, 갑자기 제목과 같은 오류가 발생했다. - 다음 함수가 문제였다.@Provides@Singletonfun provideApiService(retrofit: Retrofit, service: Class): T = retrofit.create(service)- Hilt는 DI 그래프를 컴파일 타임에 생성하기 때문에, 어떤 타입을 주입할지 명확히알아야 한다.그런데 위처럼 로 제네릭을 쓰면 어떤 타입인지 컴파일 시점에 알 수 없기 때문에 에러가 발생한 것. - 아래처럼 Api 호출 관련 함수가 하나로 정리된 Interface를 지정해 주면 된다.@Provides@Singletonfun provideApiService(retrofit: Retro..
Kotlin

- 위와 같은 형태의 동적 가이드를 Compose 기반으로 구현했다. - 애니메이션을 제공하는 JSON 파일의 경우, 디자이너분으로부터 제공받은 점 참고. - JSON 파일의 경우 res - raw 폴더를 생성하여 넣어주면 된다. (압축하지 않고, 변형 없이 앱에 들어가야 하는 파일들) - 영상을 보면, JSON 애니메이션이 바로 나타나는게 아니라 서서히 페이드인 되면서 나타난다. - 이를 위해 Compose의 AnimatedVisibility를 활용한다.AnimatedVisibility( visible = showGuide, enter = fadeIn(animationSpec = tween(1500)), exit = ExitTransition.None) { ...- 뷰의 가시성을 조정할..
https://seyoungcho2.github.io/CoroutinesKoreanTranslation/undefined-1.html 일시중단 함수 구성하기 · GitBook이 섹션은 일시 중단 함수를 구성하기 위한 다양한 접근 방식을 다룬다. 일종의 원격 서비스 호출이나 계산 같은 두 유용한 일시 중단 함수들이 서로 다른 위치에 정의되어 있다고 가정해보자.seyoungcho2.github.io- 위 문서를 참고하여 작성했습니다.기본적인 순차 처리- 아래와 같은 코드를 실행하면 기본 순차적 실행으로 인해 42가 반환된다.suspend fun doSomethingUsefulOne(): Int { delay(1000L) // 여기서 유용한 작업을 실행한다고 가정한다. return 13}suspen..
Coroutine 실행 취소- launch를 통해 반환되는 job의 cancel로 코루틴의 실행을 취소할 수 있다.fun main() = runBlocking { val job = launch { repeat(1000) { i -> println("job: I'm sleeping $i ...") delay(500L) } } delay(1300L) // 약간의 시간 동안 delay 한다. println("main: I'm tired of waiting!") job.cancel() // Job을 cancel한다. job.join() // Job의 실행이 완료될 때까지 기다린다. println("main: ..
Scope Builder- 다른 builder들에서 제공하는 Coroutine Scope 외에도, Coroutine Scope 빌더를 활용하여 고유한 scope을 선언할 수 있다. - coroutineScope는 자식 Coroutine 들의 실행이 모두 완료될 때까지 종료되지 않는 Coroutine Scope을 생성한다. - runBlocking의 경우에는 대기를 위해 현재 Thread를 Block 시키는 반면, coroutineScope는 다른 작업이 수행될 수 있도록 작업 중이던 스레드의 자원 사용을 해제한다는 차이가 있다.fun main() = runBlocking { doWorld()}suspend fun doWorld() = coroutineScope { // this: Coroutine..
Coroutine이란?- Coroutine은 일시정지 연산을 위한 인스턴스이다. 이것은 코드의 나머지 부분들과 동시에 실행되는 코드 블록을 가진다는 점에서 스레드와 개념적으로 비슷하다. 하지만, 코루틴은 특정한 스레드에 종속되어 실행되지 않으며, 하나의 스레드에서 일시정지(suspend) 되었다가 다른 스레드에서 재개(resume)될 수 있다. - 일반적인 스레드와 달리 코루틴은 작은 비용으로 생성되고, 필요할 때만 작업을 실행하거나 중단할 수 있기 때문에, 리소스 효율성이 매우 뛰어나다. - 코루틴의 장점으로는 간결한 문법과 취소, 중단, 시간 초과에 대한 제어가 유연하다. Coroutine 핵심 구성 요소- 중단 가능한 suspend 함수 : Coroutine 안에서만 호출 가능suspend fun ..
- 해당 문서와 번역본을 참고했습니다.https://kotlinlang.org/docs/composing-suspending-functions.html#sequential-by-default Composing suspending functions | Kotlin kotlinlang.orghttps://seyoungcho2.github.io/CoroutinesKoreanTranslation/undefined-1.html 일시중단 함수 구성하기 · GitBook이 섹션은 일시 중단 함수를 구성하기 위한 다양한 접근 방식을 다룬다. 일종의 원격 서비스 호출이나 계산 같은 두 유용한 일시 중단 함수들이 서로 다른 위치에 정의되어 있다고 가정해보자.seyoungcho2.github.io- 간혹, 서비스를 구성하면..

- 자사 서비스에서 Realm DB를 활용하고 있다. - Realm DB는 빠르고 가벼운 로컬 데이터 저장을 위한 객체 기반 데이터베이스이다. - Realm DB의 객체로 리스트를 구성할 때는 RealmRecyclerViewAdapter를 이용하여 구성할 수 있다. - 내부 구성은 일반 RecyclerView와 크게 다르지 않다. 하지만 getItem 등의 함수가 RealmDB 자체에서 오리지널 인스턴스를 가져오는 방식으로 동작한다./** * Returns the item in the underlying data associated with the specified position. * * This method will return {@code null} if the Realm instance has ..
- 기존 프로젝트 내에 인앱 결제 관련 로직이 너무 노후화되어 있었고, 함수도 분산되어 있어서 관리하기가 난해했다. - 최근에 모듈을 최신화하면서 주요 함수를 BillingManager라는 싱글톤 object로 정리했는데, 그 내용을 기록해 본다.결제 모듈 초기화object BillingManager { private var billingClient: BillingClient? = null /** * 결제 모듈 초기화 완료 여부 */ fun isReady(): Boolean { val client = this.billingClient ?: return false return client.isReady }- 결제 모듈 초기화 완료 여부를 확인하는..

Application 클래스란?Application 클래스는 Android 애플리케이션의 전반적인 상태를 관리하는 기본 클래스입니다.앱이 실행될 때 가장 먼저 생성되며, 앱이 종료될 때까지 유지됩니다. - 싱글톤처럼 동작하며, 어디서든 접근 가능 - 앱의 생명 주기 관리- 앱 전역에서 공유해야 하는 데이터(예: SharedPreferences, DI Container, Theme, Locale 등)를 관리- 의존성 주입(Dagger/Hilt), Firebase 초기화, Crashlytics 설정 등 각종 초기설정을 여기서 진행 - 반드시 Manifest에 선언해주어야 한다.