안드로이드에서 많이 사용하는 DI 라이브러리인 Hilt의 @Reusable !!
@Reusable은 특정 객체를 필요에 따라 재사용할 수 있도록 하는 Dagger의 스코프 어노테이션으로 객체가 자주 필요하지만, 매번 새로운 인스턴스를 생성하는 것이 비효율적일 때 유용하다.
@Reusable로 주입된 객체는 가능한 경우 캐시에서 가져와 사용하고, 그렇지 않으면 새로 생성된다.
효율적인 메모리 관리: @Reusable로 주입된 객체는 Dagger가 관리하는 캐시에서 재사용될 수 있어, 필요할 때마다 새 인스턴스를 생성하는 부담을 줄인다.
조건부 재사용: Dagger의 내부 캐시에 이전에 생성된 객체가 존재하면 이를 반환하지만, 그렇지 않은 경우 새로운 객체를 생성하여 반환한다.
비교적 짧은 생명주기: @Reusable은 @Singleton처럼 앱 전체에서 유일한 인스턴스를 보장하지 않는다. 즉, 캐시에 객체가 남아 있는 한 재사용되지만, 필요하지 않으면 언제든지 제거될 수 있다.
@Reusable은 주로 짧은 생명 주기를 가지는 객체나 빈번하게 호출되지만 매번 인스턴스를 생성할 필요는 없는 경우에 사용된다.
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Provides
@Reusable
fun provideLoggingInterceptor(): HttpLoggingInterceptor {
return HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
}
}
}
위의 코드는 Okhttp의 LoggingInterceptor를 주입하는 예제인데
@Singleton: 앱의 생명 주기 동안 객체의 단일 인스턴스를 보장하며, 메모리에 상주한다.
@Reusable: 객체가 필요할 때마다 캐시에서 가져오거나 새로 생성될 수 있어 메모리 사용량을 절약할 수 있다.
매번 새로운 인스턴스를 생성할 필요는 없지만, 단일 인스턴스를 유지해야 할 필요도 없는 경우
네트워크 요청이나 로깅과 같은 자주 호출되는 객체에서 사용하여, 성능을 최적화할 수 있습니다.