막무가내 삽질 블로그

Dependency Injection 본문

Android

Dependency Injection

joong~ 2020. 7. 25. 21:34
728x90

안드로이드에서 DI(Koin)을 사용하기 위해 DI를 공부 중이다.

 

DI 란 무엇인가?

Dependency Injection 이다. 

한 단어씩 해석 하면 Dependency는 의존,의존성이란 뜻을 가지고 있고 Injection은 주입이라는 뜻을 가지고 있다.

의존성 + 주입 = DI

 

Dependency(의존성)이란?

만약 내가 서울에서 부산까지 간다고 가정하면 자동차나 비행기 등 교통수단에 의존하게 된다.

프로그래밍적으로 보면

class Apple {
    var num: Int = 1
}

class Banana {
    val apple = Apple()
    print(apple.num)
}

Banana 클래스 내부에서 Apple 클래스를 참조하고 있다. 이럴 경우 Banana 클래스 -> Apple 클래스 의존성을 갖는다고 볼 수 있다. 즉, Banana클래스는 Apple클래스를 의존하고 있다!

 

 

Dependency의 위험성

만약 Apple 클래스의 변수명 수정, 생성자 추가 등...무언가 바뀌게 된다면 Apple를 의존하고 있는 모든 클래스를 찾아가서 수정해줘야 한다.

100개가 Apple를 의존하고 있다면?, 1000개면?....끔직하다

또한 테스트코드 작성시 의존성이 있으면 어려움이 있다. 유닛테스트의 목적 자체가 다른 모듈로부터 독립적인지 테스트를 하기 위함이기 때문이다

 

 

 

Injection(주입)이란?

내부가 아니라 외부에서 생성후 넣어주는 것을 주입이라고 한다.

class Apple(private val mango: Mango) {
    var num: Int? = null

    fun test(a: Int) {
        this.num = a
    }
}

class Banana {
    val apple = Apple(Mango())
    apple.test(4)
}

class Mango {

}

 

의존성 + 주입 = DI ?

객체를 만들어 외부에서 주입하는 것 만으로 DI(의존성 주입)라고 하지 않는다.

DI는 의존성을 분리시켜 사용한다.

https://ko.wikipedia.org/wiki/%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84_%EC%97%AD%EC%A0%84_%EC%9B%90%EC%B9%99

 

의존관계 역전 원칙 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 객체 지향 프로그래밍에서 의존관계 역전 원칙은 소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다. 이 원칙을 따르면, 상위 계층(정책 결정)이 하위 계층(�

ko.wikipedia.org

 

객체 지향 프로그래밍에서 의존관계 역전 원칙은 소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다. 이 원칙을 따르면, 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다.

 

방법은 인터페이스를 활용하면 된다.

 

 

DI를 사용하는 이유는 뭘까?

1. 코드의 재사용성

2. 리팩토링의 용이성

3. 테스트의 용이성

4. 객체 생성과 사용의 분리성(A객체가 문제 발생 시 B객체에 미치는 영향을 방지 할 수 있다)

등이 있다.

 

 

 

Koin 이란?

코틀린을 위한 DI 라이브러리 이다. 자세한 내용은 

https://start.insert-koin.io/#/introduction

 

Koin - a pragmatic lightweight dependency injection framework for Kotlin

 

start.insert-koin.io

 

 

'Android' 카테고리의 다른 글

RxJava 1주차  (4) 2020.08.30
RecyclerView Pagination  (0) 2020.08.27
안드로이드 Crashlytics 추가하기  (0) 2020.07.02
안드로이드 스터디 모집  (0) 2020.07.02
room, shared preference 시각화로 보는 법  (0) 2020.05.26
Comments