[Android] Hilt의 @Reusable

박상군·2024년 10월 31일
0

Dependency Injection

목록 보기
5/5
post-thumbnail

안드로이드에서 많이 사용하는 DI 라이브러리인 Hilt의 @Reusable !!

@Reusable은 특정 객체를 필요에 따라 재사용할 수 있도록 하는 Dagger의 스코프 어노테이션으로 객체가 자주 필요하지만, 매번 새로운 인스턴스를 생성하는 것이 비효율적일 때 유용하다.

@Reusable로 주입된 객체는 가능한 경우 캐시에서 가져와 사용하고, 그렇지 않으면 새로 생성된다.

1. @Reusable의 특징

  • 효율적인 메모리 관리: @Reusable로 주입된 객체는 Dagger가 관리하는 캐시에서 재사용될 수 있어, 필요할 때마다 새 인스턴스를 생성하는 부담을 줄인다.

  • 조건부 재사용: Dagger의 내부 캐시에 이전에 생성된 객체가 존재하면 이를 반환하지만, 그렇지 않은 경우 새로운 객체를 생성하여 반환한다.

  • 비교적 짧은 생명주기: @Reusable은 @Singleton처럼 앱 전체에서 유일한 인스턴스를 보장하지 않는다. 즉, 캐시에 객체가 남아 있는 한 재사용되지만, 필요하지 않으면 언제든지 제거될 수 있다.

2. @Reusable 사용 예제

@Reusable은 주로 짧은 생명 주기를 가지는 객체나 빈번하게 호출되지만 매번 인스턴스를 생성할 필요는 없는 경우에 사용된다.

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {

    @Provides
    @Reusable
    fun provideLoggingInterceptor(): HttpLoggingInterceptor {
        return HttpLoggingInterceptor().apply {
            level = HttpLoggingInterceptor.Level.BODY
        }
    }
}

위의 코드는 Okhttp의 LoggingInterceptor를 주입하는 예제인데

3. @Reusable vs @Singleton

  • @Singleton: 앱의 생명 주기 동안 객체의 단일 인스턴스를 보장하며, 메모리에 상주한다.

  • @Reusable: 객체가 필요할 때마다 캐시에서 가져오거나 새로 생성될 수 있어 메모리 사용량을 절약할 수 있다.

4. 그렇다면 언제 @Reusable을 사용할까?

  • 매번 새로운 인스턴스를 생성할 필요는 없지만, 단일 인스턴스를 유지해야 할 필요도 없는 경우

  • 네트워크 요청이나 로깅과 같은 자주 호출되는 객체에서 사용하여, 성능을 최적화할 수 있습니다.


이처럼 @Reusable은 메모리 효율성과 성능을 높이는 데 유용하며, 메모리 최적화가 필요한 빈번한 작업에 적합한 스코프이다.

References

Dagger-Hilt

0개의 댓글