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에서 @InjecthiltViewModel() 사용 가능

 

  @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 만들어줌

 

+ Recent posts