본문 바로가기

내일배움캠프 안드로이드 3기

[TIL] 24.03.14 사이드 프로젝트: Hilt 적용하기

1. 사이드 프로젝트: Hilt 적용하기

 

❗ 빌드 설정 이슈

 

 사이드 프로젝트를 진행하면서 늘 하던 것처럼 Hilt를 이용해 DI를 적용하려고 했는데, 에러가 생겼다.

Check that your Kotlin version is >= 1.0: java.lang.IllegalStateException: Unsupported metadata version. Check that your Kotlin version is >= 1.0

 

 

 예전에도 한번 겪은 오류인데, 실제로 내가 코틀린 버전을 1.0 미만으로 사용하고 있는 것은 아니고, 아마 build 파일들을 설정할 때 뭔가 누락해서 발생한 것이었을 것이다. 

 

buildscript {
    dependencies {
    ...
        classpath("com.google.dagger:hilt-android-gradle-plugin:2.44")
    ...
    }
}

 

 일단 프로젝트 수준 build.gradle.kts에 hilt-android-gradle-plugin을 추가하고 다시 실행했지만, 여전히 같은 에러가 발생했고 이번엔 세부 에러를 살펴보기로 했다.

 

Execution failed for task ':app:kaptDebugKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction
   > java.lang.reflect.InvocationTargetException (no error message)

 

 kapt 관련 플러그인을 잘못 설치했나 싶어서, Android Developers의 Hilt 레퍼런스를 참조해 가며 비교했는데 똑같이 구현한 상태였다. 이상하다 싶었는데, IDE에서 Hilt의 버전을 레퍼런스처럼 2.44가 아닌 2.48로 추천하고 있길래 변경해주었더니 그냥 해결되었다.. 

 

분명 Android Developers에서는 2.44로 쓰고 있었는데..

 

 

📝 @Binds 위주로 써보기

 

@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {

    @Binds
    abstract fun bindSearchRepository(repo: SearchRepositoryImpl): SearchRepository
}

 

 그리고 @Provides보다 @Binds 어노테이션이 생성 코드 경량화나 성능 상에서 우위를 가진 다는 걸 보고, 이번엔 레퍼런스의 권고대로 내가 만든 클래스들을 주입하는 모듈들은 위의 예시처럼 @Binds를 이용해 구현했다. 그러다보니, 인터페이스와 구현체를 분리해두지 않은 클래스에 대해서는 dependency cycle이 발생하여 에러를 뱉었다. @Provides에서는 직접 provide 할 객체를 구현하게 되니, 문제가 없었던 게 아닐까 싶다. 

 여튼 그래서 클래스로 작성되어 있던 MediaSearchPagingSource를 구현체로 바꾸고, MediaSearchPagingSource 인터페이스를 따로 생성해주었다. DataSource도 이런식으로 분리했던가 싶어서 굳이 분리하지 않았던건데(domain과는 무관하므로), 결국에는 분리하게 됐다. 

 이 부분을 고쳐주고 나니 아래처럼, 미리 구현해둔 로직대로 네트워크 응답을 잘 받아오는 걸 확인할 수 있었고 앱도 죽지 않았다.

 

 

 DI 적용도 얼추 해놨으니, 내일은 MVVM 적용을 위해 ViewModel을 추가할 것 같다