Hilt는 Dagger를 기반으로 한 Android용 의존성 주입(Dependency Injection) 프레임워크로 입니다.
안드로이드 애플리케이션에서 의존성 주입을 쉽게 구현할 수 있도록 도와주는 도구입니다.
의존성 주입(Dependency Injection, DI)은 소프트웨어 개발에서 객체 간의 의존성을 외부에서 주입하는 디자인 패턴입니다. 이를 통해 코드의 유연성과 테스트 용이성이 향상되며, 코드의 결합도를 낮출 수 있습니다.
class Engine {
fun start() {
println("Engine started")
}
}
class Car(private val engine: Engine) {
fun start() {
engine.start()
println("Car started")
}
}
val e = Engine()
val car = Car(e)
car.start()
위와 같이 생성자로 engine을 받아서 사용하면 됩니다.
저는 처음에는 무슨소리인지 잘 모르겠어서 "생성자나 인터페이스 같은 것을 통해 클래스간의 결합도를 낮춘다" 정도로 이해를 하고 넘어갔습니다.
큰 장점은 본인이 생각하기에 2가지가 있는 것 같습니다.
모듈성 및 재사용성: DI를 통해 코드는 모듈로 나눠질 수 있습니다. 각 모듈은 독립적으로 테스트하고 재사용할 수 있게 되어 코드 베이스를 더 쉽게 관리하고 확장할 수 있습니다.
가독성 및 유지보수성: DI는 코드의 가독성을 향상시킵니다. 의존성이 외부에서 주입되기 때문에 코드의 의도가 더 명확해지며, 이는 향후 유지보수에 큰 도움이 됩니다.
Hilt는 기존의 Dagger에서 장점을 Android에 LifeCycle에 맞게 Google이 만든 라이브러리입니다. Dagger2 보다 낮은 러닝커브 쉬운 환경설정으로 인해 Android에서 인기가 많은 것 같습니다.
프로젝트에 Hilt를 적용하는 방법은 해당 링크에서 확인해주세요.
class Engine @Inject constructor() {
fun start() {
println("Engine started")
}
}
class Car @Inject constructor(private val engine: Engine) {
fun start() {
engine.start()
println("Car started")
}
}
의존성이 있는 클래스를 생성
@HiltAndroidApp
class MyApplication : Application()
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
fun provideEngine(): Engine {
return Engine()
}
}
기본 Application에 추가를 해줘야합니다.
Application이 없는 경우 만든 후에 manifest에서 등록을 해주세요.
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var car: Car
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
car.start()
}
}
위의 코드에서 @HiltAndroidApp 어노테이션이 지정된 MyApplication 클래스는 Hilt의 초기화를 담당합니다. @AndroidEntryPoint 어노테이션이 지정된 MainActivity 클래스에서는 Car 객체를 주입받아 사용합니다.
Hilt는 Android 컴포넌트 (예: Application, Activity, Fragment)에 의존성을 주입하는 데 사용되는 @AndroidEntryPoint 어노테이션과 같은 특별한 어노테이션을 제공합니다.
Hilt에 대한 계층구조와 어노테이션에 대한 건 다음 포스팅에 이어서 올리도록 하겠습니다.