의존성주입은 일반적인 프로그래밍 영역에서 널리 알려진 기술이고 안드로이드 개발에도 잘 적용이 되는 기술입니다.
이 의존성 주입 원칙을 따르면 훌륭한 앱 아키텍처를 만들 수 있게 됩니다.
널리 알려진 장점으로는 코드간의 종속성을 없애기 때문에 재사용성이 높아지고 리팩토링과 테스트 편의성이 높다는 장점이 있습니다.
그럼 이렇게 무서운 두 단어, '의존성'과 '주입' 이라는 단어로 되어있는 의존성 주입의 정의와 필요성, 그리고 실제 구현 방법에 대하여 간단하게 알아보려 합니다.
의존성 주입이란
먼저 의존성의 정의를 살펴봅시다.
보통 한 클래스(viewmodel)가 다른 클래스(datasource) 객체를 사용할 때,
viewmodel클래스 내부에 사용하고자 하는 datasource클래스의 인스턴스를 생성해서 사용하게 됩니다.
viewmodel 클래스에서는 datasource 클래스 객체를 생성해서 데이터를 가져오기도 하고 저장하기도 하는 등 구현하게 되었는데 datasource 객체를 다른 객체로 변경하거나(데이터를 가져오고 내보내는 방법은 수도 없이 변한다) 업그레이드하고 싶은 경우 사용한 모든 부분을 다 수정해야 하는 불상사가 생기게 됩니다.
즉 viewmodel 클래스는 datasource 클래스 변경에 대하여 자유롭지 못하게 됩니다.
이렇게 한 클래스가 그 다른 클래스에 의존하고 있게되는 것 자체를 의존성을 갖는다라고 합니다.
viewmodel클래스 입장에서는 사용중인 datasource 클래스 자체를 '의존성'이라고도 볼 수 있게 되는 것이죠.
class Car {
private val engine = Engine()
fun start() {
engine.start()
}
}
fun main(args: Array) {
val car = Car()
car.start()
}
그럼 주입은 무엇일까요?
주입은 viewmodel 클래스의 생성자나 메서드/필드(setter)를 통해 사용하고자 하는 datasource 객체를 주입받는 것을 말합니다.
class Car(private val engine: Engine) {
fun start() {
engine.start()
}
}
fun main(args: Array) {
val engine = Engine()
val car = Car(engine)
car.start()
}
앞서 설명한 두 단어 의존성과 주입을 합쳐 의존성 주입을 설명해 보면
viewmodel 클래스는 의존 관계에 있는
datasource클래스(종속 항목)의 객체를
내부에서 생성해서 사용하는 것이 아니고
외부에서 생성한 후 주입받아 사용한다.
라고 할 수 있습니다.
기존에는 viewmodel 클래스에서 datasource 클래스의 객체를 생성하고 관리했으나,
생성자주입 혹은 객체 주입을 통해 의존성 주입을 하게 되어
두 클래스 간의 결합도를 약하게 만들었고
이제 viewmodel은 datasource 변경사항에 의해
내부 필드나 메서드 매개 변수를 변경하지 않아도 되었습니다.
그럼 이제부터는 안드로이드에서 의존성을 주입하는 방법을 알아봅시다
1. 수동으로 DI 적용하기
- repository 패턴 이용
- factory 패턴 및 container 이용하기
- application 이용하기
2. Dagger로 DI 적용하기
- "hello world" 의존성 주입하기
- 모듈(@Module, @Provider)
- 컴포넌트(@Component)
- Lazy 주입과 Provider 주입
- 한정자 지정하기(@Named)
- 범위 지정하기(@Singleton, @Reusable, @Scope)
- 바인딩의 종류(@Binds, @BindsOptionalOf, @BindsInstance)
- 멀티바인딩 사용하기 (Set, Map..)
- 컴포넌트 간의 의존 관계
3. Hilt로 DI 적용하기
- gradle파일 종속성 적용
- Hilt application 클래스 적용 (@HiltAndroidApp)
- 다양한 Android 클래스들에 DI 삽입 (@AndroidEntryPoint, @HiltViewModel 등)
- Hilt 바인딩 적용 (@Inject)
- Hilt module 적용(@module @Binds, @Provides)
4. 다중모듈 앱에서 DI 사용하기
feature 모듈에서의 Hilt
참고 : https://developer.android.com/training/dependency-injection?hl=ko
'Clean Software > Dependency Injection' 카테고리의 다른 글
3. Android 에서 Dagger로 DI 적용하기 (0) | 2023.04.27 |
---|---|
2. Dagger로 DI 적용하기 (0) | 2023.04.27 |
1. Android에서 수동으로 DI 적용하기 (0) | 2023.04.27 |
의존성 주입 방법 (생성자 주입, 서비스 로케이터, Dagger) (0) | 2021.05.17 |