Android Hilt 에 대해 정리

2022. 5. 9. 15:24Android

반응형

이번엔 Hilt 에 대해 정리를 해보겠습니다.

 

(제가 사용한 경험을 바탕으로 글을 작성 하엿습니다)

 

개발을 하다보면 의존성 주입 이라는 단어를 한번쯤은 들어봤것이다.

 

저도 Android 관련 의존성 주입을 찾아보니 크게 총 3가지가 있더군요

 

Dagger  , Hilt , Koin

 

3가지의 자세한 설명은 밑에 출처로 가시면 더 자세하게 보실수있습니다.

https://velog.io/@sysout-achieve/Android-DI-Framework-%EC%84%A0%ED%83%9D%EC%A7%80Dagger2-Koin-Hilt

 

[Android] DI Framework 선택지(Dagger2, Koin, Hilt)

대세 DI Framework에 대해 고민한 내용을 공유합니다.

velog.io

 

일단 저중에서 Hilt 를 채택한 이유는

 

1.러닝 커브가 낮다.

2.국내 많은 기업들이 Dagger 에서 Hilt 로 넘어간다

3.위 2번의 내용과 관련이 있어보이지만 구글측에서 Android 위해 만들어진 DI 라이브러리 이고 구글에서 권장을 하고있다

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

 

사실 필자는 DI에 대해 들어보기만 하고 따로 공부는 하지 않았다.

 

하지만 다른 기업들의 필요 기술역량들을 보면 전에 비해 많이 DI 를 요구 하기에

 

이번 기회에 한번 배워보았다

 

각종 예제를 찾아서 직접 코드를 짜보고 설명을 읽어봐도 계속해서 "이걸 대체 왜 쓰지?" 라는 의문이 계속 됬다.

 

그러다 Jetpack 들과 함께 써보자 하는 생각으로 사용을 해보았다.

 

아직까지 Hilt 전부를 사용하지 않아 함부로 말을 하기는 힘들겠지만

 

그 결과는 놀라웠다.

 

사람마다 다르지만 필자는 솔직히 예제 보면서 간단한 클래스간에 이것저것 써놓고 설명글들을 봤을때는 이해가 가지않았다

 

하지만 Jetpack 과 같이 쓰다보니 굉장히 편해졌다

 

바로 코드로 보겠다.

 

 

기존

 

 

class MainViewModel(application: Application) : ViewModel() {
    ....
}

 

이런 ViewModel class 파일이 있다고 생각해보자

 

저기서 

 

application 을 받으려면 ViewModel -> AndroidViewModel 로 바꾸거나

 

ViewModelFactory 생성 하여 Activity 에서 선언하고 해줘야한다

 

보통 Factory 를 많이 쓰니 예시를 들어볼겠다.

 

class MainViewModelFactory (var application: Application) : ViewModelProvider.Factory {

    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
            return MainViewModel(application ) as T
        }

        throw IllegalAccessException("unknow view model class")
    }

}

 

class MainActivity : AppCompatActivity() {

    lateinit var binding : ActivityMainBinding
    
    lateinit var viewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        viewModel = ViewModelProvider(this , MainViewModelFactory(this.application))[MainViewModel::class.java]

    }
}

 

이게 단순하게 클래스파일 한두개만 있을때는 별상관이 없지만

 

현업을 뛰다보면 클래스파일들은 몇십 몇백개가 될텐데 만들때마다 일일히 하나하나 신경쓴다?

 

개발자 종특으로 귀찮아서 절대 안된다.

 

자 그럼 DI Hilt 를 적용후 보겠다.

 

build.gradle (Project)

buildscript {
   

    dependencies {
        
        classpath "com.google.dagger:hilt-android-gradle-plugin:2.40.5"
    }
}

build.gradle (Module)

plugins {

    id 'dagger.hilt.android.plugin'
}
implementation "com.google.dagger:hilt-android:2.40.5"
kapt "com.google.dagger:hilt-compiler:2.40.5"
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03'
kapt 'androidx.hilt:hilt-compiler:1.0.0'
annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0'

 

다 설정후

 

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

 

Appliaction 상속받은 클래스 파일에 @HiltAndroidApp 쓴다 (매니페스트에 appliaction 은 설정해야한다)

 

@HiltViewModel
class MainViewModel @Inject constructor(application: Application) : ViewModel() {
    ....
}

ViewModel 에 주입한다

 

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    lateinit var binding : ActivityMainBinding

    private val viewModel : MainViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

    }
}

 

이게 끝이다

 

먼가 엄청 간결해지지 않았는가?

 

DI 를 처음 보는 사람들 이것마저 "굳이?" 라는 생각이 들수도 있다 100% 이해한다

 

하지만 ViewModel 말고도 Room , Retrofit 등 이것저것 DI 와 엮어 사용해보면

 

"어? 어라?" 라는 소리가 저절로 나오게될것이다.

 

Hilt 에 관한 정보는 굉장히 많기 때문에 본글에서는 다루지는 않겠다.

 

반응형