ViewModel 에서 context를 사용하는 것은 안티패턴이다.
ViewModel 은 프래그먼트와 독립적인 생명주기를 가지고 있고 이로 인해 뷰모델 고유의 생명 주기 안에서 데이터를 다룰 수 있다. 프래그먼트와의 의존성을 갖지 않는다는 것이 뷰모델의 장점인데, 프래그먼트로부터 context 를 끌어다 쓰게 되면 이러한 장점이 사라지기 때문이다.
context가 필요하다면 Repository 에서 context를 Hilt 모듈을 사용해 @ApplicationContext로 주입받아 사용하는 게 바람직하다.
다음은 SharedPreference를 사용하기 위해 Hilt 모듈을 사용하고, 레포지토리에서 주입받아 사용하는 예다.
@Module
@InstallIn(SingletonComponent::class)
class SharedPreferencesModule {
@Singleton
@Provides
fun provideSharedPreference(@ApplicationContext context: Context): SharedPreferences {
return context.getSharedPreferences("preferences_name", Context.MODE_PRIVATE)
}
}
class NetworkRepository @Inject constructor(
private val sharedPreferences: SharedPreferences
) { //..
SharedPreference 뿐만 아니라 context가 필요한 어떠한 클래스도 위처럼 작업할 수 있다.