본문 바로가기

Android/DI

[Koin] Gradle 7.2버전 이상과 Koin 3.2 버전에서 Koin의 변경점.

728x90

2022.05.20 - [Android/Gradle] - [Gradle] Gradle 7.2 버전 대응하기.

이전에 작성한 게시글을 보면 알 수 있겠지만, Gradle 7.2 버전 이상부터는 jcenter()가 제거되었다.

 

 

기존에 사용되던 jcenter()는 위와 같은 주석과 함께 Lint가 발생하고 있었으며,

gradle 버전이 7.2로 올라감에 따라서 jcenter()가 완전히 제거가 되었다.

 

해당 경고가 오래전부터 떠있었기 때문에 영향 있는 부분은 없을 것이라고 생각했지만,

기존에 사용하고 있던 Koin에서는 jcenter()를 사용하고 있었기 때문에, 해당 부분이 제거됨에 따라 에러가 발생하게 되었다.

 

jcenter()가 제거된 상태로 sync를 진행해 보면,

 

 

이처럼 기존에 사용하고 있던 koin이 제대로 동작하고 있지 않는 것을 확인할 수 있다.

import 부분에서도 문제가 있는 것으로 보아, 현재 사용하고 있는 koin 라이브러리에 문제가 있는 것으로 보인다.

 

Koin 공식 페이지로 들어가서 변경된 점을 확인해보도록 하자.

 

 

org.koin ~ 형태에서 io.insert-koin ~ 형태로 변경됐음을 알 수 있다.

 

따라서, 기존에 사용하고 있던 라이브러리를 변경해주도록 한다.

 

implementation "org.koin:koin-android:$koinVersion"
to
implementation "io.insert-koin:koin-android:$koinVersion"

 

이처럼 변경을 해주고, 공식 페이지의 주석을 보면 알 수 있듯이 viewModel이나 다른 것들을 더 이상 사용하지 않아도 된다고 한다.

따라서, viewModel을 사용하기 위해 따로 추가했던 부분을 제거해줘야 한다.

해당 부분을 확인하지 않고, ViewModel을 그대로 사용하는 경우에는 중복된 라이브러리가 있다면서 에러가 발생하게 된다.

 

이처럼 라이브러리를 추가한 후 빌드를 진행하면,

기존에 사용하던 코드의 수정 없이 정상적으로 동작하는 것을 확인할 수 있다.

 


Gradle 버전에 따른 대응을 진행하며 Koin의 버전을 올렸는데,

3.2.0 버전부터 몇 가지 눈에 띄게 변경된 부분이 보여서 해당 부분도 확인해보고자 한다.

 

Koin 공식 페이지에서 Koin Extended DSL (3.2)를 확인해보면,

기존에 사용하던 single 대신 singleOf를 사용할 수 있으며, singleOf 사용 시 get()을 사용하지 않아도 된다고 한다.

 

즉,

 

val useCaseModule: Module = module {
    single { GetMoviesUseCase(get()) }
    single { GetPagingMoviesUseCase(get()) }
    single { GetLocalMoviesUseCase(get()) }
    
    singleOf(::GetMoviesUseCase)
    singleOf(::GetPagingMoviesUseCase)
    singleOf(::GetLocalMoviesUseCase)
}

 

 

이처럼 변경이 가능하다는 것이다.

기존에는 get()을 통하여 해당 class의 생성에 필요한 파라미터를 찾아서 넣어주었는데,

singleOf(::ClassName)을 사용하면 get()을 사용하지 않아도 koin이 알아서 class를 생성하는데 필요한 파라미터를 찾아서 넣어주게 된다.

 

또한, 상속을 받는 클래스의 경우 bind를 사용한다.

 

val repositoryModule: Module = module {
    single<MovieRepository> { MovieRepositoryImpl(get(), get()) }

    // import org.koin.core.module.dsl.bind
    singleOf(::MovieRepositoryImpl) {
        bind<MovieRepository>()
    }

    // import org.koin.dsl.bind
    singleOf(::MovieRepositoryImpl) bind MovieRepository::class
}

 

이런 식으로 2가지 방법을 사용하여 선언해 줄 수 있다.

각 방법에서 import 되는 것이 다르기 때문에, 동일한 것이 아님을 보여주기 위하여 주석에 추가해두었다.

 

사실 get()을 사용하는 것도 해당 클래스를 생성하는데 필요한 파라미터 수만큼 넣어주면 되는 것이라 불편한 부분은 없었지만, get() 자체를 사용하지 않고 클래스 이름만 선언해서 사용할 수 있도록 변경되어 더욱더 편리하고 간단하게 사용이 가능해진 것으로 보인다.

 

Koin Extended DSL (3.2) 페이지에서는 아직 많은 정보가 없어서 이것들 외에는 singleOf로 변경하지 못하였고, 하는 방법도 자세히 나와있지 않다.

 

필자는 해당 부분을 좀 더 사용해볼 수 있지 않을까 생각하였고,

viewModel 부분도 하나의 라이브러리로 합쳐졌으니 사용할 수 있지 않을까?라는 생각에 viewModel에서도 동일하게 선언하여 사용해 보았다.

 

val viewModelModule: Module = module {
    viewModel { MainViewModel(get()) }
    viewModel { MoveViewModel(get()) }
    viewModel { MovieSearchViewModel(get(), get(), get(), get(), get()) }

    singleOf(::MainViewModel)
    singleOf(::MoveViewModel)
    singleOf(::MovieSearchViewModel)
}

 

이런 식으로 말이다.

기존에 ViewModel을 사용하기 위해서는 single이나 factory 키워드가 아닌 viewModel 키워드를 사용하여서 ViewModel임을 명시해주어야 했는데, 

singleOf로 동일하게 선언하여 사용했을 때 정상 동작하는 것을 확인했다.

 

세 번째 VM인 MovieSearchViewModel 같은 경우 5개의 파라미터를 사용하는데, 이것들을 생략하고 그냥 클래스 이름만으로 선언해보니 상당히 편하다는 것을 느낄 수 있었다.

 

하지만,

아직까지 공식 페이지에서 ViewModel에 대한 예시를 보면 singleOf를 사용하지 않고 viewModel 키워드를 사용하고 있기 때문에,

해당 버전에서만 적용되어 있거나, 어떠한 문제로 인하여 ViewModel까지 적용되고 있을 가능성이 있으므로, 이렇게 사용도 가능했다더라. 정도로만 알고 넘어가는 것이 좋을 것 같다.


Gradle 대응 때문에 Koin을 다시 확인해 보았는데, dependencies 부분만 변경하면 되는 문제라서 아주 간단히 해결할 수 있었다.

아무래도 jcenter가 제거된다는 정보가 오래전부터 있었다 보니, 당연히 jcenter가 제거될 것을 고려하고 만들어뒀을 것이라고 생각한다.

 

또한, Koin 3.2 버전에서는 조금 더 사용하기 편하게 개선된 부분이 있었는데,

아직 문서만 훑어보고 많은 부분을 적용해보지 않았지만 singleOf라는 것 하나만으로 상당히 편하게 사용이 가능해졌다고 느낄 수 있었다.

 

LoadMap을 확인해보니, 올해 4분기까지 3.3 버전을 출시할 예정이라고 하니, 연말쯤에는 한번 더 확인하여 변경된 점과 개선된 점을 확인하고 코드를 리팩토링하는 시간을 갖는 게 좋을 것으로 보인다.

 

지금까지는 버전이 올라갈수록 조금 더 편리하고 간단하게 사용할 수 있도록 개선되고 있기 때문에, 다음 버전에는 얼마나 개선이 될지 기대된다.

 

해당 게시글에 사용한 예제는 Github에 올려두었다.

https://github.com/HeeGyeong/ModuleArchitecture

 

GitHub - HeeGyeong/ModuleArchitecture

Contribute to HeeGyeong/ModuleArchitecture development by creating an account on GitHub.

github.com

 

728x90