Hilt EntryPoint 주입 방식도 DI 그래프에 등록이 되어야 하는지? (feat. Perplexity)

Philipy (윤상필)·2025년 11월 26일

아주 핵심적인 질문입니다!
EntryPoint 인터페이스를 통해 획득하려는 DI 객체(헬퍼, 매니저 등)는 실제로 아래 두 방법 중 하나로 Hilt 그래프에 '제공'되어 있어야 합니다.


1. 자동 주입 방식 (@Inject constructor)

  • DI 객체(예: Manager, Helper 등) 자체에
    생성자에 @Inject를 명시하고
    필요한 스코프(@Singleton, @ActivityScoped 등)를 클래스나 생성자에 붙이면
    별도 @Provides/@Binds 모듈 없이도
    Hilt가 "자동으로 생성 및 제공" 가능[1][2].
  • 이 경우, EntryPoint에서 해당 타입의 getter만 선언하면 시스템 내부 어디서든 획득 가능:
@ActivityScoped
public class MessageHelper {
    @Inject
    public MessageHelper(@ActivityContext Context context) { ... }
}

@EntryPoint
@InstallIn(ActivityComponent.class)
public interface MyEntryPoint {
    MessageHelper getHelper();
}

2. 명시적 제공 방식 (@Provides/@Binds 모듈 사용)

  • DI 객체(예: 외부 라이브러리, 생성자 수정 불가능한 클래스 등)는
    별도의 팩토리 모듈(@Provides) 또는 바인즈 모듈(@Binds)에서 Hilt에 직접 제공해야 함.
  • 이를 통해 EntryPoint에서 해당 타입을 획득 가능:
@Module
@InstallIn(ActivityComponent.class)
public class HelperModule {
    @Provides
    @ActivityScoped
    public MessageHelper provideHelper(@ActivityContext Context context) {
        return new MessageHelper(context);
    }
}

@EntryPoint
@InstallIn(ActivityComponent.class)
public interface MyEntryPoint {
    MessageHelper getHelper();
}

즉,

  • “Hilt DI 그래프에 이미 등록되어 있는 객체만 EntryPoint 획득이 가능”
    (즉, Hilt가 그 객체를 생성·관리하고 있어야 함)
  • @Inject 컨스트럭터 객체면 모듈 불필요,
    직접 생성 불가 또는 특별한 생성/바인딩이 필요한 경우엔 팩토리/바인즈 모듈이 필요

정리:
EntryPoint 인터페이스는 단지 “수동 획득 진입점”
실제로 제공하려는 객체는

  • ① 생성자에 @Inject, 스코프 어노테이션으로 자동 등록
  • ② @Provides/@Binds 모듈로 등록
    둘 중 하나 방식으로 항상 Hilt 그래프에 ‘제공’되어 있어야
    EntryPoint에서 정상적으로 획득 가능합니다!
    상황에 따라 모듈 구성이 필요한지 결정하면 됩니다[1][2].

출처
[1] Hilt를 사용한 종속 항목 삽입 - Android Developers https://developer.android.com/training/dependency-injection/hilt-android?hl=ko
[2] Android DI 라이브러리 Dagger-Hilt 소개와 사용법 https://fanxy0n.tistory.com/29

profile
Tech Phase-smith, Karax wannabe

0개의 댓글