Clean Software/Dependency Injection

의존성 주입 (목차)

728x90
반응형

의존성주입은 일반적인 프로그래밍 영역에서 널리 알려진 기술이고 안드로이드 개발에도 잘 적용이 되는 기술입니다.

이 의존성 주입 원칙을 따르면 훌륭한 앱 아키텍처를 만들 수 있게 됩니다.

널리 알려진 장점으로는 코드간의 종속성을 없애기 때문에 재사용성이 높아지고 리팩토링과 테스트 편의성이 높다는 장점이 있습니다.

 

그럼 이렇게 무서운 두 단어, '의존성'과 '주입' 이라는 단어로 되어있는 의존성 주입의 정의와 필요성, 그리고 실제 구현 방법에 대하여 간단하게 알아보려 합니다.  

의존성 주입이란

먼저 의존성의 정의를 살펴봅시다.

 

보통 한 클래스(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 적용하기

  1. repository 패턴 이용
  2. factory 패턴 및 container 이용하기
  3. application 이용하기

2. Dagger로 DI 적용하기

  1. "hello world" 의존성 주입하기
  2. 모듈(@Module, @Provider)
  3. 컴포넌트(@Component)
  4. Lazy 주입과 Provider 주입
  5. 한정자 지정하기(@Named)
  6. 범위 지정하기(@Singleton, @Reusable, @Scope)
  7. 바인딩의 종류(@Binds, @BindsOptionalOf, @BindsInstance) 
  8. 멀티바인딩 사용하기 (Set, Map..)
  9. 컴포넌트 간의 의존 관계

3. Hilt로 DI 적용하기

  1. gradle파일 종속성 적용
  2. Hilt application 클래스 적용 (@HiltAndroidApp)
  3. 다양한 Android 클래스들에 DI 삽입 (@AndroidEntryPoint, @HiltViewModel 등)
  4. Hilt 바인딩 적용 (@Inject)
  5. Hilt module 적용(@module  @Binds, @Provides)

 

4. 다중모듈 앱에서 DI 사용하기

feature 모듈에서의 Hilt

 

 

 

참고 : https://developer.android.com/training/dependency-injection?hl=ko

728x90
반응형