Kotlin Weekly

Kotlin Weekly # -375 "Koin vs Hilt 의존성주입 전략 비교"

베블렌 2023. 12. 8. 02:11

10월 2주차에는 코틀린 위클리와 안드로이드 위클리 양쪽다 나온 koin에 대한 글과 종속성 주입에 대한 글의 내용입니다.

 

https://blog.cloud-inject.io/koin-for-jetpack-compose-

 

Jetpack Compose on Fire: The Latest Koin 3.5 Features

Discover the blazing updates in Koin for Jetpack Compose 1.5.0! Elevate your Kotlin development with our latest enhancements

blog.cloud-inject.io

https://dladukedev.com/articles/014_dependency_injection_vs_service_location/

 

Dependency Injection vs Service Location

Dependency Injection vs Service Location October 05, 2023 You are likely already using a form of dependency inversion to make your code more flexible, readable, and testable, but have you considered the pattern of inversion of control you are using and why

dladukedev.com

 

 

소개

이번에 코인 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() 하면 어지러워 진다.... 

 

 

 

 

http://kotlinweekly.net/

 

** Kotlin Weekly **

 

kotlinweekly.net