Gemstone's Devlog

[의존성 주입] Hilt 정리 본문

Kotlin (Android)

[의존성 주입] Hilt 정리

Gemstone 2022. 4. 5. 23:57

의존성 주입 (Dependency Injection)

의존성 주입이란?

생성자 또는 메서드 등을 통해 외부로부터 생성된 객체를 전달받는 것

 

의존성 주입의 특징

- 클래스간 결합도를 느슨하게 함

- 인터페이스 기반으로 설계되며, 코드를 유연하게 한다.

- Stub 또는 Mock 객체를 사용하여 단위테스트를 하기가 더욱 쉬워진다.

 

의존성 주입이 없는 코드
의존성을 외부로부터 주입 받음

 

안드로이드에서 의존성 주입이 어려운 이유?

- Android 클래스가 Framework에 의해 인스턴스화 됨

- Factory를 API28부터 제공, 하지만 현실적이지 않음

 

Dagger2

Dagger2는 자바와 안드로이드를 위한 강력하고 빠른 의존성 주입 프레임워크

 

Dagger2의 특징

- 컴파일 타임에 그래프를 구성

- 생성된 코드는 명확하고 디버깅이 가능함

- 리플렉션 사용 X, 런타임 바이트 코드 생성 X

- 자원 공유의 단순화

- 작은 라이브러리 크기

- 상위 10000개의 안드로이드 앱 중 74%가 Dagger를 사용

 

Dagger2의 단점

- 배우기 어렵고, 프로젝트 설정이 힘들다.

- 간단한 프로그램을 만들 때는 번거롭다.

- 같은 결과에 대한 다양한 방법이 존재한다.

 

개발자 중 49%가 DI 솔루션 개선을 요청함

 

의존성 주입 프레임워크의 궁극적인 목표

- 정확한 사용방법을 제안

- 쉬운 설정 방법 (개발자들이 Dagger 대신 Koin 라이브러리를 사용하는 이유)

- 중요한 것들에 집중할 수 있도록 함

 

 

Hilt 두둥등장!

Hilt는 애플리케이션에서 DI를 사용하는 표준적인 방법을 제공한다.

 

Hilt의 목표

- Dagger 사용의 단순화

- 표준화된 컴포넌트 세트와 스코프로 설정과 가독성/이해도 쉽게 만들기

- 쉬운 방법으로 다양한 빌드 타입에 대해 다른 바인딩 제공

 

Hilt 프로젝트 설정 for Kotlin

Hilt Gradle plugin 설정

 

Hilt의 특징

- Dagger2 기반의 라이브러리

- 표준화된 Dagger2 사용법을 제시

- 보일러플레이트 코드 감소

- 프로젝트 설정 간소화

- 쉬운 모듈 탐색과 통합

- 개선된 테스트 환경

- Android Studio의 지원

- AndroidX 라이브러리의 호환

 

Quick Setup

Object graph

 

Hilt Annotation

주요 Hilt Annotation

- @HiltAndroidApp

- @AndroidEntryPoint

- @InstallIn

- @EntryPoint

 

@HiltAndroidApp 없이 컴포넌트 생성하기

@HiltAndroidApp 

 

Bytecode transformation

상속하지 않아도 된다.. 왜 그럴까?

 

Without the Gradle plugin

 

@AndroidEntryPoint

@AndroidEntryPoint : 어노테이션이 추가된 안드로이드 클래스에 DI 컨테이너를 추가,

@HiltAndroidApp의 설정 후 사용 가능

 

@AndroidEntryPoint를 지원하는 타입

- Activity

- Fragment

- View

- Service

- BroadcastReceiver

 

Hilt Component Hierarchy

 

Hilt Component 특징

- Dagger와 다르게 직접적으로 인스턴스화 할 필요가 없음

- 표준화된 컴포넌트 세트와 스코프를 제공한다.

- 컴포넌트들은 계층으로 이루어져 있으며, 

  하위 컴포넌트는 상위 컴포넌트의 의존성에 접근할 수 있다. (=Subcomponent)

 

Hilt Scope

 

Scoped Binding

Hilt Scope

 

Scoped Binding

 

Hilt Scope

 

기본 컴포넌트 바인딩

 

Hilt Module

@InstallIn : Hilt가 생성하는 DI 컨테이너에 어떤 모듈을 사용할 지 가리킨다.

 

Hilt Module의 제약사항

@Module 클래스에 @InstallIn이 없으면 컴파일 에러!

 

@EntryPoint

Hilt가 지원하지 않는 클래스에서 의존성이 필요한 경우 사용

(예 : ContentProvider, DFM, Dagger를 사용하지 않는 3rd-party 라이브러리 등)

 

특징 

- @EntryPoint는 인터페이스에서만 사용

- @InstallIn이 반드시 함께 있어야 함

- EntryPoints 클래스의 정적 메서드를 통해 그래프에 접근

 

@EntryPoint 예제 - ContentProvider

'Kotlin (Android)' 카테고리의 다른 글

GDG Android I/O Extended Korea Android 2022 참가 후기  (0) 2022.06.11
Coroutine 정리  (0) 2022.06.07
[코루틴 실습] 처음 만나는 코루틴  (0) 2022.03.30
Coroutine 정리  (0) 2022.03.28
코틀린 코테 테크닉  (0) 2022.01.21