2022. 5. 9. 15:24ㆍAndroid
이번엔 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 라이브러리 이고 구글에서 권장을 하고있다
사실 필자는 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 에 관한 정보는 굉장히 많기 때문에 본글에서는 다루지는 않겠다.
'Android' 카테고리의 다른 글
Android Kotlin Gson SerializedName NullPointerException 문제 (0) | 2022.05.20 |
---|---|
Android 12 Splash Screen 대응 (0) | 2022.05.18 |
Android Paging3 , Room , Flow 관련 백그라운드 쓰레드 (0) | 2022.05.04 |
Android 크롭 기능 없이 이미지 자르기 (0) | 2020.06.29 |
Android 이미지 해상도별 자동 비율 구하기 (0) | 2020.06.29 |