의존성 주입을위한 프레임 워크가 필요한 이유는 무엇입니까? [닫은]


42

나는 구현의 제어로서 Inversion of Control 원칙과 Dependency Injection에 대해 더 많이 읽었으며 그것을 이해하고 있다고 확신합니다.

기본적으로 '클래스 내에서 클래스 멤버의 인스턴스화를 선언하지 마십시오'라고 말하는 것 같습니다. 대신 인스턴스화를 생성자를 통해 전달하고 할당해야합니다. 외부 소스에서 클래스에 '주입'되었습니다.

이것이 단순한 것처럼 보인다면 왜 주석 또는 주석으로 이것을 구현하는 guice 또는 guice와 같은 프레임 워크가 필요합니까? 여기에 근본적인 것이 빠져 있습니까? Dependency Injection 프레임 워크의 사용법을 이해하기 위해 정말로 고심하고 있습니다.

편집 : 가능한 복제본에 대해서는 스프링뿐만 아니라 일반적으로 DI 프레임 워크에 대해 묻는 것처럼 내 질문이 더 독창적이라고 생각합니다. Spring은 단순한 DI 프레임 워크가 아니므로 DI와 관련이없는 Spring을 사용하려는 이유는 여러 가지가 있습니다.



11
컴파일 시간 대신 런타임으로 오류를 전환하는 데 유용합니다.
Den

1
@den 왜 그렇게하고 싶습니까? 이는 빠르게 실패하는 것으로 보입니다.
이 사용자의 도움이 필요합니다

답변:


26

프레임 워크가 필요하지 않습니다. 비교적 큰 프로젝트의 경우에도 수동으로 종속성 주입을 구현할 수 있습니다.

반면에 프레임 워크를 사용하면 프로세스를보다 간단하게 만들 수 있으므로 주석 또는 종속성 자동 감지를 기반으로 한 프레임 워크를 쉽게 사용할 수 있습니다. 클래스에서 새로운 종속성이 필요하다고 판단되면 추가해야합니다. 생성자에게 (또는 setter 선언) 객체가 주입됩니다-인스턴스화 코드를 변경할 필요가 없습니다.

또한 프레임 워크에는 종종 다른 유용한 기능이 포함되어 있습니다. 예를 들어 Spring은 선언적 트랜잭션 경계 설정 (매우 편리한) 및 많은 타사 라이브러리를 더 쉽게 통합 할 수있는 다양한 어댑터 구현을 포함하여 측면 지향 프로그래밍을위한 유용한 프레임 워크를 포함합니다.


8
정곡을 찌르다. 우리 그것들을 필요로 하지 않습니다 . 그들은 단지 큰 프로젝트에서 삶을 더 쉽게 만듭니다. 솔직히 말해서, 프레임 워크가 소규모 프로젝트에 비해 가치가 더 크다는 것을 알게되었습니다. OP가 의존성 주입을 지원하는 프레임 워크와 혼동하지 않도록 권장합니다.
RubberDuck

1
잘했다. 다른 누군가가 이미 멋지고 둥글게 만들었을 때 왜 바퀴를 재발 명합니까?
jwenting

정확히 를 제외하고 내가 어떤 인스턴스 코드를 변경할 필요가 없습니다 - 물론을, 더 인스턴스화 코드가 없습니다 ;-)
마티유 Guindon

DI 라이브러리가 짜증나는 것처럼 보입니다. 좋은 사람들은 반성을 사용하여 인스턴스화 할 클래스를 추측 할 수 있습니다.
Florian Margaine

2
런타임 처리에 리플렉션을 사용하는 사람은 잘못하고 있습니다. 리플렉션은 무언가를 할 수 있다고해서 꼭해야하는 것은 아닙니다.
gbjbaanb

12
  1. 왜 DI (종속성 주입)가 필요합니까?

    DI 메커니즘은 객체 생산과 객체 소비를 분리합니다. 객체가 필요로하는 의존성은 외부에서 투명하게 전달됩니다. 메커니즘의 장점은 분명 합니다. 테스트 목적으로 Null 개체 를 사용 하는 등의 종속성을 언제든지 교체 할 수 있습니다.

  2. 어떻게 되나요?

    목표를 달성하는 방법에는 여러 가지가 있습니다.

    • 생성자 주입을 통한 의존성 주입
    • 게터 / 세터를 통한 주입
    • 인터페이스 주입
  3. DI 프레임 워크가 필요합니까?

    아뇨 모든 인스턴스를 다른 개체에 수동으로 전달하기 만하면됩니다. 작은 응용 프로그램이있는 경우 스프링 컨테이너가 필요하지 않습니다.

    그러나 다른 한편으로 프레임 워크는 객체를 관리하는 데 도움을줍니다.

    • 복잡한 객체 관계를 연결하는 데 도움이됩니다. 보일러 플레이트 코드를 작성하지 않고 인스턴스를 생성하고 적절한 객체에 전달해야합니다.

    • 객체 생성 시점 을 제어 하는 데 도움이 됩니다 . 애플리케이션 부트 스트랩 중에 인스턴스를 생성 할 수 있지만 경우에 따라 게으른 생성이 더 나은 경우가 있습니다.

    • 애플리케이션 수 명당 하나 또는 요청 당 하나 (웹 프로그래밍을 수행하는 경우)로 생성되는 인스턴스 수를 제어 하는 데 도움이됩니다 .

더 작은 상용구 코드를 작성해야 할 필요가 있다고 생각되면 프로젝트 크기가 적절한 경우 (DI-) 프레임 워크를 사용하는 것이 좋습니다. 단점보다 더 많은 장점이 있습니다.


2
프레임 워크를 전혀 사용하지 않고 DI 라이브러리를 사용할 수 있습니다.
Florian Margaine

5

봄에는 대부분 편의의 문제입니다.

당신은 클래스가있는 경우 TopLevel구조 클래스 인 MiddleLevel클래스를 구성 LowLevel, 당신은 당신이 새로운 생성자 매개 변수가 필요 실현 LowLevel, 당신은 또한에 추가해야 TopLevel하고,에가 MiddleLevel, 단순히 그래서 그것은 시간 때 MiddleLevel구성하는 LowLevel사용할 수 있습니다 값 생성자에게 전달 될 수 있습니다. 봄에는 주석 만 추가하면됩니다.

또한 스프링을 사용하면 xml 대신 외부 구성 파일에서 종속성을 정의 할 수 있으며 "코드를 변경하지 않고"완전히 다른 배선을 사용하여 새 시스템을 생성 할 수 있습니다. (IMHO는 XML을 변경하는 것이 코드를 변경하는 것과 크게 다르지 않기 때문에 완전히 잘못 지정되었으며 실제로 코드는 일반적으로 XML보다 오류 확인 및 유형 확인이 훨씬 뛰어납니다.)

또 다른 것은 많은 사람들이 생성자를 두려워한다는 것입니다. 그들은 그들을 이해하지 못하고, 좋아하지 않으며, 오히려 사용하지 않을 것입니다.


3
특히 XML 설명에 동의합니다. IMHO, 생성자를 두려워하는 것은 아마도 DI 프레임 워크를 사용하는 나쁜 이유 일 것입니다.
Robert Harvey

2
IMHO, 생성자를 두려워하는 것은 프로그래밍에서 멀리해야 할 좋은 이유입니다. C-: =
Mike Nakis

5
그러나 이것이 공장 (정적 또는 다른)에 비해 어떻게 유리합니까? (봄이 전부 또는 아무것도 아닌 것처럼 보이는 반면 적절하게 사용할 수있는 옵션이라는 장점이 있습니다)
Richard Tingle

@RichardTingle Spring은 DI 이외의 다른 모든 일로 인해 주로 이점을 나타낼 수 있습니다. 분명히 정적 팩토리가 하나 인 다른 많은 방법으로 DI를 얻을 수 있기 때문입니다. (가장 시원하지만 여전히 중요한 것 중 하나입니다.)하지만 질문은 DI를 달성하기 위해 스프링을 사용 해야하는지 여부이며, 이것이 대답하려고 시도한 것입니다. 기본적으로 필요하지 않습니다. 단지 편의상 .
Mike Nakis

이것은 DI가 아닌 것의 예입니다. 'TopLevel'은 생성하지 말고 MiddleLevel생성자 TopLevel에 대한 인수로 구성 할 때이를 수신해야합니다 . 마찬가지로 생성자 에서을 MiddleLevel받아야합니다 LowLevel.
선명

1

몇 년 전에 저는 근무했던 회사에서 웹 페이지, 웹 포틀릿, 심지어 특정 데이터베이스 테이블까지 모니터링하는 프로그램을 작성했습니다. 사용자가 실행할 모니터와 매개 변수 (URL, 로그인, 성공 기준 등)를 사용자가 지정할 수있을 정도로 유연 해지기를 원했습니다. 그래서 XML 파일에서 읽고 Java 리플렉션을 사용하여 지정된 클래스를 인스턴스화하고 setter 메소드를 사용하여 지정된 매개 변수를 설정하도록 작성했습니다.

나중에 나는 Spring이 당신을 위해 똑같은 일을 할 것이라는 것을 알았습니다.

그래서 제 경우에는

  1. 의존성 주입 프레임 워크를 사용하면 프로그램을 유연하게 만들 수 있으며 (물론 잘 정의 된 매개 변수 내에서) 프로그램 작동 방식을 쉽게 지정할 수 있습니다.

  2. 타사 DI 프레임 워크를 사용하면 휠을 재발 명할 필요가 없습니다.


4
사용할 구체적인 클래스를 정의하는 것이 java 파일이 아닌 xml 내에서 더 나은 이유에 대해 더 자세히 설명해 주시겠습니까? 그것은 내가 결코 이해하지 못한 것입니다.
Richard Tingle

1
마법의 총알은 아니지만 구성 파일을 사용하면 하나 이상의 장점은 최소한 이론적으로는 코드보다 편집하기 쉽다는 것입니다. 또한 프로그램을 실행하고 있지만 소스 코드에 액세스 할 수없는 사용자가 변경할 수 있습니다. 내가 조잡한 의존성 주입 프로그램을 제공 한 예에서, 때때로 XML 구성 파일을 변경하여 프로그램을 작성한 사람이더라도 프로그램 실행 방식을 변경할 수있었습니다. 외부 구성 기능이 필요하지 않은 경우 코드로 더 쉽게 구성 할 수 있습니다. 우리는 코드에서 모든 DI를 수행하는 또 다른 직업을 가졌으며 잘 작동했습니다.
Paul J Abernathy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.