본문 바로가기
Android

Android Hilt를 이용한 의존성주입 이해하기

by kkong93 2023. 4. 16.
반응형

Hilt는 Android에서 사용되는 의존성 주입 라이브러리로, Dagger를 기반으로 만들어졌습니다. Hilt를 사용하면 의존성을 쉽게 관리할 수 있으며, 코드를 더욱 간결하게 유지할 수 있습니다. Android 클래스에 @AndroidEntryPoint로 주석을 지정하면 이 클래스에 종속된 Android 클래스에도 주석을 지정해야 합니다. 예를 들어 프래그먼트에 주석을 지정하면 이 프래그먼트를 사용하는 활동에도 주석을 지정해야 합니다.

참고: Android 클래스에 관한 Hilt 지원에는 다음과 같은 예외가 적용됩니다.
  • Hilt는 AppCompatActivity와 같은 ComponentActivity를 확장하는 활동만 지원합니다.
  • Hilt는 androidx.Fragment를 확장하는 프래그먼트만 지원합니다.
  • Hilt는 보존된 프래그먼트를 지원하지 않습니다.

buildscript {
    ...
    dependencies {
        ...
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.38.1'
    }
}
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'

dependencies {
    ...
    implementation 'com.google.dagger:hilt-android:2.38.1'
    kapt 'com.google.dagger:hilt-android-compiler:2.38.1'
}

Hilt 초기 설정

import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class MyApplication : Application() {
}

 


 

의존성 주입 - 네트워크 연결을 수행하는 repository 클래스를 만들려고 가정했을때

import kotlinx.coroutines.flow.Flow

class NetworkRepository @Inject constructor(private val apiService: ApiService) {
    fun fetchData(): Flow<Resource> {
        // 네트워크 작업 수행
    }
}

Hilt가 ApiService를 주입해줄걸 안다. @Inject 어노테이션을 사용하고 @Module 및 @Installn 어노테이션을 사용하여 Hilt 모듈을 생성합니다.

import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

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

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

의존성 사용

import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject

@HiltViewModel
class MyViewModel @Inject constructor(
    private val networkRepository: NetworkRepository
) : ViewModel() {

    fun fetchData(): Flow<Resource> = networkRepository.fetchData()
}
import androidx.activity.viewModels
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    private val viewModel by viewModels<MyViewModel>()

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

        lifecycleScope.launch {
            viewModel.fetchData().collect { resource ->
                when (resource.status) {
                    Status.SUCCESS -> {
                        // 데이터를 성공적으로 가져온 경우 처리
                    }
                    Status.ERROR -> {
                        // 에러 발생 시 처리
                    }
                    Status.LOADING -> {
                        // 로딩 중일 때 처리
                    }
                }
            }
        }
    }
}

Flow를 사용하면 비동기 작업을 처리하는 데 유용한 도구를 제공하며, 간편한 방식으로 비동기 데이터를 처리할 수 있습니다.

 


더 간단한 예제

1. MessageProvider 클래스 생성

class MessageProvider {
    fun provideMessage(): String {
        return "Hello, Hilt!"
    }
}

2. Hilt 모듈 생성

import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent

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

    @Provides
    fun provideMessageProvider(): MessageProvider {
        return MessageProvider()
    }
}

3. MainActivity에 의존성 주입

import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject
    lateinit var messageProvider: MessageProvider

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

        showMessage(messageProvider.provideMessage())
    }

    private fun showMessage(message: String) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
    }
}

Hilt를 사용하여 MainActivity에 주입했다. 의존성이 주입된 후에는 provideMessage() 메소드를 호출해 문자열을 가져올 수 있다.

 

android 공식문서 : 

https://developer.android.com/training/dependency-injection/hilt-android?hl=ko#kts

 

Hilt를 사용한 종속 항목 삽입  |  Android 개발자  |  Android Developers

Hilt를 사용한 종속 항목 삽입 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Hilt는 프로젝트에서 종속 항목 수동 삽입을 실행하는 상용구를 줄이는 Android용

developer.android.com

어렵다 ㅠㅠ 

반응형

댓글