Foundation/Android
[Android] 종속 항목 삽입(Dependency Injection)이란?
개발왕 금골드
2022. 11. 19. 19:01
반응형
Introduce
종속 항목 삽입을 구현하면 다음과 같은 이점을 누릴 수 있다.
- 코드 재사용 가능
- 리팩터링 편의성
- 테스트 편의성
종속성 항목 삽입이란?
클래스에는 흔히 다른 클래스 참조가 필요하다. 예를 들어 Car 클래스는 Engine 클래스 참조가 필요할 수 있다. 이처럼 필요한 클래스를 종속 항목이라고 하며, 이 예에서 Car 클래스가 실행되기 위해서는 Engine 클래스의 인스턴스가 있어야 한다.
클래스가 필요한 객체를 얻는 세 가지 방법은 다음과 같다.
- 클래스가 필요한 종속 항목을 구성한다. 위의 예에서 Car는 자체 Engine인스턴스를 생성하여 초기화한다.
- 다른 곳에서 객체를 가져온다. Context Getter 및 getSystemService()와 같은 일부 Android API는 이러한 방식으로 작동한다.
- 객체를 매개변수로 제공받을 수도 있다. 앱은 클래스가 구성될 때 이러한 종속 항목을 제공하거나 각 종속 항목이 필요한 함수에 전달할 수 있다. 위의 예에서 Car 생성자는 Engine을 매개변수로 받는다.
세 번째 옵션이 종속 항목 삽입이다. 이 접근 방법을 사용하면 클래스 인스턴스가 자체적으로 종속 항목을 얻는 대신 클래스의 종속 항목을 받아서 제공한다.
Example
코드 내에서 차제 생성
class Car {
private val engine = Engine()
fun start() {
engine.start()
}
}
fun main(args: Array) {
val car = Car()
car.start()
}
- 이 예에서 Car와 Engine은 밀접하게 연결되어 있다. 이 말 뜻은 한 가지 유형의 Engine 객체를 자체적으로 구현하였기 때문에 쉽게 변경하기 어렵다는 뜻이다. 예를 들어 Engine을 가솔린 엔진과 전기 엔진으로 변경하기 위해서는 두 개의 서로 다른 Car 객체를 생성해야 한다.
- 강력한 의존은 테스트를 더욱 어렵게 만든다.
의존성 주입
class Car(private val engine: Engine) {
fun start() {
engine.start()
}
}
fun main(args: Array) {
val engine = Engine()
val car = Car(engine)
car.start()
}
- Car의 재사용이 더욱 쉽다. 예를 들어, Engine을 상속받는 다양한 Engine 클래스를 선언하여 서로 다른 Engine을 사용하는 Car를 쉽게 생성할 수 있게 된다. 단순히 새로운 엔진을 상속받는 클래스를 전달하기만 하면 되기 때문이다.
- 위와 같은 이유로 FakeEngine() 같은 dummy 클래스를 생성하여 전달하면 테스트가 용이하다.
Android에서 종속 삽입
- 생성자 삽입. 위에서 설명한 방법. 즉, 클래스의 종속 항목을 생성자에 전달한다.
- 필드 삽입(또는 setter 삽입). Activity 및 Fragment와 같은 특정 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에서는 Hilt를 사용할 수 있다.
- Hilt는 Dagger기반으로 만들어진 라이브러리이며, Dagger는 종속 항목 그래프를 자동으로 생성하고 관리하여 앱에서의 DI 사용을 용이하게 한다.
참고자료
Android의 종속 항목 삽입 | Android 개발자 | Android Developers
반응형