[DI] Dependency Injection 이란?

Clint Jang
5 min readMar 21, 2019

--

디펜던시 인젝션, 의존성 주입에 대해 간단하게 작성해 봅니다.

DI에 대해 아는 것 같지만, 역시 설명을 하라면 뭘 말해야되지???

잘 설명하고 싶은 욕심에 한마디도 못할 것 같습니다.

제가 DI를 누군가에게 설명한다면? 이렇게 할 것 같다..

쉽게 이해될 수 있도록, 공부 하면서 메모해 봤습니다.

Dependency Injection 이란?

표준을 정의 할 수 있고, 정의된 표준을 바탕으로 같은 설계를 하게 하여줍니다.

장점이 많지요?

  1. 재사용성을 높여줍니다.
  2. 테스트에 용이하죠.
  3. 코드도 단순화 시켜줍니다.
  4. 종속적이던 코드의 수도 줄여줍니다.
  5. 왜 사용하는 지 파악하기가 수월합니다. 코드를 읽기 쉬워지는 점이 있습니다.
  6. 종속성이 감소합니다. 구성 요소의 종속성이 감소하면, 변경에 민감하지 않습니다.
  7. 결합도(coupling)는 낮추면서 유연성과 확장성은 향상시킬 수 있습니다.
  8. 객체간의 의존관계를 설정할 수 있습니다.
  9. 객체간의 의존관계를 없애거나 줄일 수 있습니다.
  10. ..

다양한 장점이 있는 DI를 처음 접하신다면..

의존성 주입 이 용어부터 이해하면 좋을 것 같습니다.

  1. 의존성 (미설명)
  2. 주입 (미설명)

두가지 용어를 우선 이해해 보겠습니다.

(소스의 언어는 iOS의 swift 입니다.)

의존성은?

의존 관계를 가지는 상황에 대한 이해를 하시면 될 것 같습니다.

위에 그럼 처럼 B 클래스에서

A 클래스를 내부에 변수로 사용하게 됨으로써

B 클래스는 A 클래스에 의존관계가 생기게 됩니다.

주입은?

내부가 아니라 외부에서 객체를 생성해서 넣어주는 것을 주입한다고 합니다.

Int(3), Int(5) 를 외부에서 생성해서 함수를 통해 넣어주고 있지요?

이렇게 객체를 외부에서 넣어주는 것을 주입한다고 합니다.

그럼

의존성 + 주입을 합쳐보면?

내부에서 만든 변수를 외부에서 넣어주게 하면 됩니다.

저는 클래스 생성에서 주입을 했지만, 함수를 이용해서 외부에서 넣든지,,

외부에서 넣어주는 상황이지요.

의존성 있는 클래스의 오브젝트를 외부에서 넣어주네요.

그런데 .. 의존성을 주입하는 것만으로 DI(의존성 주입) 이라고 하지는 않습니다.

여기서 용어하는 더 추가하겠습니다.

의존성 분리 입니다.

  1. 의존성 (설명 완)
  2. 주입 (설명 완)
  3. 의존성 분리 (미설명)

의존성 분리란?

앞에서는 단순하게 의존성 주입의 용어만 이해해보려고 확인하였던 것입니다.

DI(의존성 주입)는 의존성을 분리시켜 사용합니다.

그럼 의존성 분리는 어떻게 시킬까요?

의존성 분리를 의존관계 역전의 원칙?으로 의존관계를 분리시킵니다.

아래는 위키의 링크입니다.

위의 소스처럼 일반적인 상황인

상위계층이 하위계층에 의존하게 되는 상황에서..

을 반전시켜서 하위 계층의 구현으로 부터 독립하게 됩니다.

방법은 간단합니다. Interface를 사용하는 것이지요.

iOS에서는 protocol을 이용합니다.

이렇게 의존관계가 독립되는 상황입니다.

만약 위의 Interface(Protocol)에서 number 정의가 없다면…

에러가 나겠지요? 제어의 주체가 Interface(Protocol)에게 있습니다.

Interface(Protocol) 만 파악하면, 분석이 수월하겠군요.

의존관계 역전이라고 하면서

구조적 설계와 비교할 때 의존의 방향이 역전 되었다라고 하며,

의존의 전이를 끊었다라고하며..

이렇게 제어가 반전 되는 상황을 아래의 용어로 이야기 하지요.

IOC 라는 용어입니다.

IOCInversion Of Control 의 약어이며, 이렇게 제어의 주제가 역전 되는 패턴입니다.

이제 용어는 의존성 분리를 설명하면서 IOC까지 설명드렸습니다.

용어

  1. 의존성 (설명 완)
  2. 주입 (설명 완)
  3. 의존성 분리 (설명 완)
  4. 제어의 반전 : IOC (Inversion Of Control) (설명 완)

마지막으로 IOC Container 를 설명드리겠습니다.

IOC Container 란?

위의 IOC를 구현하는 프레임워크가 컨테이너입니다.

제어권을 컨테이너(프레임워크)가 가져가는 것이죠.

컨테이너(프레임워크)로 객체를 관리하고 객체의 생성을 책임지고, 의존성을 관리합니다.

컨테이너(프레임워크) 안에서 프로그래밍을 하는 상상을???

예전에 제가 작성해둔 링크로 IOC Container 설명은 마칠까 합니다.

IOC Container 를 모두 구현해서 개발하기엔

실제 프로젝트에서 힘이 들수 있습니다. 그래서 외부에서 DI를 구현한 라이브러리 를 많이 이용하는 것 같습니다.

(부족한 내용은 계속 보완하겠습니다)

즐거운 하루 되세요 :) 🙇‍

--

--