Hilt로 Context 사용하기 (feat. OkHttpClient cache)

2024. 8. 29. 10:17·Android

0️⃣ Context를 사용 못 해

Singleton 패턴에서는 context를 사용할 수가 없다.

  • 생명 주기 불일치
  • 단위 테스트의 어려움
  • 의존성 주입 어려움

대표적으로 이러한 이유가 있지만 그럼에도 Context가 필요한 상황은 반드시 온다.

더군다나, 나는 Hilt로 DI를 구성해놓은 코드였기 때문에 context를 불러와야할지 잘 몰랐었지만 오히려 Hilt를 사용하고 있어서 Context를 사용하기 더 쉬웠다.

@Module
@InstallIn(SingletonComponent::class)
object YoutubeApiModule {
    private const val cacheSize = 100 * 1024 * 1024 // 100 MB
    private const val YOUTUBE_BASE_URL = "https://www.googleapis.com/youtube/v3/"

    @Singleton
    @Provides
    fun provideOkHttpClient(): OkHttpClient {
        val interceptor = HttpLoggingInterceptor()
        val mCache = Cache(context.cacheDir, cacheSize.toLong()) // 여기서 context 필요!
        
        interceptor.level = HttpLoggingInterceptor.Level.BODY
        return OkHttpClient.Builder()
            .cache(mCache)
            .addInterceptor(AuthorizationInterceptor())
            .addNetworkInterceptor(interceptor)
            .build()
    }

    @Singleton
    @Provides
    fun provideRetrofit(client: OkHttpClient): Retrofit {
        return Retrofit.Builder()
            .baseUrl(YOUTUBE_BASE_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    @Singleton
    @Provides
    fun provideYoutubeApi(retrofit: Retrofit): YoutubeApi {
        return retrofit.create(YoutubeApi::class.java)
    }
}

 위 코드에서 provideOkHttpClient 함수 내에서 OkHttpClient에서 cache를 사용하고 싶었는데 object로 구성되어있어 context를 사용할 수 없었다.

 

1️⃣ @ApplicationContext context: Context

@Singleton
@Provides
fun provideOkHttpClient(@ApplicationContext context: Context): OkHttpClient {
    val interceptor = HttpLoggingInterceptor()
    val mCache = Cache(context.cacheDir, cacheSize.toLong())
    interceptor.level = HttpLoggingInterceptor.Level.BODY
    return OkHttpClient.Builder()
        .cache(mCache)
        .addInterceptor(AuthorizationInterceptor())
        .addNetworkInterceptor(interceptor)
        .build()
}

 해결 방법은 이토록 간단한데, provideOkHttpClient 함수의 파라미터로 context를 명시만 해주면 된다! 

@HiltAndroidApp
class PungsunTagoApplication : Application()

 그럼, Hilt를 세팅할 때 최상단에 만들어둔 Application에서 context를 알아서 불러와주기 때문에 파라미터로 context를 명시만 해두면 자동으로 context가 주입되어 쉽게 이용이 가능한 것이다.

 

2️⃣ OkHttp에서 cache는 왜 사용하는가?

 그렇다면 내가 OkHttp에서 cache를 굳이 사용하려고 했던 이유는 무엇일까? 변경되지 않아도 되는 데이터를 동일한 api가 화면을 이동할 때마다 매번 호출하는 현상을 없애고 싶었기 때문이다. 실제로 cache를 사용하는 경우는 아래와 같다.

  • 동일한 데이터를 반복적으로 요청하는 경우
  • 변경되지 않거나 자주 변경되지 않는 데이터를 요청하는 경우
  • 네트워크 연결이 불안정하거나 제한된 대역폭이 있는 경우
  • 서버 부하를 최소화하고자 하는 경우

 실제로 Cache를 통해 서버 부하, 네트워크의 불안정한 연결과 같은 문제점을 해결하기 위해 많이 사용한다고 한다! 좀 더 친근하게 이용해야겠다.

❗ 출처

참고 사이트1 : https://velog.io/@heetaeheo/OkHttp-Cache

 

OkHttp - Cache

Cache (캐시) OkHttp에서의 캐시란 API 호출의 응답을 로컬 저장소에 저장하여 이후 동일한 요청이 발생할 때 서버에서 데이터를 가져오지 않고 로컬 저장소에서 불러오게 하여 성능을 향상시키는

velog.io

 

저작자표시 비영리 (새창열림)

'Android' 카테고리의 다른 글

Android에서 Firebase Google Login 구현하기 (feat. 클린 아키텍처 리팩토링)  (5) 2024.09.02
Android에서 Firebase Google Login 구현하기  (0) 2024.08.31
Android에서 CustomDialog 만들기  (0) 2024.08.27
Android의 4대 구성요소 알아보기  (0) 2024.08.14
Android에서 Fragment와 TabLayout, 그리고 RecyclerView 적용하기  (0) 2024.08.05
'Android' 카테고리의 다른 글
  • Android에서 Firebase Google Login 구현하기 (feat. 클린 아키텍처 리팩토링)
  • Android에서 Firebase Google Login 구현하기
  • Android에서 CustomDialog 만들기
  • Android의 4대 구성요소 알아보기
깨비도
깨비도
그림 그리는 개발자의 인디게임 생존기 & Flutter 연구소
  • 깨비도
    KKEVi.log()
    깨비도
  • 전체
    오늘
    어제
    • 전체 (98) N
      • 인디게임 개발일지 (6) N
      • C# (1)
      • Dart (3)
      • Flutter (24)
        • 문제해결 (14)
      • Kotlin (12)
      • Android (22)
        • 문제해결 (11)
      • CS (10)
        • Network (1)
      • 알고리즘 (10)
        • 코딩테스트 (10)
      • etc (10)
        • Git (1)
        • React (1)
  • 블로그 메뉴

    • 방명록
  • 링크

    • 그림 전문 일지
  • 공지사항

  • 인기 글

  • 태그

    Android
    2D아트워크
    게임개발
    게임기획
    when
    Firebase
    플랫포머_배경
    DART
    Unity이펙트
    DartVM
    게임아트
    유니티
    인디게임개발
    MacOS
    Dear.MyMarionette
    인디게임
    네트워크
    CS
    Gemini
    플러터
    C#
    ram
    flutter
    IOS
    OS
    context
    thread
    Kotlin
    stack
    XML
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.5
깨비도
Hilt로 Context 사용하기 (feat. OkHttpClient cache)
상단으로

티스토리툴바