디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[의존성 관리] IoC, DIP, DI, Ioc Container에 대해

MrWon갤로그로 이동합니다. 2021.01.29 22:40:11
조회 180 추천 3 댓글 5
														

- 의존성과 관련해서 글을 찾아보면 Ioc, DIP, DI, Ioc Container란 용어가 나온다. 언뜻 보면 다 비슷해보이는 용어라 헷갈려보인다. 그래서 한 사이트의 도움을 빌려 정리해보기로 했다.

■ 용어 정리

- IoC : Inversion of Control (제어 역전)

- DIP : Dependency Inversion Principle (의존 역전 원칙),

- DI : Dependency Injection (의존성 주입)

- Ioc : Ioc Container

■ 분류


설계 원칙

IoC (Inversion of Control)

DIP (Dependency Inversion Principle)

디자인 패턴

DI (Dependency Injection)

프레임워크

Ioc Container

- IoC랑 DIP는 설계 원칙(Design Principle)에 해당되고 DI는 디자인 패턴(Design Pattern), IoC는 프레임워크에 해당된다.

- Design Principle과 " Pattern은 언뜻 보기에 헷갈려보인다.

Design Principle은 하이레벨 차원에서 프로그램을 더 좋게 설계하기 위한 가이드라인이고, 그렇기에 Design Principle은 구현 방법을 제공하진 않고 어느 언어에도 종속되지 않는다. 잘 알려진 예로는 객체지향 설계 5대 원칙이라 불리는 SOLID 원칙이 대표적이다.

반면 Design Pattern은 로우레벨 차원에서 객체지향을 구현하는 데 일반적으로 발생하는 문제를 해결하기 위한 방법이다. 대표적인 예로는 싱글톤 패턴, 팩토리 패턴, 커맨드 패턴이 있다.

■ IoC

- IoC(제어 역전 : Inversion of Control)는 객체지향 설계에서 클래스 간 의존성을 줄이기 위해 제어를 역전시키는 데 사용하는 설계원칙이다. 여기서 제어란 한 클래스가 가진 주요 책임 외에 가진 다른 부가적인 책임을 이르는 말로, 이 뜻은 프로그램의 흐름에 관한 제어나 객체 생성과 의존 객체 생성 및 연결에 관한 제어도 포함된다.

- IoC는 제어를 역전시키기 위한 방법론이다. 비전문가의 말을 빌려 설명해보자면 이렇다. 한번 예를 들어 당신이 차를 타고 직장으로 간다고 해보자. 여기에서 당신은 차에 대한 제어를 가지고 있으며 IoC는 이 상황에서 제어를 역전시키라고 제안한다. 당신이 직접 차를 모는 대신, 기사를 고용해 기사가 제어를 가지도록 하는 것이다. 이것이 바로 제어 역전이다. 이러면 당신은 차를 직접 몰지 않고 기사에게 시켜서 당신의 본래 일에 집중할 수 있게 된다.

이런 식으로 IoC 설계 원칙을 적용하면 클래스 간 의존성을 줄여서 프로젝트를 테스트하고 관리하고 확장하는 데 용이하게 될 것이다.

■ DIP

- DIP는 객체지향 5대 원칙이라 불리는 SOLID 원칙 중 하나인 '설계 역전 원칙'으로 그 내용은 다음과 같다.

- 1. 하이 레벨에 있는 모듈은 로우 레벨에 있는 모듈에 의존적이면 안된다. 둘 모두 추상에 의존적이여야 된다.

- 2. 추상은 구현에 의존적이면 안된다. 구현이 추상을 의존해야 한다.

- 간단하게 말하면 주 클래스가 부 클래스에 직접 의존하면 안되고 인터페이스와 같은 추상을 통해 의존해야 한다는 원칙이다. 멤버변수에 인터페이스를 두거나 인자로 인터페이스를 받는 것이 이 원칙을 따르는 한 예일 것이다.

■ DI (의존성 주입)

- DI는 IoC를 구현하기 위해 사용되는 디자인 패턴으로 클래스 밖에서 의존 객체를 생성하고 여러 방법으로 의존 객체를 연결하는 패턴이다. 이 패턴을 사용하면 의존 객체의 생성과 연결을 클래스 바깥으로 옮길 수 있다.

- DI 패턴에서는 세 종류의 클래스가 정의된다 : Client 클래스, Serice 클래스, Injector 클래스. Client 클래스는 Service 객체를 사용하는 클래스로 Service 클래스에 의존한다. Injector 클래스는 이 Service 객체를 Client 클래스에 주입하는 역할을 한다.

- Injector 클래스가 의존성을 주입하는 방법에는 크게 세가지가 있다. 생성자 주입, 속성 주입, 메소드 주입. 모두 Client의 무언가를 통해 Service 객체를 주입하는데 생성자 주입은 생성자를 통해, 속성 주입은 속성을 통해, 메소드 주입은 메소드를 통해 주입한다.

- 의존성 주입의 예를 들자면 JAVA나 C#의 Stream 클래스와 Reader 클래스의 관계를 예로 들 수 있다. 보통 Reader 클래스를 만들 때 var Reader = new TextReader(fileStream)과 같이 하는데 이는 생성자 주입에 해당하는 예로 Stream은 데이터를 전달하는 것에만 제어를 갖고 Reader는 이를 통해 전달된 데이터를 읽는 것에만 제어를 가짐으로써 제어 역전 원칙을 지키고 5대 원칙 중 단일 책임 원칙도 지킬 수가 있게 된다.

■ IoC Container

- IoC 컨테이너는 의존성 주입을 자동으로 하기 위한 프레임워크로 객체 생성과 수명, 의존성 주입을 관리한다. 여기서 IoC 컨테이너는 객체를 생성하고 모든 의존 객체를 생성자나 프로퍼티, 또는 메소드를 통해 런타임에 넘겨주고 떄가 되면 해제하며 이를 통해 우리가 직접 객체를 만들고 관리하지 않을 수가 있다.

- 모든 IoC 컨테이너는 다음과 같은 동작을 제공한다.

- 1. Register : 컨테이너는 반드시 지정된 타입의 객체를 생성할려고 한다면 어떤 의존성이 있는지 통보받아야 한다.이 과정을 등록(Registration)이라 부르며, 기본적으로 타입과 의존 타입을 연결하는 방법을 컨테이너는 제공해야 한다.

- 2. Resolve : IoC 컨테이너를 사용할 때 객체를 직접 생성하진 않아도 된다. 컨테이너가 이 과정을 전담하며 이를 결합(?)(Resolution)이라고 한다. 컨테이너는 반드시 지정된 타입과 의존 타입을 결합해 생성하는 방법을 제공하며, 이는 정확히는 지정된 타입을 생성하고 필요한 의존성을 주입하고 객체를 반환하는 방법이다.

- 3. Dispose : 컨테이너는 반드시 의존 객체의 수명을 관리한다. 대부분의 IoC 컨테이너는 여러 수명 관리 객체를 통해 의존 객체의 수명을 관리하고 해제한다.

- 아래의 리스트는 이런 IoC 컨테이너를 제공하는 .NET 패키지이다.

- Unity

- StructureMap

- Castle Windsor

- Ninject

- Autofac

- DryIoc

- Simple Injector

- Light Inject


■ 참조

- 위 내용은 아래의 링크에 있는 영문 블로그의 글을 참조해 만들어졌습니다.

- https://www.tutorialsteacher.com/ioc/ioc-container



추천 비추천

3

고정닉 2

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 연말 모임 가는 곳마다 가장 인싸일 것 같은 스타는? 운영자 25/12/08 - -
AD AI 가전 디지털 모음전 운영자 25/11/27 - -
공지 프로그래밍 갤러리 이용 안내 [98] 운영자 20.09.28 48892 65
2907827 인지과학조져라 손발이시립디다갤로그로 이동합니다. 16:34 11 0
2907826 개발자 자체를 안 좋게 보는 사람들도 많네 [5] 루도그담당(58.233) 16:24 50 0
2907825 나님 커피 2샷 먹고 그것이 솟구치시는중 [1] 헬마스터갤로그로 이동합니다. 15:29 22 0
2907824 병신들이 프로그래머 행세하고 다니다 위상이 많이 떨어졌지. 프갤러(211.235) 15:26 36 0
2907823 Building the PERFECT Linux PC with Linus 발명도둑잡기(118.216) 15:19 12 0
2907822 확실히 병신들이 프로그래머 행세할 수 있는 좋은 세상이긴 해 프갤러(211.235) 15:18 35 0
2907821 왜 전세계에서 한국, 미국, 대만 단 3곳만 반도체를 만들까? [1] 발명도둑잡기(118.216) 15:17 26 0
2907820 SES - Just A Feeling [1] 발명도둑잡기(118.216) 15:08 12 0
2907819 하드웨어 IT 기기 제조사가 소프트웨어를 오픈소스로 안 파는이유 발명도둑잡기(118.216) 14:56 23 0
2907818 개발자들 = 병신 GOAT [4] 프갤러(211.219) 14:46 51 0
2907817 사파리에서 안되면 크롬 쓰라 그래 프갤러(27.164) 14:31 20 0
2907816 [애니뉴스][과학 컬럼] 사람들은 왜 광속을 불변이라고 할까? ㅇㅇ(121.172) 14:24 13 0
2907815 버닝: 벤 (스티븐 연) 연기 "난 비닐하우스를 태우는 취미가 있어요." 발명도둑잡기(118.216) 14:20 13 0
2907814 비닐하우스 트랙 가서 뛰다가 왔다 [13] chironpractor갤로그로 이동합니다. 12:44 57 0
2907813 [연구주제] 저출산 배경 - 황혼이혼, 결혼 연령 증가 등등 ㅇㅇ(121.172) 12:21 13 0
2907811 연달아 터진 연예계 논란…정치 이슈 덮으려는 '작업'? [논/쟁] 발명도둑잡기(118.216) 11:05 15 0
2907810 미국 브라운 대학 총격 사건…사상자 10명 [지금뉴스] 발명도둑잡기(118.216) 11:04 22 0
2907809 [애니뉴스] 소설의 기본기 1 - 작가와 캐릭터는 동일하지 않다 (카제나 ㅇㅇ(121.172) 11:00 22 0
2907808 MacOs 에뮬레이숀 darling 개발 속도 느려진듯 발명도둑잡기(118.216) 10:49 18 0
2907807 MacOS 모양 흉내 발명도둑잡기(118.216) 10:31 21 0
2907806 난 웹 개발자는 맥북 필요 없다고 생각했는데 [9] ㅇㅇ갤로그로 이동합니다. 10:03 87 0
2907805 이러니까 노땡스 하지 프갤러(121.168) 10:02 43 1
2907804 온 세상이 하얀데..ㅇㅅㅇ [2] 헤르 미온느갤로그로 이동합니다. 09:09 35 0
2907803 공룡을 찾아보세요.. ㅇㅅㅇ [2] 헤르 미온느갤로그로 이동합니다. 08:41 35 1
2907802 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:38 16 0
2907801 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:36 36 0
2907799 요즘 구글, 네이버 검색 상태 메롱된 이유 야옹아저씨갤로그로 이동합니다. 07:37 34 0
2907797 여기가 그 최원종 배출 갤러리인가요? [3] ㅇㅇ갤로그로 이동합니다. 03:11 52 0
2907795 국산 좋소나 스타트업 안드로이드나 ios 채용시장 어떠냐 [2] 프갤러(211.114) 02:44 58 0
2907793 컴공 과목들로부터 배워야 하는 것들 [7] 박민준갤로그로 이동합니다. 01:39 75 3
2907791 join을 exist로 바꾸거나 그 반대로 했을때 [2] 슈퍼막코더(126.33) 00:08 58 0
2907790 일본인 연락속도 질문 [3] ㅈㅈ(211.216) 12.13 63 0
2907789 [애니뉴스] Worker Pool ㅇㅇ(121.172) 12.13 20 0
2907787 카톡프사 이렇게 했는데 혹시 십덕같아보여? [2] ㅁㅁㅅ갤로그로 이동합니다. 12.13 124 0
2907786 요즘은 사람 뽑을 때 보는게 다양해졌구나 [4] ㅇㅇ(211.234) 12.13 75 0
2907785 너네 김대기 아냐? [2] 프갤러(121.153) 12.13 71 0
2907784 솔직히 컴공은 예전부터 추천받는 학과는 아니었음 [4] 박민준갤로그로 이동합니다. 12.13 112 2
2907783 살릴 수 있을까요? 컴퓨터 수리 넥도리아(220.74) 12.13 92 0
2907781 개발에 학벌 중요함? 방통대 졸업해도 ㄱㅊ?? [2] ㅇㅇ(223.39) 12.13 74 0
2907779 요즘 컴공과 입결도 낮아지고 미래도 어두움 ㅇㅇ(183.106) 12.13 71 1
2907778 ai 있으면 어느정도까지 해봐야지 실력임? [1] 프갤러(58.76) 12.13 55 0
2907777 조국혁신당이 미래다 이기이기 타이밍뒷.통수한방(1.213) 12.13 25 0
2907776 이재명 대통령이 미제의 하수인인 지배-예속 관계 발명도둑잡기(118.216) 12.13 78 0
2907775 음기 충전 발명도둑잡기(118.216) 12.13 81 0
2907774 "적자 나도 1000원"… 고려대 명물 '영철버거' 이영철씨 별세 발명도둑잡기(118.216) 12.13 32 1
2907772 백엔드갤 특정 회사 몇명 친목질 [2] ㅇㅇ(182.210) 12.13 74 0
2907771 나는 수집가였고, 안양에 있는 학교의 비리를 캤다 [1] 넥도리아(220.74) 12.13 42 0
2907770 "엄마 전 재산 다 날렸다"…보이스피싱에 무너진 가족 발명도둑잡기(211.235) 12.13 31 0
2907769 프갤러랑 오프했다... [7] ^으^갤로그로 이동합니다. 12.13 77 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2