의존성 주입 Hilt

jiyoon·2023년 6월 5일

모바일 안드로이드

목록 보기
12/12

"HiltAndroid에 특화된 Dagger 기반 의존성 주입 라이브러리입니다. Dagger의 복잡성을 줄이고 개발자가 더 쉽고 간편하게 의존성 주입을 할 수 있도록 만들어져 있습니다. Hilt를 사용하면 코드의 양을 줄이고 가독성을 높여 안정적인 의존성 주입을 구현할 수 있습니다."

Hilt의 기본적인 동작원리와 구조

Annotation (어노테이션)

"Hilt는 어노테이션을 통해 의존성 주입 클래스와 주입받는 클래스를 정의합니다. 어노테이션은 메타데이터를 제공하는 방식으로, Java 컴파일러에 추가 정보를 제공하고 이를 바탕으로 Hilt 등의 프레임워크가 코드를 생성하거나 조작합니다."

  • @HiltAndroidApp : 애플리케이션 클래스에 적용합니다. 이 어노테이션을 사용하면 Hilt는 해당 애플리케이션에 필요한 컴포넌트를 생성합니다.
@HiltAndroidApp //애플리케이션이 Hilt를 사용하도록 지정
public class MealMateApplication extends Application {
    private static final String TAG = "밀메이트 시작~!";
    @Override
    public void onCreate() {    //애플리케이션의 시작점
        super.onCreate();
        Log.d(TAG, "onCreate: 밀메이트 시작~!");
    }
    
    public void onTerminate() {     //애플리케이션의 종료점
        super.onTerminate();
        Log.d(TAG, "onTerminate: 밀메이트 종료~!");
    }
}
  • @AndroidEntryPoint: 이 어노테이션은 의존성을 주입 받을 Android 클래스 (Activity, Fragment, View 등)에 적용됩니다. 이를 통해 Hilt는 해당 클래스에 필요한 의존성을 주입할 수 있습니다.

  • @Inject: 이 어노테이션은 의존성이 필요한 필드, 생성자, 메소드에 적용되며, Hilt가 이들에 의존성을 주입해야 함을 나타냅니다.

  • @Module과 @Provides: 이 어노테이션들은 Hilt에게 특정 타입의 인스턴스를 어떻게 생성해야 하는지를 알려줍니다.

    • @Module은 의존성을 제공하는 메소드를 모아둔 클래스에 해당 클래스가 의존성을 제공하는 메소드들을 모아놓은 모듈임을 나타냅니다.
    • @Provides는 @Module이 붙은 클래스 안의 메소드에 붙으며, 해당 메소드가 특정 타입의 의존성을 제공함을 나타냅니다. 이 어노테이션은 특정 타입의 객체를 어떻게 생성해야 하는지를 Dagger/Hilt에 알려주는 역할을 합니다. @Provides가 붙은 메서드는 해당 타입의 객체를 생성하고 반환하는 코드를 포함하게 됩니다.
    • @InstallIn: 이 어노테이션은 모듈이 어떤 컴포넌트의 수명주기에 속하는지를 정의합니다. 예를 들어 @InstallIn(SingletonComponent.class)는 해당 모듈이 애플리케이션 수명주기에 속하는 객체를 제공함을 나타냅니다.
  • @Singleton: 이 어노테이션은 Hilt에게 해당 타입의 인스턴스를 싱글톤으로 관리하도록 지시합니다.

Component (컴포넌트)

"HiltDaggerComponent 개념을 기반으로 동작합니다. Hilt는 애플리케이션의 생명주기에 맞게 의존성을 관리하는 미리 정의된 컴포넌트 세트를 제공합니다. 이 컴포넌트들은 Application, Activity, Fragment, View, Service 및 BroadcastReceiver의 생명주기를 관리합니다. 컴포넌트 간의 계층 구조는 애플리케이션의 생명주기를 반영합니다."

Automatic Injection(자동 주입)

"Hilt@AndroidEntryPoint 어노테이션을 사용하여 표시된 클래스에 필요한 의존성을 자동으로 주입합니다. 이를 통해 개발자는 실제 비즈니스 로직에 집중하면서, 의존성 관리는 Hilt에게 맡길 수 있습니다."

ViewModel과 Hilt

" Android의 ViewModel 클래스는 데이터를 보존하고, 이 데이터가 앱의 생명 주기 (예: 화면 전환)를 넘어서 유지되도록 해주는 역할을 합니다. 따라서 ViewModel 인스턴스는 액티비티나 프래그먼트와는 다른 독특한 생명 주기를 가지게 됩니다."

ViewModel 인스턴스와 ViewModelProvider

Android는 ViewModel 인스턴스를 만들 때 이 생명 주기를 지원하는 ViewModelProvider를 제공합니다. ViewModelProvider는 우리가 ViewModel 인스턴스를 요청할 때마다 동일한 인스턴스를 반환하도록 보장합니다. 이렇게 하면 액티비티나 프래그먼트가 재생성될 때마다 새로운 ViewModel 인스턴스가 생성되는 것을 방지하고, 데이터의 일관성이 유지됩니다.

Hilt와 ViewModel

하지만 의존성 주입 라이브러리인 Hilt를 사용하여 ViewModel을 직접 주입하려고 하면 문제가 발생할 수 있습니다. 왜냐하면 Hilt는 액티비티나 프래그먼트가 재생성될 때마다 새로운 인스턴스를 만들게 됩니다. 이는 ViewModel의 생명 주기를 따르지 않는 것입니다.

ViewModel과 Hilt의 올바른 사용법

그래서 Hilt와 함께 ViewModel을 사용하려면, Hilt ViewModel Factory를 통해 ViewModelProvider를 사용해야 합니다. 이렇게 하면 ViewModel 인스턴스를 올바르게 관리할 수 있습니다. 이로써 우리는 ViewModel이 앱의 생명 주기를 넘어서도 데이터를 유지할 수 있도록 돕는 ViewModelProvider를 사용하며, 이것이 Hilt를 이용하여 직접 ViewModel을 주입하는 것보다 나은 방법입니다.

profile
주니어 개발자

0개의 댓글