"Hilt는 Android에 특화된 Dagger 기반 의존성 주입 라이브러리입니다. Dagger의 복잡성을 줄이고 개발자가 더 쉽고 간편하게 의존성 주입을 할 수 있도록 만들어져 있습니다. Hilt를 사용하면 코드의 양을 줄이고 가독성을 높여 안정적인 의존성 주입을 구현할 수 있습니다."
"Hilt는 어노테이션을 통해 의존성 주입 클래스와 주입받는 클래스를 정의합니다. 어노테이션은 메타데이터를 제공하는 방식으로, Java 컴파일러에 추가 정보를 제공하고 이를 바탕으로 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에게 특정 타입의 인스턴스를 어떻게 생성해야 하는지를 알려줍니다.
@Singleton: 이 어노테이션은 Hilt에게 해당 타입의 인스턴스를 싱글톤으로 관리하도록 지시합니다.
"Hilt는 Dagger의 Component 개념을 기반으로 동작합니다. Hilt는 애플리케이션의 생명주기에 맞게 의존성을 관리하는 미리 정의된 컴포넌트 세트를 제공합니다. 이 컴포넌트들은 Application, Activity, Fragment, View, Service 및 BroadcastReceiver의 생명주기를 관리합니다. 컴포넌트 간의 계층 구조는 애플리케이션의 생명주기를 반영합니다."
"Hilt는 @AndroidEntryPoint 어노테이션을 사용하여 표시된 클래스에 필요한 의존성을 자동으로 주입합니다. 이를 통해 개발자는 실제 비즈니스 로직에 집중하면서, 의존성 관리는 Hilt에게 맡길 수 있습니다."
" Android의 ViewModel 클래스는 데이터를 보존하고, 이 데이터가 앱의 생명 주기 (예: 화면 전환)를 넘어서 유지되도록 해주는 역할을 합니다. 따라서 ViewModel 인스턴스는 액티비티나 프래그먼트와는 다른 독특한 생명 주기를 가지게 됩니다."
Android는 ViewModel 인스턴스를 만들 때 이 생명 주기를 지원하는 ViewModelProvider를 제공합니다. ViewModelProvider는 우리가 ViewModel 인스턴스를 요청할 때마다 동일한 인스턴스를 반환하도록 보장합니다. 이렇게 하면 액티비티나 프래그먼트가 재생성될 때마다 새로운 ViewModel 인스턴스가 생성되는 것을 방지하고, 데이터의 일관성이 유지됩니다.
하지만 의존성 주입 라이브러리인 Hilt를 사용하여 ViewModel을 직접 주입하려고 하면 문제가 발생할 수 있습니다. 왜냐하면 Hilt는 액티비티나 프래그먼트가 재생성될 때마다 새로운 인스턴스를 만들게 됩니다. 이는 ViewModel의 생명 주기를 따르지 않는 것입니다.
그래서 Hilt와 함께 ViewModel을 사용하려면, Hilt ViewModel Factory를 통해 ViewModelProvider를 사용해야 합니다. 이렇게 하면 ViewModel 인스턴스를 올바르게 관리할 수 있습니다. 이로써 우리는 ViewModel이 앱의 생명 주기를 넘어서도 데이터를 유지할 수 있도록 돕는 ViewModelProvider를 사용하며, 이것이 Hilt를 이용하여 직접 ViewModel을 주입하는 것보다 나은 방법입니다.