본문 바로가기
안드로이드 코딩일지

[Android] Koin 을 통한 ViewModel Injection 먹통 오류 해결 방법

by HAERO_KR 2021. 1. 27.

킹갓 Koin Library

 

Koin 라이브러리를 활용하여 프로젝트에 DI 를 진행하면 코드의 재 사용성이 높아지고, 분명 유지보수에 용이해진다.

 

Koin 이 제공하는 다양한 기능들 중 강력한 기능이 하나 있는데, 바로 ViewModelProvider 없이 ViewModel 인스턴스를 생성하여 사용할 수 있는 기능이다. 또한 Fragment 에서 Activity 의 ViewModel 을 재사용할 수 있도록 도와주기도 한다.

KoinModules 에 ViewModel 을 추가해주고, startKoin 의 Modules 목록에 이를 추가하기만 하면 된다.

 

하지만 필자는 어느날 앱을 개발하던 중 Koin 을 활용하여 ViewModel 인스턴스를 생성하려고 했으나

Koin 에서 제공하는, ViewModel 주입을 위한 'by viewModel' 키워드가 제대로 동작하지 않아 온갖 구글링, 삽질을 총동원 하게 되었다.

 

 

하여간 뭐든간에 한 번에 되는 법이 없다

 

직접 Koin 레포에 들어가 관련 Issue 글들을 모두 찾아보았지만, 필자에게 적절한 해답은 나오지 않았다.

그런데 아래와 같이 상당히 많은 개발자들이 같은 문제로 골머리를 앓고 있는 듯 하였다.

 

https://github.com/InsertKoinIO/koin/issues/383

 

viewModel() not resolving · Issue #383 · InsertKoinIO/koin

viewModel not resolving I am using following dependencies org.koin:koin-android:1.0.2 org.koin:koin-androidx-scope:1.0.2 org.koin:koin-androidx-viewmodel:1.0.2

github.com

그러던 중 위 글을 보게 되었는데, 이러한 답글을 보게 되었다.

사실 상 결정적인 실마리를 제공해주신 @pitoszud 개발자님

물론 동작하지 않았다. 그러나 이 답변을 통해 한 가지 시도를 해볼 수 있었고, 그 결과 드디어 정상 동작하게 되었다. 

바로 패키지명의 'android' 를 'androidx' 로 바꾸어 수동으로 Import 를 하니 해결되었다. 아래처럼 말이다.

 

import org.koin.androidx.viewmodel.ext.android.viewModel

 

Auto Import 가 안되는 이유도 모르겠고, 많은 사람들이 같은 문제를 겪고 있는 듯 하였다.

Koin 레포의 Issue 게시판을 둘러보면 AndroidX 패키지들 중 네임 스페이스가 무언가 겹치는 현상이 발생하는 듯 하다. 

자세히는 모르겠지만, Koin 에서 확실히 이를 개선해주면 좋을 것 같다.

 

편 ㅡ 안

답글에는 모두들 Androidx, Koin 버전을 Legacy 로 변경하면 해결된다고 하는데, 적절한 답변은 아닌 듯 하다. (심지어 해결되지도 않는다.)

허무하게 해결되었으나, 아무튼 해결되어서 다행이다. 같은 문제로 구글과 사투 중인 사람들을 위해 이 글을 남기게 되었다.

하지만 Gradle 버전, 환경에 따라 이 글 또한 도움이 되지 않을 수 있으니 맹신하지 않는 게 좋을 것 같다.

 


 

+ 참고) 사용 중인 AndroidX 라이브러리, Koin 라이브러리 버전들