class Car {
private val engine = Engine() // 의존성
}
class Car(private val engine: Engine) // 의존성 주입
의존성을 클래스의 생성자를 통해 주입. 가장 일반적이며 권장되는 방식.
class Car(private val engine: Engine)
의존성을 메서드를 통해 주입. 특정 상황에서 의존성을 변경하거나 필요할 때만 주입받고 싶을 때 사용
class Car {
private lateinit var engine: Engine
fun setEngine(engine: Engine) {
this.engine = engine
}
}
의존성을 클래스의 필드(속성)에서 직접 주입
이 방식은 주로 DI프레임워크에서 지원하며, 테스트 코드나 간단한 예제에서 사용
class Car {
@Inject
lateinit var engine: Engine
}
결합도 감소
클래스가 다른 객체를 직접 생성하지 않으므로, 객체 간 결합도가 낮아짐.
이는 유지보수성과 확장성을 크게 향상.
테스트 용이성
의존성을 외부에서 주입받으므로, 테스트 시 Mock 객체를 쉽게 주입하여 다양한 상황을 시뮬레이션할 수 있음.
재사용성 향상
클래스가 특정 구현에 종속되지 않으므로, 다양한 의존성을 주입받아 재사용할 수 있음.
유연성 및 확장성 증가
새로운 기능이나 객체를 추가하더라도 기존 코드를 수정할 필요가 줄어듬
초기 학습 곡선
DI 패턴을 이해하고 적용하는 데 시간이 필요합니다.
복잡성 증가
프로젝트가 작거나 간단한 경우, DI를 도입하면 오히려 복잡해질 수 있습니다.
의존성 관리 필요
의존성을 관리하는 데 추가적인 도구나 프레임워크(Hilt, Dagger 등)가 필요할 수 있습니다.
DI를 간편하고 효율적으로 구현하기 위해 Google에서 제공하는 DI 라이브러리.
Dagger를 기반으로 만들어졌으며, DI를 더 쉽게 사용할 수 있도록 Android 환경에 최적화된 API와 통합 기능을 제공
Dagger 기반
Hilt는 Dagger 위에 구축되어 있으므로, Dagger의 강력한 성능과 안정성을 유지하면서도 사용법을 간소화.
Android에 특화된 통합 기능
Hilt는 Activity, Fragment, ViewModel 등 Android 컴포넌트와 DI를 원활하게 통합할 수 있도록 설계.
의존성 제공 관리
Hilt는 의존성을 주입하고 관리하는 데 필요한 코드를 자동으로 생성하므로, 수동으로 팩토리나 구성요소(Component)를 정의할 필요가 없음.
범위(Scope) 관리
Hilt는 Android 생명 주기에 따라 의존성의 범위를 자동으로 관리합니다. 예를 들어, @Singleton으로 정의된 의존성은 앱 전체에서 동일하게 유지.
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
@Singleton
fun provideDatabase(@ApplicationContext context: Context): AppDatabase {
return Room.databaseBuilder(
context,
AppDatabase::class.java,
"app_database"
).build()
}
}
Hilt는 다양한 애너테이션을 통해 DI를 설정
Hilt는 Android의 각 구성 요소에 DI를 지원하기 위해 사전 정의된 컴포넌트를 제공