by viewModels()`와 `by lazy (Gemini 답변)

Philipy (윤상필)·2025년 10월 9일

Gemini:
by viewModels()by lazy { ViewModelProvider(this).get(...) } 방식은 Kotlin에서 ViewModel을 초기화하는 두 가지 일반적인 방법이며, Hilt 사용 여부에 따라 차이가 있습니다.

1. by viewModels()

  • Hilt 사용 시: by view Models()는 Hilt 라이브러리가 제공하는 위임 속성(Delegated Property)입니다. Hilt는 컴포넌트 생성 시 ViewModel에 필요한 의존성(Repository 등)을 자동으로 주입해줍니다.
  • Fragment/Activity에서 사용: Fragment나 Activity에서 ViewModel을 사용할 때, Hilt가 ViewModel의 인스턴스를 생성하고 필요한 의존성을 주입하여 제공합니다.
  • 장점: Hilt를 사용
    하면 ViewModel의 생성자에 @Inject를 붙이기만 하면 되고, Fragment/Activity에서는 by viewModels()만으로 쉽게 ViewModel을 사용할 수 있어 코드가 매우 간결해집니다.

2. `by lazy { ViewModel

Provider(this).get(...) }`

  • Hilt 미사용 시 또는 Hilt 없이 수동으로 ViewModel 관리: 이 방식은 ViewModel을 수동으로 관리할 때 사용됩니다. ViewModelProvider를 사용하여 ViewModel
    인스턴스를 얻으며, lazy 키워드를 통해 ViewModel이 처음 접근될 때만 생성되도록 합니다.
  • 의존성 주입: 이 방식에서는 ViewModel의 생성자에 필요한 의존성을 직접
    관리하거나, Hilt의 ViewModelProvider.Factory를 사용하지 않는 경우 수동으로 전달해야 합니다.
  • 단점: Hilt를 사용하지 않으면 ViewModel에 Repository 등의 의존성을 주입하는 과정
    이 번거로워질 수 있습니다.

두 방식의 차이점 요약

| 구분 | by viewModels() (Hilt 사용 시) | by lazy { ViewModelProvider(this).get(...) } (Hilt 미사용 시) |
| :--------------- | :------------------------------------------------------------ | :------------------------------------------------------------------------ |
| 의존성 주입 | Hilt에 의해 자동으로 처리 (ViewModel
생성자에 @Inject) | 수동 관리 또는 Hilt Factory 사용 (ViewModel 생성자 관리가 필요할 수 있음) |
| Hilt 의존성 | 필요 | 불필요 |
|
코드 간결성 | 높음 (Fragment/Activity 코드 간결) | 낮음 (ViewModel 초기화 및 의존성 관리가 더 복잡할 수 있음) |
| 일반적 사용
| Hilt 프로젝트에서 ViewModel 사용 시 | Hilt 미사용 프로젝트 또는 특정 상황 |

결론:

Hilt를 프로젝트에 도입했다면, ViewModel을 사용할 때는 by viewModels()
사용하는 것이 훨씬 권장됩니다.
이는 Hilt의 강력한 의존성 주입 기능을 활용하여 ViewModel 생명주기 관리와 의존성 주입을 간편하게 처리할 수 있기 때문입니다.

만약 SplashScreen 에서 by viewModels()를 사용하고 있고, LoginActivity에서 by lazy { ViewModelProvider(this).get(...) } 방식을 사용하고 있다면, LoginActivity에서도 by viewModels()를 사용하여 Hilt의
장점을 활용하는 것이 일관성 있고 효율적입니다. @AndroidEntryPoint 어노테이션이 Activity/Fragment에 붙어 있다면 by viewModels() 사용이 가능합니다.

커밋 메시지 제안

ViewModel
초기화 방식 통일

SplashScreen 및 LoginActivity에서 by viewModels() 사용

Hilt 의존성 주입 활용하여 ViewModel 초기화 간소화

profile
Tech Phase-smith, Karax wannabe

0개의 댓글