오늘은 inner class 수정하고 Hilt에 대해서 공부해보았다.

여기서 의존성 주입이란?? 생성자 또는 메서드 등을 통해 외부로부터 생성된 객체를 전달받는 행위를 의미한다. 의존성 주입을 통해 클래스간 결합도를 느슨하게 만들고 코드를 유연하게 변경 가능하도록 한다.
Hilt를 사용하면 간단한 어노테이션을 통해 의존성을 쉽게 주입할 수 있습니다. 어노테이션을 액티비티나 프래그먼트에 추가함으로써 Hilt가 필요한 의존성을 해당 컴포넌트에 자동으로 주입하도록 할 수 있습니다. 또한 Hilt는 애플리케이션의 다양한 수명 주기를 고려하여 의존성을 관리하므로 메모리 누수와 같은 문제를 방지하는 데에도 도움이 됩니다.
1줄 요약 : Hilt는 안드로이드 개발에서 DI를 더 쉽고 효율적으로 사용할 수 있게 해주는 도구이며 코드의 유지 보수성과 확장성을 크게 향상시킬 수 있다.
class Engine{}
class Car {
val engine = Engine()
}
다음과 같은 클래스 두개가 있다면 Car 클래스 내에서 직접 Engine을 생성하는 책임을 가지고 있다.
class Car (val engine: Engine){}
Car 클래스가 Engine 생성의 책임을 제거! -> Engine을 외부에서 전달 받을 수 있게 되면 Car는 Engine 생성에 대한 책임이 없다 -> 제어의 역전
의존성을 클라이언트에게 제공하는 역할을 한다.
class Injector {
fun getEngine() {
return Engine()
}
}
fun main(args: Array<String>) {
val engine = Injector().getEngine()
val car = Car(engine)
}
-> Injector는 Engine 클래스에 의존하고 있다.
Injector는 Car 클래스에게 의존성을 주입해주고 있다.
Car 클래스는 Engine 클래스를 참조하고 있다.
class Car {
private val engine : Engine
private val wheels : Wheels
fun Car() {
engine = Engine()
wheels = Wheels()
}
fun Drive() {
}
@Inject lateinit var car : Car
onCreate() {
car.drive()
}
클래스가 외부 라이브러리에서 제공되어 생성자 삽입이 불가능한 경우 (ex. Retrofit, Room)
@Module
@InstallIn(SingletonComponent::class)
internal object RetrofitClient {
@Provides
fun provideOkHttpClient(): OkHttpClient {
val loggingInterceptor = HttpLoggingInterceptor()
loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
return OkHttpClient
.Builder()
.addInterceptor(HttpRequestInterceptor())
.addNetworkInterceptor(loggingInterceptor)
.build()
}
Interface는 생성자 삽입이 불가능한데 Interface의 인스턴스를 제공해야 할 때 사용한다.
@Module
@InstallIn(SingletonComponent::class)
internal interface SearchModule {
@Binds
fun bindsSearchRepository(searchRepositoryImpl: SearchRepositoryImpl) : SearchRepository
}
HiltAndroidApp은 Hilt 컴포넌트의 코드 생성과 컴포넌트를 사용하는 Application의 기본클래스를 생성하여 onCreate() 호출 후 Application 필드에 의존성 주입이 이루어짐
@HiltAndroidApp
class StandardApp: Application()
Application에서 멤버 주입이 가능하게 설정하면, 안드로이드 클래스에 AndroidEntryPoint 어노테이션을 사용하여 멤버주입을 해줘야 한다.
@AndroidEntryPoint
class GitHubUserFragment : Fragment() { ... }
InstallIn
.
.
.
.
.

강의 들으면서 한번 실행해봤는데...
실행하자마자 멸망했다 흐규ㅠㅠㅠㅠㅠㅠㅠㅠㅠ