의존성 주입은 Android Studio 개발 환경에서 가장 주목받고 있는 디자인 패턴중 하나인데 각종 컴포넌트간 의존성이 강한 Android FrameWork의 의존성을 낮춰다는 것은 엄청난 효과와 의미를 부여하기 때문에 자주 사용됩니다.
class Car{
private val engine = Engine()
fun start(){
engine.start()
}
}
fun main(args: Array){
val car = Car()
car.start()
}
다음 코드를 보면 Car 클래스안에 Engine을 구성하고 있습니다. 그러므로
Car와 Engine은 긴밀하게 연결되어 있고 이로 인해 테스트 및 테스트 더블을 사용하여 수정을 할 수 없게 된다.
class Car(private val engine: Engine){
fun start(){
engine.start()
}
}
fun main(args: Array){
val engine = Engine()
val car = Car(engine)
car.start()
}
다음은 외부에서 Engin객체를 생성하고 이를 사용하여 Car생성자 매게변수로 Engine() 겍체를 전달합니다 구성합니다. 이 방법이 DI 접근이랑 같은데 이로 생기는 장점은
안드로이드에서 사용하는 Activty ,Fragment ,Service같은 경우는 Android프레임워크가 직접 인스턴스화 하기 때문에 사용자가 직접적으로 전달할 방법이 없습니다. 그래서 안드로이드에서 Dagger2(단검) 라이브러리를 개발하였습니다.
리플렉션 : 클래스, 인터페이스, 메소드들을 찾을 수 있고, 객체를 생성하거나 변수를 변경할 수 있고 메소드를 호출할 수도 있습니다. Reflection은 자바에서 기본적으로 제공하는 API
이로써 날카로운 Dagger2의 단점을 보안하기 위해 Hilt(자루)가 생겨 났다.
Dagger-Hilt == 단검 + 자루
build.gradle(Project: 프로젝트명)
buildscript {
dependencies {
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
}
}
build.gradle(Modlue: 프로젝트명)
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
dependencies {
implementation "com.google.dagger:hilt-android:2.28-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
}
@HlitAndroidApp
class AppName : Application()
<application
android:allowBackup="true"
android:name=".AppName"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MVVMTodoApp">
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
// @InstallIn : Hilt가 생성하는 DI 컨테이너에 어떤 모듈을 사용할지 가리킨다.
@Provides
@Singleton
fun provideTodoRepository(db: TodoDatabase): TodoRepository{
return TodoRepositoryImpl(db.dao)
}
}
@Singleton 어노테이션을 사용하는 이유는
Repository 인스터스를 생성할 때 같은 주소를 가르키도록 설정하여 중복생성을 막기 위함입니다.
해당 파일에 알맞는 컴포넌트를 추가하며 화살표 방향 기준으로 하위 컴포넌트는 상위 컴포넌트에 접근 할 수 있습니다.
Hlit는 클라이언트의 보일러 플레이트코드 및 안드로이드가 가지고있는 생명주기를 관리할수 있었고
추가로 알아야할 Hilt 개념
왜 쓰는지 더 자세히 알고 싶다면
머리가 복잡하고 어지럽다면 잘 따라오고 있는것이다.
📢 깃허브 자료
TodoApp => Hilt + Compose + Room + MVVM
참조문서