사진: Unsplash의Sangga Rima Roman Selia
이 게시글은 저의 무지함으로 발생한 질문에서 시작된 게시글입니다.
Now In Android를 참고하여 프로젝트를 진행하던 도중 "Data 모듈에서 Domain의 Usecase에 Repository를 주입할 때에는 @Provide를 사용해서 이를 주입해 주는데, Feature 모듈에서 Usecase를 주입 받을 때에는 왜 @Provide를 하지 않아도 주입받을 수 있는가?" 라는 질문이 생겼습니다.
이 게시글에서 이 질문에 대한 답을 하고자 합니다.
질문에 대한 답
위의 질문은 사실 Dagger를 잘 이해하지 못하고 Hilt를 사용해서 생긴 질문입니다.
@Provide와 @Inject은 컴포넌트에서 의존성 그래프를 만들기 위한 과정입니다. 만들어진 의존성 그래프를 통해 컴포넌트는 모듈에서 객체를 가져와서 이를 필요한 곳에 전달해주고 있습니다.
만약 아래와 같이 B 클래스의 객체가 A 클래스에서 필요해서 @Provide와 @Inject를 정의 했다면 아래와 같은 의존성 그래프가 생길 것입니다.
만약 다른 C 클래스에서 A 클래스의 객체가 필요해서 C 클래스에서 @Inject를 했다고 생각해 보겠습니다.
이전의 작업으로 인해 해당 컴포넌트에는 A 클래스와 B 클래스에 대한 의존성 그래프가 정의되어 있습니다.
그렇기 때문에 컴포넌트에 A 클래스의 객체를 요청하면 컴포넌트는 A 클래스를 이미 알고 있기 때문에 따로 @Provide하지 않아도 C 클래스는 A 클래스의 객체를 주입받을 수 있게 됩니다.
결론
결국에는 원하는 객체를 주입받기 위해서는 컴포넌트가 정의한 의존성 그래프에 해당 객체가 정의되어 있어야 합니다.
@Inject를 통해서도 의존성 그래프에 해당 객체가 정의될 수 있으니 @Inject 만으로도 다른 클래스에서 해당 클래스를 찾아서 가져올 수 있는 것입니다.
'Android > Kotlin' 카테고리의 다른 글
Immutable 그리고 Persistent Collections에 대해서 (1) | 2024.02.26 |
---|---|
Ktor에 대해 알아보고 HTTP 통신 해보기 (1) | 2023.12.04 |
코틀린에서 Backing Properties를 왜 사용해야 하죠? (2) | 2023.11.22 |
코틀린 리플렉션과 애노테이션 그리고 함수 참조 (0) | 2023.11.05 |
StateFlow, SharedFlow에 대해 알아보기 (0) | 2023.10.01 |