Hilt는 프로젝트에서 종속 항목 수동 삽입을 실행하는 상용구를 줄이는 Android용 종속 항목 삽입 라이브러리이다.
종속 항목 수동 삽입을 실행하려면 모든 클래스와 종속 항목을 수동으로 구성하고 컨테이너를 사용하여 종속 항목을 재사용 및 관리해야 한다.
※ 일단 Hilt를 공부하기 위해선 DI(Dependency Injection) -> 의존성 주입에 대해 먼저 알아야한다.
DI(Dependency Injection) 란?
DI는 말 그대로 해석하면 의존성 주입이다.
의존성이라는 것은 함수에 필요한 클래스 또는 참조변수나 객처에 의존하는 것 이라고 할 수 있으며
의존성 주입 이라는것은 클래스간의 의존성을 클래스 외부에서 주입하는 것이라고 할 수 있다.
구체적으로 이야기하면 클래스에 대한 의존성을 인터페이스화를 통해 코드 유연성을 증대시키며 클래스의 인스턴스를 외부에서 생성하여 주입을 하는 것 이다.
예) A라는 클래스가 객체를 생성하기 위해 B를 필요로 하는 것 이러한 경우면 B는 A의 의존대상이 되는 것 이다.
DI(의존성 주입)를 사용하는 장점 & 이유
- unit Test가 용이하다
- 코드의 재사용성이 높아진다.
- 코드의 리펙토링이 수월하다.
- 객체 간의 의존성을 줄이거나 없앨 수 있다.
- 객체 간의 결합도를 낮추며 유연한 코드를 짤 수 있다.
클래스간의 결합이 약해진다는 것은 결국 한 클래스가 변경 될 경우, 다른 클래스가 변경될 필요성이
적어진다는 뜻 이다.
DI(의존성 주입)의 단점
- 의존성 주입을 위한 선행 작업이 필요하다.
- 코드를 추적하고 읽기가 어려워진다.
Hilt란?
Google의 Dagger를 기반으로 만든 안드로이드를 위한 DI(의존성 주입) 라이브러리이다.
아무래도 안드로이드를 위한 의존성 주입 라이브러리 이기 때문에
안드로이드 클래스에 생명주기를 고려한 의존성 주입을 할 수 있는 라이브러리이다.
Hilt의 특징
- Dagger2 기반의 라이브러리
- Dagger와 다르게 직접적으로 인스턴스화 할 필요 없음(바이트 코드 변환을 사용하기 때문이다)
- 표준화된 Dagger2 사용법을 제시
- 보일러플레이트 코드가 감소
- 프로젝트 설정 간소화
- 쉬운 모듈 탐색과 통합
- 개선된 테스트 환경
- Android Studio지원
- Android X 라이브러리의 호환
- Jetpack 라이브러리 클래스를 위해 extension 제공(ex : viewModel, Work manager)
인스턴스화 는 데이터 필드의 저장 유형 및 값과 같은 정보를 읽거나 지정하는 프로세스입니다.
보일러플레이트 코드란 여러 가지 상황에서 거의 또는 전혀 변경하지 않고 재사용 할 수 있는
컴퓨터 언어 텍스트로 모든 코드를 작성하기 위해 항상 필요한 부분을 의미하는 것이다.
비유하자면 '묻지도 따지지도 않고 따라 적는 코드', '모방', '별 수정없이 반복적으로 사용되는 코드'
즉 묻지도 따지지도말고 그냥 복사한 다음 필요 부분만 수정하면 된다는 말이다.
Dagger2란 의존성 주입을 가능하게 해주는 요소들로 만들어진 주로 정적으로 컴파일 되는
의존성 주입 프레임 워크이다.
Dagger2에 의존성 주입을 가능하게 해주는 요소
● Component
클래스의 인스턴스를 외부에서 생성하는 곳으로 이 요소들 중 가장 기본적인 요소이다.
● Module
Component에 의존성을 제공한다.
Provider에서 제공한 인스턴스들을 모아둔 클래스이다.
클래스에만 붙인다.
● Provider(Provides)
인스턴스를 제공하는 기능을 하며 @Module 클래스 안에 선언된 메소드에만 선언 할 수 있다.
Hilt의 어노테이션
※ Hilt는 어노테이션을 통해 적용 할 수 있다
@ HiltAndroidApp
Application을 상속받는 클래스에서 필드, 메서드 주입을 활성화 하는 어노테이션으로 즉 Hile 코드를 자동으로 생성하게 해준다.
Hilt를 제일 처음 사용할때 application 클래스에 적용해줘야한다.
@HiltAndroidApp을 사용한 Application을 상속받는 클래스는 매니페스트의 name 속성에
반드시 등록해야한다. -> ※ 등록하지 않을시 런타임 에러 발생 ※
@ AndroidEntryPoint
Activity,Fragment, View, Service, BroadcastReceiver 같은 Android Compent에 사용할 수 있는 어노테이션으로 멤버 인젝션을 활성화 할 때 사용된다.
이를 적용한 컴포넌트 내에서 @Inject가 달린 필드에 의존성을 주입하는 것으로 이 어노테이션을 달지 않으면 그 안에 필드나 메서드를 주입할 수 없다.
즉, @Inject 어노테이션을 쓸 수 없다
Activity는 Component를 상속받는 Activity만 지원한다. -> 대표적인 예) AppCompatAcitivity
Fragment는 androidx, Fragment를 상속받는 Fragment 클래스에만 dependency(의존성) 주입 가능
@ HiltViewModel
Hilt가 뷰모델 주입을 할 수 있또록 도와주는 어노테이션이다.
AAc viewModel과 Navigaction Graph의 SharedViewModel도 지원한다.
@ Inject
모든 클래스의 생성자, 필드, 메서드 앞에 붙어서 생성자, 필드, 메서드 주입을 가능하게 하는 어노테이션으로
Filed Injection과 ConStructor Injection 이 두가지로 나뉜다.
● Filed Injection
hile에게 의존성을 *주입 받아서* 사용하는 것
● Constructor Injection
hilt에게 의존성을 *주입 해주는 것*
※ constructor inject 할 수 있는 클래스
-> 내가 구현한 클래스
constructor inject 할 수 없는 클래스
-> 인터페이스 or abstract 구현체(@Module,@Binds 사용), 외부 라이브러리(@Module,@Provides 사용)
@ Binds
따로 구현이 필요하지 않는 경우 @Provides 대신 사용한다.
구현체(리턴값)가 되는 파라미터를 하나만 가질 수 있으며 static이 아니기에 메모리적으로 효율적이고 간결하다.
@ Provides
외부 라이브러리 클래스를 제공하는 경우(종속 객체를 반환하는 메서드를 작성 해야하는 경우) 아니면
Retrofit 또는 Room DB와 같이 빌더 패턴으로 생성되야 하는 클래스의 경우 생성자 주입이 어려울 수 있는데
이럴때 사용하는 패턴으로 구현에 필요한 파라미터를 여러개 혹은 가지지 않아도 되고 구현 로직을 짜야만 한다.
또 해당 의존성을 사용할 때 매번 호출된다.
abstract class에서는 @Provides를 사용할 수 없고, object에서는 @Binds를 사용할 수 없다고 한다.
@ Installln
@Module 이나 @EntryPoint 어노테이션과 함께 사용해야하며 어느 컴포넌트를 사용할 건지 지정해줘야한다.
예) -activity, fragment, singlton
만약 여러 인스턴스를 만들지 않고 단일인스턴스를 만들려면 Provider 함수에 @Singleton 어노테이션을 달아야한다.
MVVM에 Repository 패턴을 적용할 경우 Repository는 뷰, 뷰모델과 별도로 존재해야하고 어디서든 접근할 수 있어야 하기 때문에 @InstallIn(SingletonComponent::class) 형태로 써서 싱글턴 모듈임을 나타낸다.
@Singleton : 컴포넌트 인스턴스가 존재할 경우 해당 인스턴스가 하나뿐임을 나타내는 어노테이션
ApplicationScope(범위)를 갖는다.
@ Entry Point
Hilt가 클래스에서 즉 @AndroidEntryPoint가 커버 할 수 있는 컴포넌트외에서 의존성 주입이 필요한 경우 사용된다.
인터페이스에서만 사용된다고 하며 반드시 @Installln이 함께 있어야한다.
@ Retention
이 어노테이션이 달린 타입의 어노테이션이 유지되는 기간을 나타낸다.
@ Qualifier
javaX 주입 패키지에서 제공하는 어노테이션이다.
종속성 규정(유형은 같지만 인스턴스가 다른 객체를 구별할 때)에 사용한다.
Hilt 구성요소 전체기간
Hilt는 해당 Android 클래스의 수명 주기에 따라 생성된 구성요소 클래스의 인스턴스를 자동으로 만들고 제거합니다.
Hilt 구성요소 범위
기본적으로 Hilt의 모든 결합은 범위가 지정되지 않습니다. 즉, 앱이 결합을 요청할 때마다 Hilt는 필요한 유형의 새 인스턴스를 생성합니다.
그러나 Hilt는 결합을 특정 구성요소로 범위 지정할 수도 있습니다. Hilt는 결합의 범위가 지정된 구성요소의 인스턴스마다 한 번만 범위가 지정된 결합을 생성하며, 이 결합에 관한 모든 요청은 동일한 인스턴스를 공유합니다.
이 예에서 @ActivityScoped를 사용하여 AnalyticsAdapter의 범위를 ActivityComponent로 지정하면 Hilt는 해당 활동의 수명 주기 동안 동일한 AnalyticsAdapter 인스턴스를 제공합니다.
@ActivityScoped
public class AnalyticsAdapter {
private final AnalyticsService service;
@Inject
AnalyticsAdapter(AnalyticsService service) {
this.service = service;
}
...
}
※ 참고:
제공된 객체는 구성요소가 제거될 때까지 메모리에 남아 있기 때문에 결합의 범위를 그 구성요소로 지정하면 많은 비용이 들 수 있습니다. 따라서 애플리케이션에서 범위가 지정된 결합의 사용을 최소화하세요.
특정 범위 내에서 동일한 인스턴스를 사용해야 하는 내부 상태가 있는 결합 또는 동기화가 필요한 결합, 만드는 데 비용이 많이 들 것으로 측정된 결합에는 구성요소 범위 지정 결합을 사용하는 것이 적절합니다.
Hilt 구성요소 계층 구조
구성요소에 모듈을 설치하면 이 구성요소의 다른 결합 또는 구성요소 계층 구조에서 그 아래에 있는 하위 구성요소의 다른 결합의 종속 항목으로 설치된 모듈의 결합에 액세스할 수 있습니다.
※ 참고:
기본적으로 뷰에서 필드 삽입을 실행하면 ViewComponent는 ActivityComponent에 정의된 결합을 사용할 수 있습니다. FragmentComponent에 정의된 결합도 사용해야 하며 뷰가 프래그먼트의 일부라면 @AndroidEntryPoint와 함께@WithFragmentBindings 주석을 사용하세요.
Hilt 구성요소 기본 결합
각 Hilt 구성요소는 Hilt가 고유한 맞춤 결합에 종속 항목으로 삽입할 수 있는 기본 결합 세트와 함께 제공됩니다.
이러한 결합은 일반 활동 및 프래그먼트 유형에 해당하며 특정 서브클래스에는 해당되지 않습니다.
이는 Hilt가 모든 활동을 삽입하는 데 단일 활동 구성요소 정의를 사용하기 때문입니다. 각 활동에는 이 구성요소의 다른 인스턴스가 있습니다.
참고 블로그 :
https://www.charlezz.com/?p=1259
Dagger2를 알아보자 – 기본편 | 찰스의 안드로이드
Dagger2를 알아보자 - 기본편 (You're here) Dagger2를 알아보자 - Scope Dagger2를 알아보자 - Injection의 종류 Dagger2를 알아보자 - Qualifier Dagger2를 알아보자 - Binding Dagger2를 알아보자 - Multibinding Dagger2를 알아
www.charlezz.com
https://coding-grandpa.tistory.com/2
보일러 플레이트(Boiler Plate) 이해하기
요약 BoilerPlate 코드란 모든 코드를 작성하기 위해 항상 필요한 부분을 의미한다. BoilerPlate는 다음 4가지로 구성되어 있다. Import : 필요한 코드를 불러들이는 부분 Component : 현 페이지를 구현하는
coding-grandpa.tistory.com
https://onlyfor-me-blog.tistory.com/487
[Android] Hilt에 대한 고찰
글 제목에 '고찰'이라는 단어를 써서 거창하게 보이겠지만 사실 Hilt가 무엇인지, 사용되는 몇몇 어노테이션과 Hilt가 어떤 방식으로 작동하는지에 대해 간단하게 기록할 뿐인 포스팅이다. 원래 "H
onlyfor-me-blog.tistory.com
https://bj-turtle.tistory.com/110
내가 쉽게 이해한 Hilt
▩ 목 차 ▩ 1. Hilt 란? 1-1. 의존성 주입(Dependency Injection) 이란? 1-1-1. 원초적으로 의존성이 뭔데 ? 1-1-2. 그러면 의존 관계를 줄일 순 없나?(feat. 인터페이스) 1-1-3. 원초적으로 주입은 뭔데 ? 1-1-4. 의
bj-turtle.tistory.com
https://developer88.tistory.com/349
HILT 에 대해서 정리해 보겠습니다. # DI Dependency Injection
오늘은 Hilt를 이용한 Dependency Injection에 대해서 정리해 보도록 하겠습니다. Dependency Injection에 대해 경험이 없으신 분들이라면, 아래 글을 통해서 기본적인 개념에 대해서 이해해 보시면 도움이
developer88.tistory.com
https://seosh817.tistory.com/102
[Android/DI] Dagger2 - Scope와 dagger.android
Dagger의 가장 큰 장점은 계층관계의 오브젝트 그래프를 만들 수 있다는 것 입니다. 이번에 다룰 @Subcomponent와 @Scope를 이용하면 오브젝트 그래프를 이용하여 앱 구성요소의 생명주기 동안 메모리
seosh817.tistory.com
참고 :
https://developer.android.com/training/dependency-injection/hilt-android?hl=ko#component-hierarchy
Hilt를 사용한 종속 항목 삽입 | Android 개발자 | Android Developers
Hilt를 사용한 종속 항목 삽입 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Hilt는 프로젝트에서 종속 항목 수동 삽입을 실행하는 상용구를 줄이는 Android용
developer.android.com
'App' 카테고리의 다른 글
클린 아키텍처 (0) | 2024.02.14 |
---|---|
디자인 패턴 (1) | 2023.12.17 |
firebase(파이어베이스)란? (1) | 2023.12.17 |
Life Cycle(Android Activity Lifecycle) (1) | 2023.12.15 |
Native Application과 Cross-Platform Application의 차이점 (0) | 2023.12.15 |