Seoplee
개발의 섭리, Seoplee의 개발
Seoplee
  • 분류 전체보기 (54)
    • Android (26)
      • Architecture (12)
      • Compose (0)
      • Tips (11)
      • 트러블슈팅 (3)
    • IOS (1)
      • Tips (1)
    • Kotlin (1)
    • Coroutine (3)
      • Flow (3)
    • RxJava (12)
    • CI&CD (1)
    • WEB (8)
    • Network (1)
    • ETC (1)
    • (임시) (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Seoplee

개발의 섭리, Seoplee의 개발

Android/Architecture

WorkManager에 Hilt를 이용하여 의존성 주입하기

2022. 3. 15. 18:12

WorkManager에 Hilt로 의존성 주입하기

안드로이드 Sunflower 코드를 뜯어보며 공부하던 중, Room에 초기 데이터를 채워주기 위해 사용하는 WorkManager를 사용하는데에 문제가 있었다.

Sunflower에서는 Room DB를 생성한 후, 필요한 곳에서 instance를 호출하여 사용하는 구조였으나, 본인은 의존성을 주입할 때 Singleton으로 생성하여 주입하는 식으로 코드를 작성하였기 때문에, WorkManager 내부에서 Room DB를 사용하기 위해선 주입을 받아 사용해야했다.

그러나 일반적으로 WorkManager는 기존에 제공하는 패러미터를 제외하고는 사용할 수 없다. 추가로 패러미터를 넣을 경우 다음과 같은 에러가 호출된다.

java.lang.NoSuchMethodException: com.seoplee.sunflower_study_seoplee.workers.SeedDatabaseWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters]

WorkManager에 Hilt를 이용하여 의존성을 주입하기 위해서는 몇가지 추가해주어야 한다.

참고: https://developer.android.com/training/dependency-injection/hilt-jetpack

우선 hilt를 위한 의존성을 추가한다.

implementation "androidx.hilt:hilt-work:1.0.0"
kapt "androidx.hilt:hilt-compiler:1.0.0"

Application 클래스에 Configuration.Provider 인터페이스를 구현 후, HiltWorkFactory 인스턴스를 전달한다.

@HiltAndroidApp
class MyApplication : Application(), Configuration.Provider  {

    @Inject
    lateinit var workerFactory: HiltWorkerFactory

    init {
        appContext = this
    }

    override fun getWorkManagerConfiguration() =
        Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .build()

    companion object {
        var appContext: Context? = null
            private set
    }
}

어노테이션으로 @HiltWorker를 사용하며, 기존의 WorkManager의 패러미터는 @Assisted 어노테이션으로 구분하여 사용한다.

@HiltWorker
class SeedDatabaseWorker @AssistedInject constructor (
    @Assisted context: Context,
    @Assisted workerParams: WorkerParameters,
    private val db : AppDataBase
)

또한 새로운 패러미터를 추가하게 되면, 기존의 WorkManager가 제공하는 기본 초기화를 수행하지 않게끔 AndroidManifest 파일에 다음과 같이 추가한다.

<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="${applicationId}.workmanager-init"
    tools:node="remove" />

Reference: https://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration

 

저작자표시 (새창열림)

'Android > Architecture' 카테고리의 다른 글

Hilt의 다양한 어노테이션 - @Provides, @Binds, @Qualifier  (0) 2022.05.04
Android MVVM + DI(Hilt) 적용하기  (0) 2022.03.21
DataBinding vs ViewBinding  (0) 2021.11.20
Android - State Pattern  (0) 2021.11.13
Android - TDD 셋업하기 (Unit Test)  (0) 2021.10.13
    'Android/Architecture' 카테고리의 다른 글
    • Hilt의 다양한 어노테이션 - @Provides, @Binds, @Qualifier
    • Android MVVM + DI(Hilt) 적용하기
    • DataBinding vs ViewBinding
    • Android - State Pattern
    Seoplee
    Seoplee
    개발공부를 하며 기록할만한 것들을 정리해놓은 블로그입니다.

    티스토리툴바