종속항목삽입(DI)은 프로그래밍에서 널리 사용되는 기법으로 안드로이드 개발에 적합합니다.
예를들어 Car 클래스는 Engine 클래스 참조가 필요할겁니다. 이처럼 필요한 클래스를 종속항목이라 하며, 이 예에서 Car 클래스가 실행되기 위해선 Engine 클래스의 인스턴스가 필요합니다
그렇다면 Car 클래스가 필요한 Engine 클래스의 객체를 얻는 방법은 어떻게 될까요?
여기서 3번 방법이 종속항목삽입(DI)입니다!
이 방법은 클래스 인스턴스가 자체적으로 종속항목을 얻는 대신 클래스의 종속항목을 받아서 제공합니다
한번 코드로 예시를 볼까요?
class Car {
private val engine = Engine() // 직접 객체 생성
fun start() {
engine.start()
}
}
fun main(args: Array
위코드는 Car 클래스가 자체적으로 Engine을 구성하기 때문에 DI의 예가 아닙니다 이렇게만 구조가 짜여져있다면 괜찮겠지만 기능이 더 추가된다면 어떻게될까요?
Car와 Engine은 밀접하게 연결되어있습니다. 이것은 추후에 다른 유형의 Engine을 구현하게 될 때 동일한 Car를 재사용하는 대신 두 가지 유형의 Car를 생성해야합니다. 즉 보일러 플레이트 코드가 발생합니다!
종속항목 삽입시 코드를 살펴볼까요?
class Car(private val engine: Engine) {
fun start() {
engine.start()
}
}
fun main(args: Array
아까와 다르게 생성자에 Engine 인스턴스를 받고있죠?
이렇게 되면 둘의 의존도가 확실하게 자유로워졌습니다!
아까와 다르게 어떤점이 좋아졌을까요?
Car의 재사용이 가능합니다! 즉 아까와 다르게 어떤 엔진유형이 오더라도 Car는 추가변경없이도 계속 작동합니다. 아까와 다르게 보일러플레이트 코드를 작성할일이 없겠죠?
Dagger가 등장하기 이전 다양한 클래스의 종속 항목을 직접 생성, 제공 및 관리했습니다. 이를 종속항목 수동삽입이라 합니다.
이 작업을 수동으로 관리하다 보니, 종속 항목을 전달하기 전에 구성할 수 없을 때(예를 들어 지연초기화를 사용하거나 객체 범위를 앱의 흐름으로 지정하는 경우)는 메모리에서 종속항목의 전체를 관리하는 것도 까다롭고 어려웠습니다.
그래서 Dagger는 이러한 어려움을 극복해주는 라이브러리입니다.
Dagger는 종속항목 그래프를 자동으로 생성하고 관리해 앱의 DI 사용을 용이하게 해줍니다.
Hilt는 안드로이드에서 종속 항목을 삽입하기 위한 Jetpack의 권장라이브러리 입니다.
모든 안드로이드 클래스에 컨테이너를 제공하고 수명주기를 자동으로 관리함으로써 앱에서 DI를 실행하는 표준방법을 정의합니다.
Hilt는 Dagger가 제공하는 컴파일 시간 정확성, 런타임 성능, 확장성 및 안드로이드 스튜디오 지원의 이점을 누리기 위해 인기있는 DI 라이브러리인 Dagger를 기반으로 빌드되었습니다
마치며
Dagger Hilt의 간단한 설명과 필요성에 대해 적었습니다.
Hilt가 다른 DI 라이브러리에 비해 초반 러닝커브가 낮지만 쓰면쓸수록 더 어려워지는 느낌이 들어 다시 처음부터 공식문서를 보며 차근차근 공부하려고 합니다!
다음엔 Hilt의 컨테이너 종속 범위에 대해 집중적으로 공부하고 글을 올려보려합니다
참고 문헌