[DI] Inversion Of Control Container 란?

Clint Jang
5 min readFeb 22, 2019

--

DI (Dependency Injection) 의 핵심 개념인 IOC Container에 대해 간단한 메모를 해보겠습니다.

IOC는 직역해 보면 제어의 반전, 제어의 역전을 의미하죠.

기존의 모든 제어를 클라이언트 코드가 가지도록 구현 하던 것에서

기존 구조적 설계와 비교해 프레임워크(Container)가 제어를 나누어 가져가되되어 의존 관계가 방향이 달라지게 되는 것제어가 반전,역전 되었다 라고 합니다.

가볍게 알아볼까요?

IOC Conatainer

IOC (Inversion of Control) 를 구현하는 프레임워크로 객체를 관리하고, 객체의 생성을 책임지고, 의존성을 관리하는 컨테이너 입니다.

모든 의존성을 컨테이터(Container)를 통해서 받아오게 되니 실수로 서로 다르게 구현이 되지 않게 되겠죠?

예를 들어볼께요.

이해하는 방법에는 역시 그림이 좋은 것 같습니다.

단순한 예시입니다. 가볍게 봐주세요.

  • 배경이 되는 내용입니다.
서비스 개발팀이 있습니다.
이 팀은 모바일 개발 파트와 웹프론트 개발 파트를 관리하는 팀입니다.
서비스 개발팀은 현재 5명입니다.
팀장 : 모바일과 프론트 업무를 받아와서 모바일, 프론트 업무에 따라 담당자에게 업무를 분배합니다.
모바일 업무 담당 : 모바일 개발자 A, 모바일 개발자 B,웹 프론트 업무 담당 : 프론트 개발자 1, 프론트 개발자 2모바일 개발자와 프론트 개발자는 채용하면 계속 늘어날 수 있죠.
그리고 모바일과 프론트 개발 업무는 각각 다르겠죠.

기본 보통의 설계라면

개발팀장이 개발업무들을 받아오면 파트에 맞는 개발자 객체를 생성해서 업무를 할당했겠죠. 각 개발자들이 개발업무를 알아서 하겠죠.

IOC Container 방식으로 사용하는 방식이라면

DI를 구현 한다면 이런 그림이 그려질 것 같고…

IOC 컨테이너는 이렇게 그려볼 수 있을 것 같습니다.

외부에서 객체를 생성해서 주입하는 모습이죠?

서비스 개발팀 팀장이 업무를 받아오면,

개발 업무 기능이 있는 인터페이스를 모바일 개발자, 프론트 개발자 클래스에서 플로그인 합니다.

서비스 개발팀 프레임워크에서는 생성할 때 혹은 관련 값을 셋팅할 Setter에 개발 업무 기능이 있는 인터페이스가 있는 객체를 받도록 합니다.

그리고 인터페이스에 정의되어 플로그인 된 “개발” 업무를 지시하며, 팀장이 제어할 수 있습니다.

생각해본 부분

컨테이너가 스스로 프로그인 을 찾는 개념입니다.

컨테이너가 큰그림.. 설계도를 작성해놓은 인터페이스라고 생각이 드네요.

객체가 직접 인스턴트를 연결해주면 인터페이스가 알아서 등록된 함수들을 프로그인.. 주입해주는 개념이죠.

인터페이스의 연관성이 있는 인스턴스를 연결시킨 객체를 사용함으로써 자동으로 연관성이 생기셔서 디펜던시를 주입한다는 의미가 되어 DI의 핵심 개념이라 생각됩니다.

결론

  • 위키 내용입니다. 😀

제어 반전, 제어의 반전, 역제어는 프로그래머가 작성한 프로그램이 재사용 라이브러리의 흐름 제어를 받게 되는 소프트웨어 디자인 패턴을 말합니다.

줄여서 IoC(Inversion of Control)이라고 부릅니다.

전통적인 프로그래밍에서 흐름은 프로그래머가 작성한 프로그램이 외부 라이브러리의 코드를 호출해 이용합니다.

하지만 제어 반전이 적용된 구조에서는 외부 라이브러리의 코드가 프로그래머가 작성한 코드를 호출합니다.

설계 목적상 제어 반전의 목적은 다음과 같습니다:

  • 작업을 구현하는 방식과 작업 수행 자체를 분리합니다.
  • 모듈을 제작할 때, 모듈과 외부 프로그램의 결합에 대해 고민할 필요 없이 모듈의 목적에 집중할 수 있습니다.
  • 다른 시스템이 어떻게 동작할지에 대해 고민할 필요 없이, 미리 정해진 협약대로만 동작하게 하면 됩니다.
  • 모듈을 바꾸어도 다른 시스템에 부작용을 일으키지 않습니다.

좋은 링크

좋은 설명이 있는 동영상 링크입니다.

멋진지인에게 이 동영상을 추천받아 보고.. 감명받아 😍

정리해보며 미디엄에 글을 적었습니다.

잘못된 내용이 있으면 수정하겠습니다.

(좀 더 수정이 필요할 것 같아요)

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

--

--

Responses (1)