의존성 주입 (DI, Dependency Injection)
의존성 주입이란, 생성자 또는 메서드 등을 통해 외부로부터 생성된 객체를 전달받는 것입니다.
의존성 주입의 특징
의존성 주입을 적용함으로써 클래스 간 커플링을 낮추게 됩니다. 또한 인터페이스 기반으로 설계를 하게 되며, 유연한 소프트웨어 구조를 가질 수 있습니다. 테스트 관점에서도 매우 편리하게 테스트가 가능합니다.
Android에서 DI를 사용하는 방법? Dagger2
Dagger2는 Android core 팀에서 개발한 자바와 안드로이를 위한 DI Framework 입니다.
Dagger2의 특징
- 컴파일 타임에 그래프를 구성하기에 생성된 코드는 명확하고 디버깅이 가능함
- 리플렉션 사용하지 않고, 런타임 바이트 코드를 생성하지 않음
- 자원 공유의 단순화
- 작은 라이브러리 크기
Dagger2의 단점
- Learning Curve..., 배우기 어려움 (진입장벽이 높은 편..)
Hilt
DI를 프로젝트에 적용하기 위한 표준적인 방법을 제공하는 DI Framework. Hilt의 목표는 Dagger사용의 단순화와, 표준화된 컴포넌트 세트와 스코프로 가독성을 향상시키고, 다양한 빌드 타입에 대해 다른 바인딩을 제공합니다.
Hilt 특징
Dagger2 기반의 라이브러리로 표준화된 Dagger2 사용법을 제시합니다. 사용하기 쉬운 모듈을 제공하고, Android Studio에서 지원을 하며, AndroidX 라이브러리와 호환되도록 지원하고 있습니다.
Hilt 사용하기.
Android Dependency 추가
- 프로젝트 build.gradle 파일에 추가하기.
buildscript {
...
dependencies {
...
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.38.1'
}
}
- 어플리케이션 build.gradle 파일에 추가하기
plugins {
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
}
android {
...
}
dependencies {
implementation "com.google.dagger:hilt-android:2.38.1"
kapt "com.google.dagger:hilt-compiler:2.38.1"
}
Hilt는 자바 8 기능을 사용합니다. 프로젝트에서 자바 8을 사용 설정하려면 app/build.gradle 파일에 다음을 추가합니다.
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
Hilt의 주요 Annotation
1. @HiltAndroidApp
Hilt 코드 생성을 시작하고, 반드시 Application 클래스에 추가되어야 합니다. @HiltAndroidApp은 애플리케이션 수준 종속 항목 컨테이너 역할을 하는 애플리케이션의 기본 클래스를 비롯하여 Hilt의 코드 생성을 트리거합니다.
@HiltAndroidApp
class ExampleApplication : Application() {
override fun onCreate() {
super.onCreate()
}
}
위에서 ExampleApplication에 @HiltAndroidApp Annotation으로 Hilt 코드 생성을 시작합니다. 의존성의 주입은 super.onCreate() 에서 이뤄집니다. 즉, Bytecode 변환이 이뤄집니다.
2. @AndroidEntryPoint
이 Annotation이 추가된 안드로이드 클래스에 DI 컨테이너가 추가됩니다. 사전에 @HiltAndroidApp의 설정이 선행되어야 합니다. 이러한 구성요소는 구성요소 계층 구조에 설명된 대로 각 상위 클래스에서 종속 항목을 받을 수 있습니다.
@AndroidEntryPoint가 지원하는 클래스는 다음과 같습니다.
- Activity
- Fragment
- View
- Service
- BroadcastReceiver
3. @Installin
4. @Entry
'Android > Component' 카테고리의 다른 글
Application Foreground/Backgroud 상태 확인하기 (0) | 2022.06.13 |
---|---|
[Android/Unity] Failed to install the following Android SDK packages as some licences have not been accepted. (0) | 2022.05.07 |
[Android/Unity] 터미널 환경에서 빌드하기 (Ubuntu) (2) | 2022.05.05 |
[Android/Unity] TargetSDK version 31 이상에서 Manifest merger failed 문제 (0) | 2022.05.04 |
[Android] Service #1 - 개요 (0) | 2022.04.21 |