의존성 주입(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 |