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 을 붙여주도록 하자