[드로이드나이츠 2021] 이기정 - 안드로이드 앱에서 Koin걷어내고 Hilt로 마이그레이션하기
https://www.youtube.com/watch?v=G2gaUnFGGV0
이 세션 내용을 정리해보자.
(참고로 영상에서는 실제 예시 코드도 보여주니 필요하다면 영상 확인)
Koin은?
Koin 장점?
Koin 단점?
Koin.get() 함수를 사용하는 경우 인스턴스가 생성이 되었는지 모른다. 인스턴스 주입이 필요한 클래스가 많아질수록 런타임 시 객체 주입에 대한 검증을 하기 어려워진다.
Koin.get() 함수를 제거하고, 각 사용처에 적합하게 Koin 모듈을 생성하여 모듈을 통해 주입하도록 하여, 의존성과 상관없이 객체를 가져다 쓰는 것이 아닌 주입받는 방법과 동일하게 작동하도록 개선하고자 했다.
그러나... 근본적인 해결법이 아니라고 생각이 되어 다른 DI 툴을 사용하기로 함.
Hilt로 넘어가고자 했던 결정적인 이유는, 유즈케이스나 리포지터리같은 클래스를 이용하면서 Koin에서 의존성 주입을 해줄 때 의존성 주입해주기 위한 컴포넌트가 존재하지 않아서 런타임 시 터지는 경우가 많이 발생.
Hilt는?
| Hilt (Dependency Injection) | Koin (Service Locator) | |
|---|---|---|
| 종속성 | 일부 핵심 클래스에 종속성을 주입 | 모든 클래스가 서비스 로케이터에 종속 |
| 호출 방법 | 처음 한번만 호출 (명시적인 호출이 없음) | 인젝터를 직접 호출 (명시적인 호출) |
| 의존 관계 | 의존 관계 파악이 쉬움 | 의존 관계 파악이 어려움 |
Hilt가 의존 관계 파악이 쉽다는 점은 특히 멀티 모듈 구조에서 Dependency Cycle 없이 명확하게 의존성 주입이 가능하다는 장점이 된다.
Hilt는 빌드 시에 자바 stub 파일을 생성해주기 때문에 DI 컨테이너를 생성해주고, 이걸 통해서 객체를 어떻게 생성해서 주입할지 generate된 파일에서 결정을 해서 run을 돌게 된다.
Koin은 DSL을 통해서 빌드를 하고 run을 하기 때문에 객체 생성 및 주입을 동적으로 하고, 그래서 런타임에 주입이 된다.
Hilt를 사용하면 Koin보다 좋은 점
| Koin | Dagger2 | Hilt | |
|---|---|---|---|
| 러닝커브 | 낮음 | 높음 | 낮음 |
| Java | X | O | O |
| Kotlin | O | O | O |
| 에러 검출 시점 | Runtime | Compile Time | Compile Time |
(to be continue...)