의존성 주입
https://www.youtube.com/watch?v=gkUCs6YWzEY
https://developer.android.com/training/dependency-injection/hilt-android?hl=ko
https://developer.android.com/codelabs/android-hilt?hl=ko#0
의존성 주입이란?
생성자 또는 메서드 등을 통해 외부로부터 생성된 객체를 전달 받는 것
특징
- 인터페이스를 사용하여 클래스간 결합도를 느슨하게 함.
- Stub 또는 Mock 객체를 사용하여 단위테스트 하기가 더욱 쉬워짐
Dagger2 자바와 안드로이드를 위한 빠른 의존성 주입 프레임워크
- 컴파일 타임시 의존성주입에 관련된 소스를 생성
- 자원 공유의 단순화
- 작은 라이브러리 크기
- 74퍼센트가 대거를 사용 함.
단점
- 배우기 어렵고, 프로젝트 설정이 어렵다.
- 간단한 프로그램을 만들때는 번거롭다.
의존성 주입 프레임워크의 궁극적인 목표
- 정확한 사용방법을 제안
- 쉬운 설정 방법 ( Koin 라이브러리가 설정이 쉬움 )
- 중요한 것들에 집중할 수 있도록 함
————————————————————————————————
Hilt 는 애플리케이션에서 Di 사용하는 표준적인 방법을 제공
Hilt 특징
- Dagger2 기반
- 표준화된 Dagger2 사용법 제시
- 보일러플레이트 코드 간소화
- 프로젝트 설정 간소화
- 개선된 테스트 환경
- AndroidX 라이브러리의 호환
Hilt는 개발자가 직접 작성해야하는 ServiceLocator와 같은 코드를 자동으로 생성하여
Android 앱에 보일러플레이트 코드를 제거한다.
어노테이션
@Inject
- 의존성 주입을 받겠다는 것을 의미 ( 인스턴스를 제공 )
- 인스턴스를 제공하는 방법을 알려주는 것을 바인딩(binding)
- @Inject를 이용하면 인스턴스들을 주입할 수 있다.
- @Inject 어노테이션이 붙은 필드들에 인스턴스가 주입된다.
@HiltAndroidApp - Hilt의 코드 생성을 트리거합니다. ( 모든 의존성 주입의 시작점 )
- @HiltAndroidApp은 앱이 의존성 주입을 가능하도록 Hilt가 코드를 생성하게 하는 트리거이다.
- 이 어노테이션이 붙은 클래스를 어플리케이션 컨테이너(Application container)라고 한다.
( @HiltAndroidApp의 설정후 사용가능 )
( Acitivity , Fragmanet , View, Service, BroadcastReceiver 만 지원 )
Hilt 모듈에 인터페이스와 같이 생성자로 인스턴스를 생성할 수 없는 바인딩 유형을 Hilt 모듈에 추가한다.
Hilt 모듈은 @Module과 @InstallIn 어노테이션이 추가된 모듈이다.
@Module은 Hilt가 모듈임을 알려주고
@InstallIn은 어떤 컨테이너에서 Hilt를 이용해 어떤 안드로이드 컴포넌트와 바인딩을 할 수 있는지 Hilt에 알려준다.
@InstallIn
- 해당모듈이 어떤 컴포넌트에 설치될것인지 명시,
- ( @Module 클래스에 @InstallIn 이 없으면 컴파일 에러 )
- Hilt 모듈은 @Module과 @InstallIn 어노테이션이 추가된 모듈이다.
- @Module은 Hilt가 모듈임을 알려주고 @InstallIn은 어떤 컨테이너에서 Hilt를 이용해
어떤 안드로이드 컴포넌트와 바인딩을 할 수 있는지 Hilt에 알려준다.
@Provides 로 인스턴스 제공
- 인터페이스 타입에 대한 인스턴스 제공은 @Provide 어노테이션을 달아
Hilt에 생성자가 삽입될 수 없는 타입이란걸 알려줄 수 있다.
- @Provides 어노테이션이 있는 함수의 구현은 Hilt에서 이 타입의 인스턴스를 제공해야할 때마다 실행된다.
@EntryPoint
- Hilt가 지원하지 않는 클래스에서 의존성이 필요한 경우 사용
( 예 -ContentProvider, DFM, Dagger를 사용하지 않는 서드파티 라이브러리)
- 인터페이스에서만 사용, @InstallIn 이 반드시 함께 있어야함,
EntryPoints 클래스의 정적 메서드를 통해 그래프에 접근
@AndroidEntryPoint
- @AndroidEntryPoint를사용하면Android Lifecycle을따르는의존성컨테이너를생성한다.
-@AndroidEntryPoint를 사용하면 Hilt는 Activity / Fragment의 수명 주기에 연결된
종속 컨테이너(Dependency container)를 생성하고 해당 클래스 ( Activity / Fragment ) 에 인스턴스들을 주입한다.
다른 컴포넌트를 참고 할수 있도록 스코프를 부여
( 동일 인스턴스 공유, 자원공유 )
컨테이너
컨테이너는 참조가 필요한 클래스의 인스턴스들을 생성해주고 수명주기를 관리해 인스턴스를 제공하는 역할을 한다.
이를 종속 클래스의 그래프(the graph of dependencies)를 관리한다고 한다.
컨테이너는 인스턴스를 가져올 수 있는 메소드를 노출한다.
이 메소드는 항상 다른 인스턴스 또는 동일한 인스턴스를 반환할 수 있다.
추가
'Android 공부 > DI ( 의존성 주입 )' 카테고리의 다른 글
DI ) Dagger2의 5가지 필수 개념 (0) | 2022.04.26 |
---|---|
DI ) Dagger2 란? (0) | 2022.04.25 |
[Android] DI Framework (Dagger2, Koin, Hilt) (0) | 2022.04.18 |
[Android] DI ?? (0) | 2022.04.18 |