@Inject로도 @Provide할 수 있다
사진: 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 만으로도 다른 클래스에서 해당 클래스를 찾아서 가져올 수 있는 것입니다.