🤖 Compose

[Compose] 의존성 주입 (Dependency Injection) (ft.hilt) - 1

콩드로이드 2025. 2. 11. 19:48

우선, 라이브러리 적용이 필요합니다 (dagger, hilt)

[versions]
//...
daggerVersion = "2.48"
hiltVersion = "1.2.0"
retrofitVersion = "2.9.0"
gsonVersion = "2.10.1"


[libraries]
//...
dagger-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "daggerVersion" }
hilt-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "hiltVersion" }
androidx-gson = { group = "com.google.code.gson", name = "gson", version.ref = "gsonVersion" }
androidx-retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofitVersion" }
androidx-gson-converter = { group = "com.squareup.retrofit2", name = "converter-gson", version.ref = "retrofitVersion" }
hilt-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "daggerVersion" }

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt" }
hilt-android = { id = "com.google.dagger.hilt.android"}

 

build.gradle 

 

 

의존성주입을 통해 network를 설정하고 github api를 사용해봅시다 

1. hilt에서 제일 처음해줘야 할 Application을 설정합니다 

Manifest에 application을 생성한 클래스의 name으로 변경해줘야합니다 

@HiltAndroidApp
class MainApplication: Application() {

}

 

2. Module을 설정합니다

Module : 의존성 주입을 하고 있는 provider가 있는 곳 즉, Hilt는 모듈을 통해 "이 클래스에 필요한 것은 이거야!"라고 알게 되고, 자동으로 필요한 객체를 주입

 

@InstallIn(SingletonComponent::class)
@Module
class MainModule {
    @Singleton
    @Provides
    @Named("API_URI")
    fun provideApiUri(): String  = "https://api.github.com/"
    //provide명은 전혀 중요하지 않다, 같은 타입이 여러개 있을 수 있으니 @Named 셋팅

    @Singleton
    @Provides
    fun provideGson(): Gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()

    //gson, retrofit match
    @Singleton
    @Provides
    fun provideConverterFactory(): Converter.Factory = GsonConverterFactory.create()

    @Singleton
    @Provides
    fun provideRetrofit(@Named("API_URI") apiUri: String, converterFactory: Converter.Factory): Retrofit = 
        Retrofit.Builder().baseUrl(apiUri).addConverterFactory(converterFactory).build()
    
    @Singleton
    @Provides
    fun provideGithubService(retrofit: Retrofit): GithubService = 
        retrofit.create(GithubService::class.java)

}

 

3. viewModel을 생성합니다

@HiltViewModel
class MainViewModel @Inject constructor(
    private val apiService: GithubService
): ViewModel() {

    val repositorys = mutableStateListOf<Repository>()

    fun getRepository() {
        repositorys.clear()
        viewModelScope.launch {
            repositorys.addAll(apiService.getUsersRepos("eunie9498"))
        }
    }
}

 

'🤖 Compose' 카테고리의 다른 글

[Compose] 안정성 stability  (0) 2025.02.09
[Compose] Rendering  (0) 2025.01.31
[Compose] Compose의 LifeCycle  (0) 2025.01.27
[Compose] 단방향 데이터 흐름  (0) 2025.01.23
[Compose] Navigation  (0) 2025.01.22