의존성 주입(DI) 는 안드로이드 뿐만 아니라, 객체지향 프로그래밍을 할 때 한번쯤 듣는 단어입니다.

의존성이란

하나의 객체가 동작함에 있어서 다른 객체를 반드시 필요로 하는 경우를 말합니다.

A 클래스에서 B클래스를 반드시 필요로 한다. 즉, B클래스가 없으면 A클래스는 동작하지 않는다.

이런 경우 A클래스는 B클래스에 의존하고 있다. 라고 보면 될 것 같습니다.

의존성 주입(DI) 란,

의존성을 갖는 객체가 있다면, 그 객체가 의존하고 있는 객체를 외부에서 주입해주는 것입니다.

 

DI 를 사용하는 이유

지금부터 상황을 토대로 DI 를 사용하는 이유에 대해서 시작하겠습니다.

이 상황은 DI 설명을 위해 지어낸 상황입니다. (현실성에서 굉장히 떨어질 수 있습니다.)

 

Chapter1. 처음엔 1개 뿐이였어

요청 : 안드로이드 앱 개발자를 구하고 있습니다. 이 개발자는 AndroidStudio 를 사용해서 앱을 개발해야 합니다.
답변 : 안드로이드 개발자 클래스를 전달드리겠습니다. 필요하실 때마다 해당 클래스를 생성하시면, 안드로이드 앱 개발자를 얻게 되실겁니다.
class AndroidDeveloper {
  AndroidStudio androidStudio;
  
  AndroidDeveloper() {
  	androidStudio = new AndroidStudio();
  }

  void createAppAOS() {
  	androidStudio.createApp();
  }
}

Chapter2. 비슷하지만, 새로 만들면 돼

요청 : 저번에 안드로이드 개발자클래스를 잘 쓰고있습니다. 근데 이번엔 iOS 앱 개발자를 구하고 있습니다. iOS 앱 개발자는 Swift 를 사용해야 합니다.
답변 : iOS 개발자 클래스를 전달드리겠습니다... 역시 필요하실 때마다 해당 클래스를 생성하시면 됩니다.
class iOSDeveloper {
  xCode xCode;
  
  iOSDeveloper() {
  	xCode = new xCode();
  }

  void createAppiOS() {
  	xCode.createApp();
  }
}

Chapter3. 안좋은 예감이 들어

요청 : iOS 개발자가 그만두었습니다. 이참에 그냥 안드로이드 개발자가 iOS 개발도 할 수 있게 만들어주면 안되나요?
답변 : 네 알겠습니다... ㅂㄷㅂㄷ 수정해드릴게요
class AndroidDeveloper {
  AndroidStudio androidStudio;
  xCode xCode;
  
  AndroidDeveloper() {
  	androidStudio = new AndroidStudio();
  	xCode = new xCode();
  }

  void createAppAOS() {
  	androidStudio.createApp();
  }

  void createAppiOS() {
  	xCode.createApp();
  }
}

Chapter4. 이럴줄 알았어

질문 : 이거 혹시 그전 iOS 개발자 클래스도 그대로 쓸 수 있는거 맞죠?
답변 : 네 맞습니다...
요청 : 그냥 안드로이드 개발자, iOS 개발자, 두개 다 가능한 개발자 세개로 만들어주세요.
답변: 예예...
class AndroidDeveloper {
  AndroidStudio androidStudio;
  AndroidDeveloper() {
  	androidStudio = new AndroidStudio();
  }

  void createAppAOS() {
  	androidStudio.createApp();
  }
}

class iOSDeveloper {
  xCode xCode;
  iOSDeveloper() {
  	xCode = new xCode();
  }

  void createApp() {
  	xCode.createApp();
  }
}

class AppDeveloper {
  AndroidStudio androidStudio;
  xCode xCode;
  AppDeveloper() {
  	androidStudio = new AndroidStudio();
  	xCode = new xCode();
  }

  void createAppAOS() {
  	androidStudio.createApp();
  }

  void createAppiOS() {
  	xCode.createApp();
  }
}

Chapter5. 그렇게 1개에서 100개까지 늘어났지

요청 : 이번엔 Spring..
요청 : 이번엔 ~~~~~

...

요청 : 이번엔 풀스택~~

 

Chapter6. 절망의 순간

요청 : 보니까 개발자가 사용하는 툴을 생성하더라구요? 그 툴에서 사용하는 언어도 선택할 수 있게 해주세요.
답변 : 그러니까.. 이런식으로요?
class AndroidStudio {
Language language;
  AndroidStudio(Language language) {
  	this.language = language;
  }
  void createApp() {
	//...
  }
}
요청 : 어 맞아요. 그런데 어라... 이전에 제공해주신 코드들이 모두 에러가 나요

 

Chapter7. 회고의 순간

아.... 이거 사용하고 있는 코드들 다 찾아서 다 고쳐줘야하네...

 

이게 다 개발자 생성하는 클래스마다 싹다 툴 클래스에 의존하고있어서그래!!

애초에  개발자 클래스를 생성할 때 툴을 전달받게 했으면, 개발자 클래스를 생성하는 부분에서만 고치면 편할텐데 하............

 

다음에는 이런 부분은 진짜 고려해서 작성해야겠다!!

 

 

Chapter8. 이런 상황을 겪은 나에게 필요한 건 뭐다!?

"Constructor injection" , 바로 생성자 주입이라는 것이다!!!


 

Chapter9. 근데.. 만약에 생성자를 직접 안넣고  그냥 set 으로 전달받으면 어쩌지?

class AndroidDeveloper {
  AndroidStudio androidStudio;
  AndroidDeveloper(String lang) {
  	androidStudio = new AndroidStudio();
  	androidStudio.setLanguage(lang);
  }
  void createAppAOS() {
  	androidStudio.createApp();
  }
}

 

이렇게 AndroidStudio 객체가 언어를 필요로 하는데, 이 언어를 setLanguage 처럼 직접 넣어주는 경우를

"Filed injection" , 바로 필드 주입 이라고 한다.

 

 

 


의존성 주입의 장점

  • Unit Test가 용이해진다.
  • 코드의 재활용성이 높아진다.
  • 객체 간의 의존성(종속성)을 줄이거나 없앨 수 있다.
  • 객체 간의 결합를 낮추기 때문에 유연하게 코드를 작성하며, 유지보수가 쉬워진다.
  • 보일러 플레이크 코드가 줄어든다.

위 예시에서는 의존성 주입의 장점들을 모두 담아내지 못했습니다. (ex. TestCode , 재활용성 등 )

결국 클린하게 코드를 작성하기 위하여, 객체지향을 객체지향답게 작성하기 위하여

 

"의존성 주입" 은 선택이 아니라, 필수입니다.

 

아마 DI 를 도와주는 라이브러리를 사용하지 않아서, DI 를 모른다. 적용해본적 없다. 라고 생각하시는 분들이 계실지도 모르겠습니다.

그러나, DI 는 꼭 라이브러리가 있어야만 하는 것이 아닙니다. 여러분은 알게 모르게 사용하셨을 수도 있습니다. ( 의존성 주입만을 담당하는 Class 를 따로 둔다거나 하는 것까지 아니더라도)

겁먹지 말고, 클린코드를 위하여 편안한 유지보수로 미래의 "자신"이 더 행복하기 위하여 이제는 시작해봅시다.

 

'BackUp (관리중지) > CS 학습' 카테고리의 다른 글

개발자 기초지식 [ 내용요약 ]  (0) 2022.11.12
REST API  (0) 2021.04.28
Java GC  (0) 2021.04.28
GC ( Garbage Collection )  (0) 2021.04.28
동시성 이슈  (0) 2021.04.27

+ Recent posts