본문으로 바로가기

Repository 에서 context 사용하기

category Studies/Android 2022. 6. 12. 15:15

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가 필요한 어떠한 클래스도 위처럼 작업할 수 있다.