(세션 내용 정리) Koin 걷어내고 Hilt로 마이그레이션하기

jericho·2024년 5월 7일

TIL

목록 보기
58/62

[드로이드나이츠 2021] 이기정 - 안드로이드 앱에서 Koin걷어내고 Hilt로 마이그레이션하기
https://www.youtube.com/watch?v=G2gaUnFGGV0

이 세션 내용을 정리해보자.
(참고로 영상에서는 실제 예시 코드도 보여주니 필요하다면 영상 확인)

Koin에서 Hilt로 넘어간 이유?

Koin은?

  • Kotlin DSL을 사용
  • 런타임에서 의존성 주입을 해줌
  • Annotation Processing으로 빌드 시간에 Stub파일을 생성하지 않음
  • AAC ViewModel 사용 시 별도의 라이브러리를 통해 의존성 주입이 가능

Koin 장점?

  • 러닝커브가 낮아 쉽고 빠르게 DI를 적용할 수 있다
  • Kotlin 개발 환경에 도입하기 쉽다
  • 별도의 어노테이션을 사용하지 않기 때문에 컴파일 시간이 단축된다
  • ViewModel 주입을 쉽게 할 수 있는 별도의 라이브러리를 제공한다

Koin 단점?

  • 런타임 시 컴포넌트가 생성되어있지 않다면 크래시가 발생
  • 런타임에 서비스 로케이팅을 통해 인스턴스를 동적으로 주입해주기 때문에 런타임 퍼포먼스가 떨어진다
  • 리플렉션을 이용하기 때문에 성능상 좋지 않다
  • Koin.get() 함수와 같이 모듈간 의존성에 대해 신경을 쓰지 않고 인스턴스를 사용하는 경우, 추후 멀티모듈로 전향 시 어려움을 겪을 수 있다

Koin.get() 함수를 사용하는 경우 인스턴스가 생성이 되었는지 모른다. 인스턴스 주입이 필요한 클래스가 많아질수록 런타임 시 객체 주입에 대한 검증을 하기 어려워진다.

Koin.get() 함수를 제거하고, 각 사용처에 적합하게 Koin 모듈을 생성하여 모듈을 통해 주입하도록 하여, 의존성과 상관없이 객체를 가져다 쓰는 것이 아닌 주입받는 방법과 동일하게 작동하도록 개선하고자 했다.
그러나... 근본적인 해결법이 아니라고 생각이 되어 다른 DI 툴을 사용하기로 함.

Hilt로 넘어가고자 했던 결정적인 이유는, 유즈케이스나 리포지터리같은 클래스를 이용하면서 Koin에서 의존성 주입을 해줄 때 의존성 주입해주기 위한 컴포넌트가 존재하지 않아서 런타임 시 터지는 경우가 많이 발생.

Koin vs Hilt

Hilt는?

  • 프로젝트에서 DI를 실행하는 상용구를 줄이는 안드로이드용 DI 라이브러리
  • 기존 Dagger를 래핑하여 훨씬 더 쉬운 사용성을 제공
  • 대거와 비교했을 때 Annotaion, Module, Component 관계 Scope 설정을 위한 러닝커브가 높았던 문제를 해결
Hilt (Dependency Injection)Koin (Service Locator)
종속성일부 핵심 클래스에 종속성을 주입모든 클래스가 서비스 로케이터에 종속
호출 방법처음 한번만 호출 (명시적인 호출이 없음)인젝터를 직접 호출 (명시적인 호출)
의존 관계의존 관계 파악이 쉬움의존 관계 파악이 어려움

Hilt가 의존 관계 파악이 쉽다는 점은 특히 멀티 모듈 구조에서 Dependency Cycle 없이 명확하게 의존성 주입이 가능하다는 장점이 된다.

  • Hilt: Build -> (DI container, 객체 생성, 주입) generate -> run
  • Koin: Build -> run (DI container, 객체 생성, 주입)

Hilt는 빌드 시에 자바 stub 파일을 생성해주기 때문에 DI 컨테이너를 생성해주고, 이걸 통해서 객체를 어떻게 생성해서 주입할지 generate된 파일에서 결정을 해서 run을 돌게 된다.

Koin은 DSL을 통해서 빌드를 하고 run을 하기 때문에 객체 생성 및 주입을 동적으로 하고, 그래서 런타임에 주입이 된다.

Hilt를 사용하면 Koin보다 좋은 점

  • boilerplate 감소
  • configuration 단순화
  • 테스트 용이
  • No Dependency Cycle
KoinDagger2Hilt
러닝커브낮음높음낮음
JavaXOO
KotlinOOO
에러 검출 시점RuntimeCompile TimeCompile Time

Hilt로 넘어가기 위한 여정

(to be continue...)

Hilt로 마이그레이션하면서 생긴 문제들

성과 및 결론

0개의 댓글