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에 종속 항목 제공 방법 알릴 때 쓰는 거라고 하는데, 이해하지 못했다.
- Android 클래스에 종속성 주입
class AnalyticsAdapter @Inject constructor(
private val service: AnalyticsService
) { ... }
참고
- https://developer.android.com/training/dependency-injection/hilt-android?hl=ko
- https://developer.android.com/codelabs/android-hilt?hl=ko#0
- ⭐️ https://velog.io/@haanbink/Android-Hilt-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
Hilt 어노테이션
- https://nosorae.tistory.com/entry/Android-Hilt-%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
- https://velog.io/@heymoko/Android-DI%EB%8A%94-%EB%AD%90%EA%B3%A0-Hilt%EB%8A%94-%EB%AD%94%EB%8D%B0%EC%9A%94
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
'Programming > Android' 카테고리의 다른 글
[Android] minifyEnabled란? (0) | 2024.06.08 |
---|---|
[Android] gradle > buildType에서 release와 debug 버전을 분리하는 경우 (0) | 2024.06.07 |
[Android] Toast 나타나는 위치 변경 / setGravity() / API30 이상 (0) | 2024.05.09 |
[Android] 안드로이드 프로젝트 minSDK 버전 (1) | 2024.04.29 |
[Android Studio] Paging (1) | 2023.03.14 |