땀이 삐질삐질 나는 개발 일기

DI(Dependency Injection)이란? 맛만 이라도 보자! 본문

개발 Tip

DI(Dependency Injection)이란? 맛만 이라도 보자!

삐질 2020. 6. 3. 12:08

 

안녕하세요. 개발자 삐질 입니다.

 

오늘은 Dependency Injection의 개념에 대해 간략하게 설명하겠습니다.

 

(정말 간략함 )

 

 

안드로이드 개발자기에 DI를 지원해주는 라이브러리로 Dagger / Koin을 사용할 수 있지만

 

오늘은 그런 모듈에 대한 사용보다는 세간에서 하도 DI DI DI DI 하니까 뭔지 맛만 보시라고 ..

 

 

한마디로 , 회사가 있다면 그 회사가 안드로이드 포지션이 있다면,

 

제가 그 개발자로 입사하던 , 이 글을 읽고계시는 분이 입사를 하던

 

동일하게 '개발'을 하면 된다 쯤?? 너무 추상적이죠? 코드로 한번 설명 해 보겠습니다.

 

 

 

예를들면 저는 T클래스에서 Sorting 작업을 하고 싶습니다.

 

그러나 Sorting은 Quick ,Bubble ~~ 여러가지가 있을 수 있고, 수행하던 소팅로직은 언제든지 다른 소팅으로 교체할 수 있습니다.

 

이러한 조건일때 우리가 기본적으로 필요한 곳에서 new를 사용해 수행하려면, 아래와 같이 작성할 수 있습니다.

 

(코드 간략화기 때문에 정확한 문법은 생략 합니다)

 

(사수의 코드를 인용)

class T () {
    //소팅 클래스를 이용해
    fun targetFunc(){
        ASort a = new Asort()
        //BSort b = new BSort()
        a.sort()
        //b.sort() 
    }

}

class ASort implement ISort{
    fun sort()
}

class BSort implement ISort{
    fun sort()
}

 

targetFunc가 ASort를 수행해야할땐 Asort 를 만들어서 a.sort()를 수행할 수 있도록 코드를 작성해야하고

 

아니다, B로 하자 싶다면 , B를 생성해서 b.sort를 수행할 수 있도록 코드를 재작성 해야 합니다.

 

그렇지만 이렇게 직접적으로 중요한 부위의 펑션을 자꾸 수정하게 되다 보면 내가 예상치 못한 다른 엮여 있는 곳에 영향을 줄 수도 있습니다. 동적으로 테스트를 해볼 수 가 없죠.

 

그렇지만 인젝션을 통해 주입을 하게 된다면 아래와 같이 수정 해 볼수 있습니다.

 


class T (Isort object) {
    //소팅 클래스를 이용해
    fun targetFunc(){
        
        object.sort()
        
    }

}

class ASort implement ISort{
    fun sort()
}

class BSort implement ISort{
    fun sort()
}

class InjectionModule(){
    //외부 객체생성 모듈
    val ASort a = new Asort()
    val BSort b = new Bsort()
            
    T = new T (ASort);
    T = new T(BSort);
    
}

 

위와 같이 InjectionModule(외부에 객체생성을 담당하는 하나의 모듈공간) 에서 필요한 객체 또는 대체 될 객체들을 생성하고 T에 바꿔 주입하게되면 T는 나에게 주입되는 객체가 ASort , BSort 인지 몰라도 어쩃든 두놈다 Interface로 fun sort()라는 것을 구현하고 있기 떄문에 , T입장에서는 받은 객체로 object.sort()만 호출하게 되면 되죠.

 

그렇게 되면 T의 메인 로직은 전혀 수정할 게 없게 됩니다.

 

 

 

이로써 메인 로직에 의해서 T가 바뀌어야하는 결합도가 낮아지고

 

테스트 코드를 작성할 때 , 내가 원하는 어떤 로직을 쓰던, 최소한의 펑션 인터페이스(ex, ISort)만 구현해준다면

 

구현 내용부는 달라지던 같던 상관없게되니까 어떤 객체던 주입해서 원하는 결과를 테스트 해 볼수 있습니다.

 

가장 중요한 포인트는 ,

 

T클래스의 내용을 절대 변경하고 싶지 않다 !!   에요. (하다보면 어쩔 수 없이 변경될 수 있겠지만.. 이건 다음번 설명으로..
라이브러리에서 Deprecated시키는 이유 중 하나)

 

 

이떄문에 , 안드로이드 구조로 예를 들자면

 

VC (뷰 컨트롤러 ) ⇒ Model에 디펜던시가 강하게 걸리던 부분이 외부에서 주입해 주기 때문에 VC / M과의 결합도가 낮아지게 되는 것 입니다.

 

 

 

다만, DI의 장점은 강력하게는

 

  • 테스트가 용이함
  • 재사용성이 우수함

 

등이 있지만,

 

단점으로는

 

  • 일단 클래스 복잡도 , 프로젝트 복잡도가 상당하게 증가
  • 일관되게 이 패턴의 Rule을 지키는 것이 매우어렵고, 이 Rule을 지키기 위해 난잡해 질 가능성이 다분함
  • 테스트 코드, 재사용을 위해 기초 설계를 매우 탄탄하게 해야 하기 때문에 상대적으로 개발의 비용이 큼

 

등이 있습니다.

 

둘다 스스로에게 허락 된 상황에 맞게 사용하면 장단을 잘 이용할 수 있을거라 생각합니다.

 

 

 

초급 안드로이드 개발자를 위한 카카오톡 오픈 채팅방을 운영 중 입니다.

 

(저는 마냥 친절한 방장은 아닙니다. 다만, 다 같이 성장하고 싶은 방장이며 개발자 입니다)

 

https://open.kakao.com/o/gn4xqQ6open.kakao.com/o/gH0XvThcopen.kakao.com/o/gH0XvThc

Comments