본문 바로가기
Android

[DI] Android Hilt 사용 예제

by KwakEuiJin 2023. 3. 10.

 안드로이드 앱을 개발할 때 종종 의존성 주입(Dependency Injection)이 필요합니다. 의존성 주입은 객체 간의 결합도를 낮추고 코드의 유지 보수성과 테스트 용이성을 높이는 데에 매우 유용합니다. 안드로이드 앱에서 의존성 주입을 구현하는 방법 중 하나는 Hilt를 사용하는 것입니다. 이번 글에서는 Hilt를 사용하여 안드로이드 앱에서 의존성 주입을 구현하는 방법에 대해 알아보겠습니다.

 

1. Hilt란?

 Hilt는 안드로이드 앱에서 Dagger를 더 쉽게 사용할 수 있도록 도와주는 라이브러리입니다. Dagger는 안드로이드 앱에서 인기 있는 의존성 주입 프레임워크 중 하나이지만, Dagger의 설정 및 구성은 매우 복잡합니다. Hilt는 Dagger의 설정 및 구성을 단순화하여 Dagger를 보다 쉽게 사용할 수 있도록 합니다.

 

2. Hilt 사용법

 Hilt를 사용하려면 먼저 프로젝트에 Hilt 라이브러리를 추가해야 합니다. Gradle 파일에 다음과 같은 의존성을 추가합니다.

 

1. 먼저 hilt-android-gradle-plugin 플러그인을 프로젝트의 루트 build.gradle 파일에 추가합니다.

plugins {
  ...
  id 'com.google.dagger.hilt.android' version '2.44' apply false
}

 

2. 그런 다음, Gradle 플러그인을 적용하고 app/build.gradle 파일에 다음 종속 항목을 추가합니다.

...
plugins {
  id 'kotlin-kapt'
  id 'com.google.dagger.hilt.android'
}

android {
  ...
}

dependencies {
  implementation "com.google.dagger:hilt-android:2.44"
  kapt "com.google.dagger:hilt-compiler:2.44"
}

// Allow references to generated code
kapt {
  correctErrorTypes true
}

 

 다음으로, Hilt를 사용하고자 하는 애플리케이션 클래스에 @HiltAndroidApp 어노테이션을 추가합니다.

@HiltAndroidApp
class MyApp : Application() {
    ...
}

 이제 Hilt를 사용하여 의존성 주입을 할 준비가 끝났습니다. Hilt에서는 @Inject 어노테이션을 사용하여 필요한 의존성을 주입할 수 있습니다. 예를 들어, 다음과 같이 사용자 인증을 위한 AuthManager 클래스가 있다고 가정해봅시다.

class AuthManager @Inject constructor(private val apiService: ApiService) {
    ...
}

 위 코드에서 AuthManager 클래스는 ApiService 클래스에 의존합니다. Hilt를 사용하여 AuthManager 클래스에 ApiService 클래스를 주입하려면 다음과 같이 코드를 작성합니다.

class AuthManager @Inject constructor(private val apiService: ApiService) {
    ...
}

Hilt는 ApiService 클래스의 인스턴스를 생성하여 AuthManager 클래스의 생성자에 주입합니다.

 

3. Hilt를 사용한 모듈 설정

 Hilt에서는 @Module 어노테이션을 사용하여 모듈을 설정합니다. 모듈은 의존성 객체를 제공하는 방법을 정의합니다. 모듈은 @Module 어노테이션을 사용하여 정의되며, 해당 모듈에서 제공하는 의존성 객체를 생성하거나 제공하는 메서드를 포함합니다.

 
@Module
@InstallIn(SingletonComponent::class)
object AppModule {

    @Provides
    fun provideApiService(): ApiService {
        return Retrofit.Builder()
            .baseUrl("https://api.example.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }

}

 위 코드는 AppModule이라는 모듈을 설정하고 있습니다. 이 모듈은 SingletonComponent에 설치되며, ApiService 클래스의 인스턴스를 제공하는 provideApiService() 메서드를 포함합니다.

@Module 어노테이션은 모듈을 정의할 때 사용되며, @InstallIn 어노테이션은 해당 모듈이 설치될 컴포넌트를 지정합니다. @Provides 어노테이션은 해당 메서드가 의존성 객체를 제공한다는 것을 나타냅니다.

 위 코드에서 provideApiService() 메서드는 ApiService 클래스의 인스턴스를 생성하여 반환합니다. 이렇게 생성된 인스턴스는 Hilt에서 관리되며, 필요한 곳에서 주입됩니다.

 

 예를 들어, ApiService 클래스를 사용하는 액티비티에서 Hilt를 사용하여 의존성 주입을 구현하려면 다음과 같이 코드를 작성할 수 있습니다.

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject
    lateinit var apiService: ApiService

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // apiService 객체를 사용하여 작업 수행
    }

}

@AndroidEntryPoint 어노테이션은 해당 클래스가 Hilt로 주입할 수 있는 클래스임을 나타냅니다. apiService 필드에 @Inject 어노테이션을 사용하여 의존성 주입을 요청하면, AppModule 모듈에서 제공하는 ApiService 클래스의 인스턴스가 주입됩니다.

 

4. Hilt와 ViewModel

 안드로이드 앱에서 ViewModel은 매우 중요한 역할을 합니다. ViewModel에서는 앱의 데이터 상태를 유지하고 UI 컴포넌트와의 상호 작용을 관리합니다. Hilt는 ViewModel과 함께 사용할 수 있습니다. ViewModel에서는 @HiltViewModel 어노테이션을 사용하여 ViewModel을 정의합니다. @HiltViewModel 어노테이션을 사용하면ViewModel에 Hilt에서 제공하는 의존성 객체를 주입할 수 있습니다.

 

예를 들어, 다음과 같이 MainViewModel 클래스가 있다고 가정해봅시다.

 

위 코드에서 MainViewModel 클래스는 Repository 클래스에 의존합니다. Hilt를 사용하여 MainViewModel 클래스에 Repository 클래스를 주입하려면 다음과 같이 코드를 작성합니다.

@HiltViewModel
class MainViewModel @Inject constructor(private val repository: Repository) : ViewModel() {
    ...
}​

@HiltViewModel 어노테이션을 사용하여 ViewModel을 정의하고, @Inject 어노테이션을 사용하여 생성자에 Repository 클래스를 주입합니다.

5. 결론

이상으로, 안드로이드 앱에서 Hilt를 사용하여 의존성 주입을 구현하는 방법에 대해 알아보았습니다. Hilt를 사용하면 Dagger를 보다 쉽게 사용할 수 있으며, 코드의 가독성과 유지 보수성을 높일 수 있습니다. Hilt는 안드로이드 앱 개발을 보다 쉽고 효율적으로 만드는 데에 큰 도움이 됩니다.

 

 

예시 프로젝트입니다.

 

GitHub - KwakEuiJin/WordBook

Contribute to KwakEuiJin/WordBook development by creating an account on GitHub.

github.com

 

댓글