본문 바로가기
프로그래밍/안드로이드

[Android] Hilt 의 SingletonComponent 는 Singleton 객체를 생성하지 않는다.

by dev_gyu 2024. 10. 8.
728x90

Hilt 를 살펴보면 다음과 같이 SingletonComponent 라는게 존재한다.

이것은 해당 Module 에서 제공하는 의존성 주입 객체를 InstallIn

즉, 전역적으로 사용할 수 있게 처리해주는 것인데 나는 이것이 당연히 객체들을 Singleton 화도 시켜준다고 생각하였으나, 그것이 아니었다.


 

# 예를 하나 들어보자.

우선 DI 의 RoomDataBase 부분이다.

위의 경우 SingletonComponent 로 구현되어있으며, Return 객체를 제공해줘야하므로 Provides 를 사용하여 값을 직접 주입시켜주었다.

 

 

그리고 DI 객체를 사용할 호출부는 위와 같이 API RepoImpl 클래스로 설정하였다.

이제 뷰모델에서 Repository 의 Method 를 호출하고 API 수신이 성공하면 RepoImpl 에서는 Room DataBase 에 Entity 를 넣어줄 것이다.

 

우선 ViewModel 에서 Repository 를 호출하기 전에, RoomDataBase 에 저장되어있는 Entity 를 Flow 로 꺼내서 실시간으로 UI 를 업데이트 해주도록 설정하였다.

그러나 이렇게 모든 설정을 끝마치고 데이터를 호출하였고, DB 에 데이터가 정상적으로 들어갔음에도 ViewModel 의 Entity Flow 에서는 아무런 반응도 일어나지 않는다.

 

# SingletonComponent 와 Singleton Annotation 의 차이

위와 같은 현상이 발생한 이유는 DI 를 할 때, @Provides 함수에 @Singleton 을 붙여주지 않아서 그렇다.

과거, 나의 경우 SingletonComponent 로 선언하면 무조건 Singleton 객체로 되는 줄 알았지만, SingletonComponent 는 전역적으로 의존성 주입을 사용할 수 있게 해줄 뿐, 해당 객체를 싱글톤으로 바꿔주지는 않는다.

 

만약 특정 의존성 주입 객체를 전역적으로 단 하나의 인스턴스로 만들어 사용하고 싶다면 @Singleton Annotation 을 붙여주도록 하자

 

 

728x90