Koin, Dagger-Hilt 비교 정리

Jini.Dev·2022년 6월 8일
1

안드로이드 Dependency Injection(DI) framework인 Koin과 Hilt 각각의 특징및 장단점 정리

DI(의존성 주입)란?
   하나의 객체에 다른 객체의 의존성을 제공하는 기술.
   '의존 관계'에 있는 클래스들을 '주입'한다는 뜻
의존성 주입의 특징?
   클래스간 결합도를 느슨하게 만든다
   인터페이스 기반으로 설계되며, 코드를 유연하게 변경 가능하도록 한다
   Stub 또는 Mock 객체를 사용하여 단위 테스트를 하기가 더욱 쉬워진다

Koin

Koin 특징

  • Kotlin DSL(Domain Specific Language) 사용
  • 런타임에서 의존성 주입
  • AAC ViewModel 사용시 별도 라이브러리를 통해 의존성 주입 가능 (_ by viewModel())
  • Annotation Processing으로 빌드타임에 stub파일을 생성하지 않음
    [Annotation Processing?]
    컴파일 단계에서 어노테이션을 분석하고 처리하기위해 자바 컴파일러에 삽입된 훅(hook, 이미 작성된 코드의 특정지점을 가로채 동작방식을 변화_대상 코드의 소스를 수정하지 않고 원하는 동작을 구현)

Koin 장점

  • 러닝커브가 낮아 빠르게 적용 가능
  • kotlin개발환경에 도입 쉬움
  • 별도 어노테이션을 사용하지 않아 컴파일 시간 단축
  • AAC ViewModel 사용시 별도 라이브러리를 통해 의존성 주입 가능

Koin단점

  • 런타임에 서비스 로케이팅을 통해 인스턴스를 동적으로 주입해주기 떄문에 런타임 퍼포먼스가 떨어질 수 있음.
    [Service locater 패턴?]
    중앙 등록자 ‘Service Locator’를 통해 요청이 들어왔을 때 특정 인스턴스 반환
  • 모듈간 의존성에 대해 신경을 쓰지 않고 인스턴스를 사용하는 경우(ex_koin.get()), 추후 멀티모듈로 도입 시 어려움을 겪을 수 있다.
    koin.get()을 사용하는 경우 해당 인스턴스가 언제 생성되었는지 파악하기 어려움, 어디서 어떻게 주입되는지 몰라 인스턴스 주입이 필요한 클래스가 많아지면 런타임시 객체 주입에 대한 검증이 어려워짐 -> 각 사용처에 적합한 Koin모듈을 생성해 주입함으로써 어디서 어디로 주입되었는지 유추가능
  • 리플렉션을 이용하기 때문에 성능 상 좋지않다.
    [리플렉션?]
    리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API입니다.
    💡 컴파일 타임이 아닌 런타임에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법입니다.
  • 컴파일타임에는 에러가 발생하지 않음, 런타임에 에러발생

Hilt

Hilt 특징

  • 컴파일 타임에 주입에 대한 검증을 마치고, 어플리케이션 시작 시 주입 시점 단 한번에 반영되는 형태
  • Dagger와 마찬가지로 KAPT(Kotlin Annotation Processing Tool)를 통해 Java Stub 파일을 생성하여 주입을 위해 DI Container, 클래스 생성을 위한 보일러플레이트 코드를 생성(보일러플레이트 코드 감소)
  • Dagger2 기반의 라이브러리로 표준화된 Dagger2 사용법을 제시
  • Android X 라이브러리와 함께 사용할 수 있도록 별도의 라이브러리 제공 (현재는 ViewModel, WorkManager 컴포넌트와 함께 사용가능)

Hilt 장점

  • 보일러플레이트 감소

  • 단순화된 구성으로 프로젝트 설정 간소화, 모튤 탐색과 통합이 쉬움

  • 개선된 테스트 환경

  • Koin에 비해서 Android Component별 Scope가 명확

  1. @HiltAndroidApp 을 통해 ApplicationComponent 가 먼저 생성된다
  2. @InstallIn 을 통해 ApplicationComponent 안에 DataModule 이 설치된다
  3. @AndroidEntryPoint 를 통해 ApplicationComponent 의 하위 컴포넌트인 ActivityComponent 가 생성되고, ActivityComponent 를 사용하여 MemoRepository 를 주입받는다.
    [출처 : https://nanamare.tistory.com/177]

비교

Koin : Build -> run(DI container, DI객체 생성 및 주입) 런타임시 에러 검출
Hilt : Build -> (DI container, 객체 생성 및 주입)generate ->run 컴파일타임시 에러 검출

profile
정신 차려보니 개발자가 되어있었다.

0개의 댓글