[Android] Hilt- Hilt를 사용하는 이유 (1)

2025. 8. 12. 17:01·Android

Hilt는 안드로이드에서 의존성을 주입하기 위한 Jetpack 기반 라이브러리이다.

지금부터 Hilt를 왜 사용하는지, 어떻게 사용하는지에 대해서 하나씩 알아볼 것이다.

 

먼저 Hilt를 사용하게 된 이유를 살펴보자.

의존성 주입(DI, Dependency Injection)

Hilt를 사용하기 전에 직접 의존성을 주입하는 것이 많은 코드를 유발할 뿐더러,

객체들의 생명주기를 직접 관리해야 한다는 것을 알아야 한다.

 

❓의존성 주입이 뭔가요 ?

다음 예시를 보자.

class Car(private val engine: Engine) {
    fun start() {
        engine.start()
    }
}

fun main(args: Array) {
    val engine = Engine()
    val car = Car(engine)
    car.start()
    
    // val electricCar = Car(ElectricEngine())
    // electricCar.start() 
}

 

Car 클래스가 Engine 클래스를 참조하고 있다.

Car 클래스를 초기화할 때 Engine 인스턴스 engine을 생성자의 매개변수로 넣는데,

이것을 "생성자 삽입"을 통한 의존성 주입이라고 한다!

(만약 엔진의 종류가 늘어나면 주석처럼 Engine 인터페이스를 따로 두어 start() 함수를 오버라이딩하는 클래스를 추가하면 된다.)

 

Android에서 의존성 주입을 하는 방법은 앞선 생성자 삽입도 있지만, "필드 삽입" 방식도 있다.

다음은 필드 삽입 방식의 예제이다.

class Car {
    lateinit var engine: Engine

    fun start() {
        engine.start()
    }
}

fun main(args: Array) {
    val car = Car()
    car.engine = Engine()
    car.start()
}

 

Car 클래스가 생성된 후, 인스턴스 내의 참조 클래스인 Engine을 외부에서 생성하여 할당하는 과정을 통해

수동으로 의존성을 주입하는 방식이다.

 


Android의 수동 의존성 주입

 

의존성 주입을 함으로써 객체가 직접적으로 다른 객체를 생성하거나 참조하지 않고, 필요한 객체를 그때그때 주입할 수 있다는 장점이 있다.

하지만 의존해야 할 객체의 수가 늘어날수록 객체 간 의존 관계를 명확히 파악하기 어려우며,

각 객체의 생명주기를 일관성있게 관리하는 것이 점점 더 복잡해진다.

 

class LoginActivity: Activity() {

    private lateinit var loginViewModel: LoginViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val retrofit = Retrofit.Builder()
            .baseUrl("https://example.com")
            .build()
            .create(LoginService::class.java)

        val remoteDataSource = UserRemoteDataSource(retrofit)
        val localDataSource = UserLocalDataSource()

        val userRepository = UserRepository(localDataSource, remoteDataSource)

        loginViewModel = LoginViewModel(userRepository)
    }
}

 

LoginActivity에서 LoginViewModel을 사용하기 위해 Retrofit 서비스까지 모든 의존성 객체를 생성해서 주입하는 코드이다.

물론 안드로이드 개발자라면 이 코드가 얼마나 비효율적인지 바로 알 수 있을 것이다.

객체를 재사용하기 어려우므로, 동일한 의존성이 필요한 다른 액티비티나 컴포넌트에서 같은 초기화 코드를 중복 작성해야 하기 때문이다.

그래서 보통은 의존성 주입 클래스를 따로 만들어 전역으로 관리한다.

class AppContainer {
    private val retrofit = Retrofit.Builder()
                            .baseUrl("https://example.com")
                            .build()
                            .create(LoginService::class.java)

    private val remoteDataSource = UserRemoteDataSource(retrofit)
    private val localDataSource = UserLocalDataSource()
    val userRepository = UserRepository(localDataSource, remoteDataSource)
}

 

최상단 클래스인 Application 클래스에 AppContainer 인스턴스를 생성하고 관리한다.

이렇게 하면 액티비티에서 의존성을 매번 생성할 필요없이, AppContainer를 통해 전역적으로 제공받을 수 있다.

 



위 방식은 보일러 플레이트 코드를 줄여준다는 점에서 분명한 이점이 있다.

하지만 여전히 모든 의존성 객체를 생성해서 주입해야 하며, 생명주기도 따로 관리해야 한다.

또한 메모리를 확보하기 위해 더 이상 필요하지 않은 AppContainer는 최적화 및 삭제해야 한다.

 

따라서 수동 의존성 주입을 자동으로 관리해주고,

안드로이드 컴포넌트 생명주기에 맞춰 객체의 생성과 소멸을 자동으로 처리해주는 라이브러리인 Hilt가 도입되었다!

 

이제 Hilt를 알아갈 차례이다!

내용이 많지만 차근차근 하다보면 Hilt 마스터가 될지도 ... ? 🧐

 

:)

 

출처

https://developer.android.com/training/dependency-injection?hl=ko&_gl=1*pxtg4h*_up*MQ..*_ga*MTkzNTkxMjc2NC4xNzU0OTc2MDg5*_ga_6HH9YJMN9M*czE3NTQ5NzYwODgkbzEkZzAkdDE3NTQ5NzYwODgkajYwJGwwJGgyNzEwODU2NDg.

https://developer.android.com/training/dependency-injection/manual?hl=ko&_gl=1*1magdot*_up*MQ..*_ga*MTkzNTkxMjc2NC4xNzU0OTc2MDg5*_ga_6HH9YJMN9M*czE3NTQ5NzYwODgkbzEkZzAkdDE3NTQ5NzYwODgkajYwJGwwJGgyNzEwODU2NDg.

'Android' 카테고리의 다른 글

[Android] Hilt- Component 계층 구조, Scope (3)  (0) 2025.08.15
[Android] Hilt- 프로젝트 세팅, Hilt 기본 흐름 (2)  (5) 2025.08.15
[Android] 클린 아키텍처(Clean Architecture)  (2) 2025.08.11
[Android] Work Manager(+Job Scheduler)  (2) 2025.08.09
[Android] 안드로이드 권장 아키텍처  (4) 2025.07.31
'Android' 카테고리의 다른 글
  • [Android] Hilt- Component 계층 구조, Scope (3)
  • [Android] Hilt- 프로젝트 세팅, Hilt 기본 흐름 (2)
  • [Android] 클린 아키텍처(Clean Architecture)
  • [Android] Work Manager(+Job Scheduler)
jjangsudiary
jjangsudiary
jjangsudiary 님의 블로그 입니다.
  • jjangsudiary
    jjangsudiary 님의 블로그
    jjangsudiary
  • 전체
    오늘
    어제
    • 분류 전체보기 (81) N
      • 이모저모 (0)
        • 회고 (0)
      • Development (17) N
        • 개발 공부 (14) N
        • 프로젝트 (2)
      • Android (10)
        • Compose (1)
      • AI (15)
      • Computer Science (25)
        • 네트워크 (8)
        • 데이터베이스 (10)
        • 운영체제 (6)
        • 자료구조 (0)
        • 컴퓨터구조 (1)
      • Java (9)
        • 디자인패턴 (2)
      • Spring (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    머신러닝
    TensorFlow
    database
    안드로이드
    파이썬
    CS
    운영체제
    baekjoon
    os
    java
    프로그래머스
    Ai
    db
    Python
    인공지능
    android
    코딩 테스트
    딥러닝
    백준
    자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
jjangsudiary
[Android] Hilt- Hilt를 사용하는 이유 (1)
상단으로

티스토리툴바