소개
소프트웨어 엔지니어링에서 종속성 주입 은 한 개체 (또는 정적 메서드)가 다른 개체의 종속성을 제공하는 기술입니다. 종속성은 사용할 수있는 개체 (서비스)입니다.그것은 위키피디아의 정의이지만 여전히 이해하기 쉽지는 않습니다. 그러니 더 잘 이해합시다.
프로그래밍에서 그것이 의미하는 바를 이해하기 전에 개념을 더 잘 이해하는 데 도움이 될 것이므로 일반적으로 의미하는 바를 먼저 살펴 보겠습니다.
의존성 또는 의존성은 지원을 위해 무언가에 의존하는 것을 의미합니다. 마치 휴대 전화에 너무 많이 의존한다고 말하면 휴대 전화에 의존한다는 의미보다 훨씬 더 많이 의존합니다.
따라서 종속성 주입에 들어가기 전에 먼저 프로그래밍에서 종속성이 무엇을 의미하는지 이해합시다.
클래스 A가 클래스 B의 일부 기능을 사용할 때 클래스 A는 클래스 B의 종속성을 갖는다 고합니다.

Java에서는 다른 클래스의 메서드를 사용하기 전에 먼저 해당 클래스의 객체를 만들어야합니다 (즉, 클래스 A는 클래스 B의 인스턴스를 만들어야 함).
따라서 객체를 생성하는 작업을 다른 사람에게 전달하고 종속성을 직접 사용하는 것을 종속성 주입이라고합니다.

종속성 주입을 사용해야하는 이유는 무엇입니까?
바퀴, 엔진 등과 같은 다양한 개체를 포함하는 자동차 클래스가 있다고 가정 해 보겠습니다.
여기서 car 클래스는 모든 종속성 개체를 생성합니다. 이제 앞으로 MRFWheels 를 버리고 Yokohama Wheels 를 사용 하기로 결정하면 어떻게 될까요?
새로운 Yokohama 종속성으로 car 객체를 다시 만들어야합니다. 그러나 DI (dependency injection)를 사용할 때는 런타임에 Wheels를 변경할 수 있습니다 (컴파일 타임이 아닌 런타임에 종속성을 주입 할 수 있기 때문입니다).
DI를 우리 코드에서 선호하는 wheels 객체를 만들고 Car 클래스에 제공하는 모든 작업을 수행하는 중개자로 생각할 수 있습니다.
그것은 우리의 Car 클래스가 Wheels, Battery 등의 객체를 만드는 것과 독립적으로 만듭니다.
기본적으로 세 가지 유형의 종속성 주입이 있습니다.
- 생성자 주입 : 종속성은 클래스 생성자를 통해 제공됩니다.
- setter 주입 : 클라이언트는 주입기가 종속성을 주입하는 데 사용하는 setter 메서드를 노출합니다.
- 인터페이스 주입 : 종속성은 전달 된 클라이언트에 종속성을 주입하는 주입기 메서드를 제공합니다. 클라이언트는 종속성을 허용하는 setter 메서드를 노출하는 인터페이스를 구현해야합니다.
이제 종속성 주입의 책임은 다음과 같습니다.
- 개체 만들기
- 이러한 객체가 필요한 클래스 파악
- 그리고 그들에게 모든 물건을 제공하십시오
객체에 변경 사항이있는 경우 DI는 해당 객체를 조사하고 해당 객체를 사용하는 클래스와 관련이 없습니다. 이런 식으로 객체가 미래에 변경되면 DI가 적절한 객체를 클래스에 제공 할 책임이 있습니다.
제어 반전 — DI의 개념
이것은 클래스가 종속성을 정적으로 구성해서는 안되지만 외부에서 다른 클래스에 의해 구성되어야 함을 나타냅니다.
SOLID 의 다섯 번째 원칙입니다 .Uncle Bob 의 객체 지향 프로그래밍 및 디자인의 다섯 가지 기본 원칙 — 클래스는 구체화 (단순한 용어로 하드 코딩)가 아닌 추상화에 의존해야 함을 나타냅니다.
원칙에 따라 수업은 책임을 수행하는 데 필요한 객체를 만드는 것이 아니라 책임을 수행하는 데 집중해야합니다. 그리고 그것이 의존성 주입 이 작동하는 곳 입니다. 클래스에 필요한 객체를 제공합니다.
참고 : Bob 삼촌의 SOLID 원칙에 대해 알아 보려면 이 링크로 이동하세요.
DI 사용의 이점
- 단위 테스트에 도움이됩니다.
- 인젝터 구성 요소에 의해 종속성 초기화가 수행되므로 보일러 플레이트 코드가 줄어 듭니다.
- 응용 프로그램 확장이 더 쉬워집니다.
- 애플리케이션 프로그래밍에서 중요한 느슨한 결합을 가능하게합니다.
DI의 단점
- 배우는 것은 약간 복잡하며 과도하게 사용하면 관리 문제 및 기타 문제로 이어질 수 있습니다.
- 많은 컴파일 시간 오류가 런타임으로 푸시됩니다.
- 의존성 주입 프레임 워크는 리플렉션 또는 동적 프로그래밍으로 구현됩니다. 이는 "참조 찾기", "호출 계층 표시"및 안전한 리팩토링과 같은 IDE 자동화 사용을 방해 할 수 있습니다.
자체적으로 (Pure Vanilla) 종속성 주입을 구현하거나 타사 라이브러리 또는 프레임 워크를 사용할 수 있습니다.
DI를 구현하는 라이브러리 및 프레임 워크
- Spring (자바)
- Google Guice (자바)
- Dagger (자바 및 Android)
- Castle Windsor (.NET)
- Unity (.NET)
종속성 주입에 대해 자세히 알아 보려면 아래 리소스를 확인하세요.
자바 의존성 주입 — DI 디자인 패턴 예제 튜토리얼 — JournalDev
Java에서 종속성 주입 사용 — 소개 — 자습서 — Vogella
Inversion of Control Containers와 의존성 주입 패턴 — Martin Fowler
도움이 되었기를 바랍니다.
기사를 좋아하고 더 놀라운 기사를 읽고 싶다면 여기 (Bhavya Karia)를 팔로우하고 더 많은 글을 쓰도록 동기를 부여하는 지원을 보여주세요.
저에게 질문이나 피드백이 있으면 LinkedIn, Twitter, Facebook에서 연결해 봅시다.
편집 1 :
Sergey Ufocoder 덕분에 이제이 기사가 러시아어로 변환되었습니다. 나의 러시아 친구들과 모두가 러시아어를 읽을 수있는 사람은 그것을 읽어줍니다.
기사 링크
또한 JavaScript에서 DI를 적용하고 라이브러리를 찾고 있다면 Jo Surikat은 자신의 라이브러리를 사용해 보라고 제안합니다.
디 닌자
Nicolas Froidure가 JavaScript의 또 다른 멋진 DI 라이브러리를 제안했습니다.
칼
편집 2 :
PHP 개발자라면 걱정하지 마십시오. 모든 것을 다룰 수 있습니다. Gordon Forsythe는 여러분 모두가 사용해보고 싶은이 놀라운 라이브러리를 추천했습니다.
아 우린
제가받은 모든 친절한 말씀에 감사드립니다. 더 많은 사람들이 혜택을받을 수 있도록 기사를 공유하십시오.
한두 가지만 배웠다면이 이야기를 공유 해주세요!