Programming/Android

[Android] DI(종속성 주입) Hilt 공부

코딩뽀시래기 2024. 5. 25. 23:01
728x90

DI(Dependency Injection)에 대해 공부하면서 Hilt, NetworkModule을 세팅해봤는데 그 과정에서 찾아본 참고 자료와 내가 이해한 내용을 기록해보려 한다...

 

✅ Hilt

  • DI란? Dependency Injection(종속성 주입)
  • 객체가 의존성을 직접 생성하지 않고, 외부로부터 받아서 사용
  • DI를 구현하면 아래와 같은 장점이 있다.
    • 코드 재사용 가능(코드 결합도를 낮춤), 리팩토링 편의, 테스트 편의
  • Hilt는 DI를 쉽고 효율적으로 사용할 수 있게 해주는 도구.
  • Hilt는 애플리케이션의 다양한 수명 주기를 고려해서 의존성을 관리하기 때문에 메무리 누수 등의 문제를 방지하는 데에도 도움이 된다.

Android 앱에서 Hilt를 사용하려면?

  • Hilt 플러그인과 종속 항목을 추가
  • @HiltAndroidApp으로 Application 클래스에 주석 달기 -> 앱의 수명 주기에 연결된 컨테이너를 추가하려면!
  • Hilt를 사용하려면 @AndroidEntryPoint로 주석을 달아야 한다(feature 만드는 부분에 달아야 하는 것 같다)
    • Android 클래스에 종속성 주입
      • Application ( @HiltAndroidApp )
      • ViewModel ( @HiltViewModel )
      • Activity
      • Fragment
      • View
      • Service
      • BroadcastReceiver
    • 의존성을 주입하려면 사용되는 항목의 인스턴스 제공 방법을 알아야 한다.
    • 이때 @Inject 주석을 이용해서 Hilt에 '인스턴스를 제공하는 방법'을 알려준다.@Inject은 뭐지? -> Hilt에 종속 항목 제공 방법 알릴 때 쓰는 거라고 하는데, 이해하지 못했다.
class AnalyticsAdapter @Inject constructor(
  private val service: AnalyticsService
) { ... }

참고

 


Hilt 어노테이션


Hilt > @Installin : 어떤 Component에 Install할지 모듈 범위 지정


NetworkModule.kt

/*
@Module: 인터페이스나, 빌더 패턴을 사용한 경우, 외부 라이브러리 클래스 등등 생성자를 사용할 수 없는 Class를 주입해야 할 경우
@InstallIn: 어떤 Component에 Install할지 모듈 범위 지정. @Module이나 @EntryPoint 어노테이션과 함께 사용해야 함.
(SingletonComponent::class): 애플리케이션 전체에서 재사용 -> 네트워크 모듈은 전체에서 사용될듯하다
@Provides: 클래스가 외부 라이브러리를 사용(Retrofit, OkHttpClient, Room databases...)하거나 빌더 패턴으로 객체 생성을 하는 경우 @Provides로 의존성 생성
*/
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
    // API BASE URL
    private const val BASE_URL = ""

    // 로깅인터셉터 세팅
    @Provides
    @Singleton
    fun provideRequestHttpLoggingInterceptor() : HttpLoggingInterceptor {
        return HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY }
    }

    // OKHttpClient에 로깅인터셉터 등록
    @Provides
    @Singleton
    fun provideOkHttpClient(interceptor: HttpLoggingInterceptor) : OkHttpClient {
        return OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .build()
    }

    @Provides
    @Singleton
    fun provideRetrofit(okHttpClient: OkHttpClient) : Retrofit {
        return Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create())
            //.addCallAdapterFactory(ApiResponseCallAdapterFactory.create())
            .build()
    }
}

 


Github issue

728x90