hilt는 안드로이드에서 dependency injection을 통해 의존성 관리를 할 수 있도록 도와주는 프레임워크다.
이전 회사 프로젝트에서 한번 다뤄본 적이 있지만, 다시금 공부하면서 원리와 기존의 보일러플레이트 코드 대체 방식에 대해 정리해본다.

Hilt는 **KSP(Kotlin Symbol Processing)**를 사용해서 빌드할 때 코드를 자동으로 만들어준다.
hiltviewmodel을 예시로 한 단계별 동작 과정:
1단계: 어노테이션 스캔 (컴파일 타임)
@HiltViewModel
class MovieListViewModel @Inject constructor(
private val repository: MovieRepository
) : ViewModel()
@Singleton
class MovieRepository @Inject constructor()
2단계: Hilt가 자동으로 생성하는 코드 (빌드 시)
// app/build/generated/ksp/debug/kotlin/ 에 생성됨
// 1. MovieListViewModel을 위한 Factory
class MovieListViewModel_Factory @Inject constructor(
private val repositoryProvider: Provider<MovieRepository>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val repository = repositoryProvider.get() // Repository 가져오기
return MovieListViewModel(repository) as T // ViewModel 생성
}
}
// 2. MovieRepository를 위한 Factory
class MovieRepository_Factory @Inject constructor() {
fun get(): MovieRepository {
return MovieRepository() // Repository 생성
}
}
// 3. Hilt Component (의존성 그래프)
@Component
interface ApplicationComponent {
fun movieRepositoryFactory(): MovieRepository_Factory
fun movieListViewModelFactory(): MovieListViewModel_Factory
}
3단계: 런타임에 사용
// Composable에서 hiltViewModel() 호출하면:
@Composable
fun MovieListScreen(
viewModel: MovieListViewModel = hiltViewModel() // ← 여기!
) {
// hiltViewModel() 내부 동작:
// 1. Hilt Component에서 MovieListViewModel_Factory 가져오기
// 2. Factory가 MovieRepository_Factory에서 Repository 생성
// 3. Repository를 MovieListViewModel 생성자에 주입
// 4. ViewModel 반환
}
| 구분 | viewModel() | hiltViewModel() |
| 생성 방식 | 빈 생성자만 가능 | 파라미터 있어도 가능 |
| 의존성 주입 | 불가능 | 자동 주입 |
| 테스트 | Mock 주입 어려움 | Mock 주입 쉬움 |
| 사용 조건 | 없음 | @HiltViewModel annotation 필요 |
Hilt의 핵심 어노테이션 역할
@HiltAndroidApp
class MovieApplication : Application()
- 역할: "앱 전체의 DI 시작점이야!"
- 생성: ApplicationComponent (의존성 그래프의 루트)
- 생명주기: 앱이 살아있는 동안
@AndroidEntryPoint
class MainActivity : ComponentActivity()
- 역할: "이 Activity에서 Hilt 사용할 거야!"
- 생성: Activity용 하위 Component
- 효과: 이 Activity/Fragment에서 @Inject나 hiltViewModel() 사용 가능
@HiltViewModel
class MovieListViewModel @Inject constructor(...)
- 역할: "이건 Hilt가 관리하는 ViewModel이야!"
- 생성: ViewModel용 Factory 자동 생성
- 효과: hiltViewModel()로 인스턴스 생성 가능
@Inject
class MovieRepository @Inject constructor()
- 역할: "이 생성자로 인스턴스 만들어줘!"
- 효과: Hilt가 자동으로 Factory 생성
@Singleton
class MovieRepository @Inject constructor()
- 역할: "앱에서 하나만 만들어!"
- 효과: 같은 인스턴스를 재사용 (메모리 절약)
| 개념 | 설명 |
| Boilerplate | 반복적으로 작성해야 하는 지루한 코드 |
| Hilt의 role | Adapter/Factory 같은 연결 코드를 컴파일 타임에 자동 생성 |
| KSP | Kotlin Symbol Processing = 코드 생성 도구 |
| 결과 | @inject만 붙이면, Hilt가 알아서 Factory 만들어줌 |
'짬짬히 기술 블로그✍️ > Android' 카테고리의 다른 글
| 코코..코루틴.. (1) | 2026.03.27 |
|---|---|
| 메모리 캐시 & 디스크 캐시 deepdive (0) | 2026.03.26 |
| Fragment랑 Compose 비교하면서 공부! (0) | 2026.03.05 |
| android의 선언형 UI compose란? (0) | 2026.03.04 |