10월 2주차에는 코틀린 위클리와 안드로이드 위클리 양쪽다 나온 koin에 대한 글과 종속성 주입에 대한 글의 내용입니다.
https://blog.cloud-inject.io/koin-for-jetpack-compose-
https://dladukedev.com/articles/014_dependency_injection_vs_service_location/
소개
이번에 코인 3.5가 출시되고 Koin for Jetpack Compose는 버전 1.5.0가 출시되었습니다.
이번 1.5.0 버전에서는 모듈성과 캡슐화를 강조하는 새로운 기능들을 도입했습니다.
이 글에서는 Koin과 Hilt, 두 가지 주요 의존성 주입 도구의 장단점을 비교하고, 어떤 상황에서 각각이 더 적합한지 살펴보겠습니다.
내용
의존성 주입 (Dependency Injection): Hilt
장점
- 안정성: 컴파일 시간에 의존성 오류를 감지하여 런타임 충돌을 방지합니다.
- 관리 용이성: 대규모 프로젝트에서 복잡한 의존성을 효과적으로 관리할 수 있습니다.
단점
- 설정 복잡성: 초기 설정과 구성이 복잡하며, Dagger에 대한 이해가 필요합니다.
- 학습 곡선: 비교적 높은 학습 곡선이 있어, 초보자에게는 다소 어려울 수 있습니다.
// 의존성을 제공하는 모듈
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Singleton
@Provides
fun provideHttpClient(): HttpClient {
return HttpClient()
}
}
// 의존성을 주입받는 클래스
class UserRepository @Inject constructor(private val httpClient: HttpClient) {
fun getUserData(): UserData {
// ...
}
}
서비스 위치 (Service Location): Koin
장점
- 간편한 설정: 설정이 간단하고 쉬운 사용법으로 빠른 프로젝트 통합이 가능합니다.
- 학습 용이성: Kotlin 초보자에게도 친숙하고 학습 곡선이 낮습니다.
단점
- 런타임 해상도: 런타임에 의존성을 해결하기 때문에, 컴파일 시간에 오류를 감지하지 못합니다.
- 성능 제약: 대규모 프로젝트나 복잡한 의존성 구조에서 성능 및 관리 측면에서 제약이 있을 수 있습니다.
// 의존성을 제공하는 모듈
val appModule = module {
single { HttpClient() }
single { UserRepository(get()) }
}
// 의존성을 요청하는 클래스
class UserRepository(private val httpClient: HttpClient) {
fun getUserData(): UserData {
// ...
}
}
// Koin 시작
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@MyApplication)
modules(appModule)
}
}
}
상황별 적합성
- Hilt: 복잡하고 대규모의 프로젝트, 높은 안정성과 엄격한 의존성 관리가 필요한 경우에 적합합니다.
- Koin: 작거나 중간 규모의 프로젝트, 빠른 개발과 간편한 설정을 선호하는 경우에 적합합니다.
정리
- 글의 의견: 서비스 위치의 간단함과 쉬운 설정은 컴파일 시간의 안전성을 제공하는 의존성 주입에 비해 장기적으로 이득이 되지 않는다고 합니다. 의존성 주입, 특히 Hilt는 더 안정적이고 효율적인 개발 프로세스를 제공하며, 런타임 충돌을 방지할 수 있습니다. 반면, Koin은 더 가볍고 쉽게 접근할 수 있지만, 런타임에서의 안전성 측면에서는 Hilt에 비해 뒤처질 수 있습니다.
- 나의 의견 : 코딩할때 가끔 내코드에 내가 흐름을 놓칠때가 있는데 hilt의 경우 종속관계표시가 나와 뿌리를 찾아가기가 쉬운 반면에 koin의 경우 매번 .get() 하면 어지러워 진다....
'Kotlin Weekly' 카테고리의 다른 글
Kotlin Weekly # -377 "Kotlin 제네릭 변성" (0) | 2023.12.11 |
---|---|
Kotlin Weekly # -376 "Kotlin Flow의 데이터 자동 갱신" (0) | 2023.12.08 |
Kotlin Weekly # -374 "얕은 복사 vs 깊은 복사" (0) | 2023.12.04 |
Kotlin Weekly # -373 "Compose Settings library" (0) | 2023.09.25 |
Kotlin Weekly # -372 "코틀린 컴파일러 - K2" (0) | 2023.09.19 |