반응형
- Hilt를 기반으로 Network Module을 만들고, Retrofit provide 함수를 생성했을 때, 다음과 같이 baseUrl을 고정해 놓았었다.
@Singleton
@Provides
fun provideRetrofit(
okHttpClient: OkHttpClient
): Retrofit {
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(ServerStatus.API_URL_PRFIX)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
- 하지만 가끔 다른 Base URL을 요구하는 api를 사용해야 하는 경우도 있다.
- 이럴 때에는 @Named 어노테이션을 사용하면 된다. 같은 타입이라도 서로 다른 용도의 객체를 주입할 수 있게 해주는 식별자다.
@Provides
@Named("SubUrl")
fun provideSubUrl(): String = ServerStatus.SUB_URL_PRFIX
@Provides
@Named("BaseUrl")
fun provideBaseUrl(): String = ServerStatus.API_URL_PRFIX
- 이에 따라 기존 retrofit provide 함수도 분리하고 @Named를 기반으로 파라미터를 지정해 준다.
@Provides
@Singleton
@Named("baseRetrofit")
fun provideBaseRetrofit(
okHttpClient: OkHttpClient,
@Named("BaseUrl") baseUrl: String
): Retrofit = RetrofitFactory.createRetrofit(baseUrl, okHttpClient)
@Provides
@Singleton
@Named("subRetrofit")
fun provideSubRetrofit(
okHttpClient: OkHttpClient,
@Named("SubUrl") subUrl: String
): Retrofit = RetrofitFactory.createRetrofit(subUrl, okHttpClient)
@Provides
@Singleton
@Named("baseApi")
fun provideBaseApiService(@Named("baseRetrofit") retrofit: Retrofit): ApiService =
retrofit.create(ApiService::class.java)
@Provides
@Singleton
@Named("subApi")
fun provideSubApiService(@Named("subRetrofit") retrofit: Retrofit): ApiService =
retrofit.create(ApiService::class.java)
- 함수를 나누면서 발생하는 중복 코드는 object Factory 코드로 정리했다.
object RetrofitFactory {
fun createRetrofit(baseUrl: String, okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
}
- 이런 식의 정리 말고 다른 형태도 있다면 고견 부탁드립니다.
- 정리된 @Named를 기반으로 apiService 주입받을 시에 앞에 지정해 주면 된다.
class TestRepository @Inject constructor(
@Named("baseApi") private val apiService: ApiService
) { ... }
반응형