| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
- Android WebView
- Kotlin
- Android Jetpack
- 영어공부
- Android 12 대응
- 66챌린지
- 알고리즘 자바
- Android ViewPager2
- WebView
- DataBinding
- android recyclerview
- Kotlin FCM
- scope function
- 안드로이드
- Android 12
- Android Navigation
- 영어독립365
- MVP Architecture
- 프로그래머스 알고리즘
- 카카오 알고리즘
- 안드로이드 갤러리 접근
- 안드로이드 카카오 로그인
- Java
- Android Interceptor
- OkHttp Interceptor
- Android
- 습관만들기
- coroutine
- Android ProgressBar
- 코틀린 코루틴
- Today
- Total
나미래 Android 개발자
[Android DI] Hilt 컴포넌트 계층 구조 이해하기 본문
Android 개발을 위한 Hilt 컴포넌트 이해
Dagger에서는 개발자가 직접 Component를 정의해야 하지만, Hilt는 Android 생명주기에 대응되는 표준 컴포넌트를 자동으로 생성한다. 즉, 개발자는 @AndroidEntryPoint와 같은 어노테이션을 마킹하면 되고 Hilt 컴포넌트 자체를 직접 정의하거나 인스턴스화 할 필요가 없다.
Hilt 컴포넌트 계층 구조
Hilt의 컴포넌트는 Android 구조처럼 계층을 가진다. 이미지에서 볼 수 있는 각 컴포넌트 위에 있는 어노테이션은 스코프 어노테이션으로 해당 컴포넌트 생명주기에 대한 의존성을 지정할 때 사용한다.
화살표는 상위 컴포넌트를 가르키고 있는데, 하위 컴포넌트는 상위 컴포넌트의 바인딩에 접근할 수 있다. 하지만 반대의 경우로 상위 컴포넌트는 하위 컴포넌트의 바인딩에 접근할 수 없다.
예를 들어 FragmentComponent에서는 ActivityComponent 바인딩에 접근하는 것은 가능하지만 ActivityComponent에서 FragmentComponent 바인딩에 접근하는 것은 불가능하다.
이는 DI 그래프의 일관성과 안정성을 보장하기 위해 Hilt가 가지는 핵심 특성이다.
구체적인 예시: 상위 바인딩 접근 가능 vs 불가능
상위 바인딩 접근 가능 예시
다음 예시는 이해를 돕기 위해 Repository를 Activity 범위에 바인딩하는 경우를 가정한다.
/** ActivityComponent에 바인딩한 Repository */
@Moudle
@InstallIn(ActivityComponent::class)
interface RepositoryModule {
@Binds
fun bindUserRepository(
impl: UserRepositoryImpl
): UserRepository
}
/** ActivityComponent에 바인당한 Repository는 Fragment에서 사용 가능 */
@AndroidEntryPoint
class ProfileFragment: Fragment() {
@Inject lateinit var repository: UserRepository
}
FragmentComponent는 ActivityComponent의 하위이므로 ActivityComponent의 바인딩(UserRepository)을 사용할 수 있다.
하위 바인딩 접근 불가 예시
반대로 Activity에서 Fragment 전용 바인딩에 접근이 불가하다.
@Module
@InstallIn(FragmentComponent::class)
object FragmentOnlyModule {
@Provides
fun provideFragmentHelper(): FragmentHelper = FragmentHelper()
}
@AndroidEntryPoint
class MainActivity: AppCompatActivity() {
@Inject lateinit var fragmentHelper: FragmentHelper
}
위와 같이 ActivityComponent의 하위 컴포넌트인 FragmentComponent의 바인딩에 접근하는 경우 컴파일 타임에 에러가 발생한다.
정리
Hilt 컴포넌트 계층 구조를 정리하면 다음과 같다.
- 하위 컴포넌트는 상위 컴포넌트 바인딩에 접근할 수 있다.
- 상위 컴포넌트는 하위 컴포넌트 바인딩에 접근할 수 없다
이 구조 덕분에 DI 그래프의 안정성이 높아지고, 컴파일 타임에 의존성 오류를 미리 잡을 수 있다.
'안드로이드 > DI' 카테고리의 다른 글
| [Android DI] Hilt는 내부적으로 어떻게 동작할까? (0) | 2025.11.15 |
|---|
