DI 컨테이너의 핵심은 추상화 입니다. DI 컨테이너는 이러한 설계 문제를 추상화합니다. 짐작할 수 있듯이 코드에 현저한 영향을 미치며 종종 생성자, 세터, 팩토리 및 빌더 수가 적습니다. 결과적으로 코드가 더 느슨하게 결합되어 (기본 IoC 로 인해 ) 더 깨끗하고 간단 해집니다. 비용이 없지는 않지만.
배경
몇 년 전, 그러한 추상화는 다양한 구성 파일을 작성해야했습니다 ( 선언적 프로그래밍 ). LOC의 수가 크게 줄어드는 것은 환상적이지만 LOCS는 줄어든 반면 구성 파일의 수는 약간 증가했습니다. 중소형 프로젝트의 경우 전혀 문제가되지 않았지만 더 큰 프로젝트의 경우 코드와 XML 설명자 사이에 "코드 어셈블리"가 50 % 흩어져있는 것이 문제가되었습니다. 그럼에도 불구하고 주요 문제는 패러다임 자체. 디스크립터가 사용자 정의를위한 공간을 거의 남기지 않았기 때문에 상당히 융통성이 없었습니다.
패러다임은 구성에 대한 컨벤션 으로 점차 바뀌었고 , 이는 구성 파일을 주석 또는 속성으로 교환합니다. XML이 할 수 없었던 유연성을 제공하면서 코드를 더 깨끗하고 단순하게 유지합니다.
아마도 이것은 지금까지 일한 방식과 관련하여 가장 중요한 차이 일 것입니다. 적은 코드와 더 많은 마법.
하락세로...
컨피규레이션에 대한 컨벤션은 추상화가 너무 무거워서 어떻게 작동하는지 거의 알 수 없습니다. 때로는 마술처럼 보이고 여기에 한 가지 더 단점이 있습니다. 일단 작동하면 많은 개발자는 작동 방식에 신경 쓰지 않습니다.
이것은 DI 컨테이너로 DI를 배운 사람들에게 핸디캡입니다. 이들은 컨테이너가 추상화 한 디자인 패턴, 모범 사례 및 원칙의 관련성을 완전히 이해하지 못합니다. 개발자들에게 DI와 그 장점에 대해 잘 알고 있는지 물어 보았으며 다음과 같이 대답했습니다.- 예, Spring IoC를 사용했습니다 . (이게 무슨 소리 야?!?)
이러한 각각의 "단점"에 동의하거나 동의하지 않을 수 있습니다. 겸손한 의견으로는 프로젝트에서 무슨 일이 일어나고 있는지 알아야합니다. 그렇지 않으면 우리는 그것을 완전히 이해하지 못합니다. 또한 DI가 무엇인지 알고 그것을 구현하는 방법에 대한 개념을 갖는 것도 고려할만한 장점입니다.
긍정적 인 측면에서는...
한마디 생산성 . 프레임 워크를 통해 실제로 중요한 것에 집중할 수 있습니다. 응용 프로그램의 사업.
언급 된 결점에도 불구하고, 우리 중 많은 사람들 (마감일과 비용에 의해 조절되는 직무)에게이 도구는 귀중한 자원입니다. 제 생각에는 이것이 DI 컨테이너 구현에 유리한 우리의 주요 논거가되어야합니다. 생산성 .
테스팅
순수한 DI 또는 컨테이너를 구현하든 테스트는 문제가되지 않습니다. 정반대. 동일한 컨테이너가 종종 단위 테스트를위한 모형을 제공합니다. 몇 년 동안 나는 테스트를 온도계로 사용했습니다. 그들은 컨테이너 시설에 크게 의존했는지 말해줍니다. 이 컨테이너는 setter 또는 생성자없이 개인 속성을 초기화 할 수 있기 때문에 이것을 말합니다. 그들은 거의 모든 장소에 부품을 주입 할 수 있습니다!
유혹하는 소리? 조심해! 함정에 빠지지 마십시오 !!
제안
컨테이너를 구현하기로 결정한 경우 모범 사례를 따르는 것이 좋습니다. 생성자, 설정자 및 인터페이스를 계속 구현하십시오. 프레임 워크 / 컨테이너가 사용하도록합니다 . 다른 프레임 워크로 쉽게 마이그레이션하거나 실제 프레임 워크를 제거 할 수 있습니다. 컨테이너에 대한 종속성을 크게 줄일 수 있습니다.
이 관행과 관련하여 :
DI 컨테이너를 사용하는 경우
내 대답은 DI 컨테이너를 주로 선호하는 자신의 경험에 의해 편향 될 것입니다.
이 주제에 대한 Mark Seeman의 흥미로운 기사를 찾을 수 있으며, 순수한 DI 구현 방법에 관한 질문에 대한 답변도 제공 됩니다.
마지막으로 Java에 관해 이야기한다면 먼저 JSR330-Dependency Injection을 살펴보십시오 .
요약
장점 :
- 비용 절감 및 시간 절약. 생산력.
- 더 적은 수의 구성 요소.
- 코드가 더 단순 해지고 깨끗해집니다.
단점 :
- DI는 타사 라이브러리에 위임됩니다. 우리는 그들의 장단점을 알고 있어야합니다.
- 학습 곡선.
- 그들은 빨리 좋은 습관을 잊게 만듭니다.
- 프로젝트의 의존성 증가 (더 많은 라이브러리)
- 리플렉션을 기반으로하는 컨테이너 에는 더 많은 리소스 (메모리)가 필요합니다. 자원에 의해 제약을받는 경우에 중요합니다.
순수한 DI와의 차이점 :
- 코드가 적고 구성 파일 또는 주석이 더 많습니다.