programing

스프링 프레임워크에서의 의존성 주입 및 제어 반전이란 무엇입니까?

madecode 2023. 3. 4. 15:24
반응형

스프링 프레임워크에서의 의존성 주입 및 제어 반전이란 무엇입니까?

「의존성 주입」과 「컨트롤의 반전」은, Spring 프레임워크를 사용해 Web 프레임워크를 개발하는 주된 장점으로 자주 언급되고 있습니다.

가능한 한 예를 들어 매우 간단한 용어로 그것이 무엇인지 설명해 주실 수 있는 분부탁월합니다.

  • 스프링은 의존성 주입으로 인해 느슨하게 결합된 응용 프로그램을 만드는 데 도움이 됩니다.
  • 봄에는 오브젝트가 어소시에이션(의존관계)을 정의하고, 이러한 의존관계를 취득하는 방법에 대해서는 걱정하지 않습니다.오브젝트 작성에 필요한 의존관계를 제공하는 것은 스프링의 책임입니다.

를 들어 다음과 같습니다.우리가 어떤 물체를 가지고 있다고 가정해 보자.Employee 사물에 합니다.Address을 '콩'에 하는 콩으로 Employee합니다.Address.

이 '스프링'을 하려고 할 때Employee은 브젝트,, 은은 that that that that that that that that that that that이다를 보게 될 것이다.Employee Address.Address 오브젝트하여 그 오브젝트를 한다.Employee★★★★★★ 。

  • Inversion of Control(IoC; 제어 반전)과 Dependency Injection(DI; 의존성 주입)은 서로 교환하여 사용됩니다.IoC는 DI를 통해 이루어집니다.DI는 의존관계를 제공하는 프로세스이며 IoC는 DI의 최종 결과입니다.(주의: DI만이 IoC를 달성하는 방법은 아닙니다.)다른 방법도 있습니다.)

  • DI에 의해 오브젝트 작성의 책임이 어플리케이션코드에서 스프링 컨테이너로 넘어갑니다.이 현상을 IoC라고 부릅니다.

  • Dependency Injection은 setter injection 또는 constructor injection으로 수행할 수 있습니다.

이 두 용어에 대한 저의 간단한 이해를 적어보겠습니다(빠른 이해를 위해 예시를 읽어주세요).

  • Injection( 의존성 주입 Dependency Injection(DI; 의존성 주입):
    종속성 주입은 일반적으로 종속 개체를 메서드에 매개 변수로서 전달하는 것을 의미하며 메서드가 종속 개체를 생성하도록 하는 것이 아닙니다.
    실제로는 이 방법이 특정 구현에 직접 의존하지 않는다는 것을 의미합니다. 요건을 충족하는 구현은 매개 변수로 전달될 수 있습니다.

    이 실장에서는 오브젝트의 의존관계를 정의합니다.봄이 되면 가능해져요
    이것에 의해, 느슨하게 결합하는 애플리케이션 개발이 가능하게 됩니다.

    'CREATED', 'EMPLOYE OBJECT WHEN CREATED',IT부문은 자동으로 주소 객체를 작성합니다(주소가 종업원 객체에 의해 의존관계로 정의되어 있는 경우).*

  • Control (IoC) 컨테이너:
    이는 프레임워크의 일반적인 특성으로 IoC는 Java 객체를 관리합니다.
    - Factory를 - Bean Factory를 통해.
    IoC 컨테이너에 의해 인스턴스화된 Java 컴포넌트는 bean이라고 불리며 IoC 컨테이너는 빈의 범위, 라이프 사이클 이벤트 및 설정 및 코드화된 모든 AOP 기능을 관리합니다.

    빠른 예:제어의 버전에서는 자유, 더 유연성과 의존성이 덜 의존합니다.데스크톱 컴퓨터를 사용하는 경우 슬리브레이션(또는 제어)를 사용합니다.화면 전에 앉아 봐야 해요.키보드 유형을 사용하여 탐색하고 마우스를 이동합니다.그리고 나쁜 쓰기 소프트웨어는 당신이 더 많은 노예를 할 수 있습니다.노트북과 함께 데스크톱으로 교체하면 다소 반전 제어됩니다.당신은 그것을 쉽게 가져갈 수 있습니다.그래서 컴퓨터 제어 대신 컴퓨터를 제어할 수 있습니다.

    소프트웨어/개체 사용자는 제어의 역전을 구현함으로써 제어되거나 옵션이 줄어드는 대신 소프트웨어/개체에 대해 더 많은 제어/옵션을 얻을 수 있습니다.

    설계 가이드라인으로서의 제어 역전에는 다음과 같은 목적이 있습니다.
    - 이 분리된다. - 실행이 분리된다.
    - 모든 모듈은 용도에 초점을 맞출 수 있습니다.
    은 다른 하지 않고 에만 의존합니다 - 모듈에서는 다른 시스템이 무엇을 가정하지 않습니다.
    해도 다른 이 없습니다.

여기에서는 추상적인 내용을 정리할 테니 다음 링크를 방문하면 주제에 대한 자세한 이해를 얻을 수 있습니다.

좋은 읽을거리. 예를 들어라.

상세설명

스프링 개체는 느슨하게 결합되어 있습니다. 즉, 각 클래스는 서로 독립적이므로 모든 것을 개별적으로 테스트할 수 있습니다.그러나 이러한 클래스를 사용할 때 클래스는 먼저 인스턴스화해야 하는 다른 클래스에 종속될 수 있습니다.

그래서 우리는 봄에 A클래스가 B클래스에 의존한다고 말한다.따라서 클래스 A의 bean(like class)을 작성할 때 클래스 A보다 먼저 클래스 B를 인스턴스화하고 setter 또는 constructor DI 메서드를 사용하여 클래스 A에 있는 클래스 B를 주입합니다.즉, 우리는 스프링에게 런타임에 대한 의존성을 말하고 있습니다.이거는 DI입니다.

Spring에는 오브젝트(콩)의 작성, 관리 및 집약을 하드 코딩이 아닌 책임으로 할당하고 있기 때문에 이를 IOC(Inversion Of Control)

제어 반전 - 스프링 IOC 컨테이너에 스프링 콩의 생성 및 인스턴스화를 제어하는 것을 의미하며 개발자가 수행하는 유일한 작업은 스프링 xml 파일에 콩을 구성하는 것입니다.

의존성 주입-

클래스 직원 고려

class Employee { 
   private int id;
   private String name;
   private Address address;

   Employee() {
     id = 10;
     name="name";
     address = new Address();
   }


}

클래스 주소를 고려합니다.

class Address {
   private String street;
   private String city;

   Address() {
     street="test";
     city="test1";

  }
}

위의 코드에서 주소 클래스 값은 Employee 클래스가 인스턴스화된 경우에만 설정됩니다.이것은 Employee 클래스에 대한 주소 클래스의 종속성입니다.그리고 스프링은 의존성 주입 개념을 사용하여 이 의존성을 주입하는 두 가지 방법을 제공함으로써 이 문제를 해결합니다.

  1. 세터 주입

주소 클래스를 참조하는 Employee 클래스의 Setter 메서드

public void setAddress(Address addr) {
    this.address = addr;
}
  1. 생성자 주입

주소를 받아들이는 Employee 클래스의 컨스트럭터

Employee(Address addr) {
      this.address = addr;
}

이렇게 하면 설정기/시공자 주입을 사용하여 주소 클래스 값을 독립적으로 설정할 수 있습니다.

관리역전(IOC):

IoC는 시스템의 제어 흐름을 반전시키는 설계 패턴이므로 실행 흐름은 중앙 코드에 의해 제어되지 않습니다.즉, 컴포넌트는 다른 컴포넌트의 추상화에만 의존해야 하며 의존적인 오브젝트의 작성은 담당하지 않습니다.대신 개체 인스턴스는 Di(Dependency Injection)를 통해 IoC 컨테이너에 의해 런타임에 제공됩니다.

IoC를 사용하면 소프트웨어 컴포넌트의 재사용, 느슨한 결합 및 간단한 테스트를 용이하게 하는 소프트웨어 설계를 개선할 수 있습니다.

의존성 주입(DI):

DI는 종속성을 개체의 생성자로 전달하는 기술입니다.객체가 컨테이너에서 로드된 경우 컨테이너에 의해 종속성이 자동으로 제공됩니다.따라서 인스턴스를 수동으로 작성할 필요 없이 종속성을 소비할 수 있습니다.이렇게 하면 커플링이 줄어들고 개체 인스턴스의 수명을 보다 효과적으로 제어할 수 있습니다.

클릭하면 상세보기

스프링: 스프링은 Java 플랫폼의 "컨트롤 반전" 컨테이너입니다.

제어 반전(IoC):제어의 반전(Inversion of Control, IoC)은 객체 지향 프로그래밍 프랙티스로 실행 시 객체 커플링이 "어셈블러" 객체에 의해 제한되며 일반적으로 정적 분석을 사용하여 컴파일 시 알 수 없습니다.

의존성 주입(DI): "의존성 주입은 하드 코딩된 의존성을 제거하고 런타임 또는 컴파일 시 이를 변경할 수 있는 소프트웨어 설계 패턴입니다." -wiki

간단히 말하면..

  • IOC(Inversion of Control)는 다음을 의미하는 개념입니다.새 연산자를 사용하여 개체를 만드는 대신 컨테이너가 대신 생성하도록 합니다.
  • DI(Dependency Injection)는 다음과 같은 스프링 방식으로 프레임워크 구성요소의 의존성을 주입하는 방법입니다.
  1. 컨스트럭터 주입
  2. 세터/게터 주입
  3. 현장 주입

Inversion of Control은 소프트웨어 아키텍처의 일반적인 설계 원리로 유지보수가 용이한 재사용 가능한 모듈러 소프트웨어 프레임워크 작성을 지원합니다.

이는 제어 흐름이 일반 문서 라이브러리 또는 재사용 가능한 코드로부터 "수신"되는 설계 원칙입니다.

이를 더 잘 이해하기 위해 코딩 초기에는 어떻게 코딩했는지를 살펴보겠습니다.절차적/전통적 언어에서는 일반적으로 비즈니스 로직이 애플리케이션의 흐름을 제어하고 범용 또는 재사용 가능한 코드/함수를 호출합니다.예를 들어 단순한 콘솔어플리케이션에서는 프로그램의 지시에 따라 제어 흐름이 제어됩니다.이 명령에는 일반적인 재사용 가능 함수에 대한 호출이 포함될 수 있습니다.

print ("Please enter your name:");
scan (&name);
print ("Please enter your DOB:");
scan (&dob);

//More print and scan statements
<Do Something Interesting>

//Call a Library function to find the age (common code)
print Age

반면 IoC에서는 프레임워크는 비즈니스 로직을 호출하는 재사용 가능한 코드입니다.

예를 들어 윈도 기반 시스템에서는 버튼, 메뉴, 윈도 및 대화상자와 같은 UI 요소를 작성하기 위한 프레임워크를 이미 사용할 수 있습니다.어플리케이션의 비즈니스 로직을 작성할 때 (이벤트가 발생했을 때) 비즈니스 로직 코드를 호출하는 것은 프레임워크의 이벤트이며, 그 반대는 아닙니다.

프레임워크의 코드는 내 비즈니스 로직을 인식하지 못하지만 내 코드를 호출하는 방법은 여전히 알고 있습니다.이것은 이벤트/대리점, 콜백 등을 사용하여 실현됩니다.여기서 흐름 제어는 "반전"입니다.

따라서 정적 바인딩된 객체에 대한 제어 흐름에 의존하는 대신 흐름은 전체 객체 그래프와 여러 객체 간의 관계에 따라 달라집니다.

Dependency Injection은 객체의 종속성을 해결하기 위해 IOC 원리를 구현하는 설계 패턴입니다.

간단히 말하면 코드를 작성하려고 하면 다른 클래스를 만들고 사용하게 됩니다.1개의 클래스(클래스 A)는 다른 클래스(클래스 B 및/또는 D)를 사용할 수 있습니다.따라서 클래스 B와 D는 클래스 A의 의존관계입니다.

단순한 비유는 클래스 카가 될 것이다.자동차는 엔진, 타이어 등과 같은 다른 등급에 의존할 수 있습니다.

Dependency Injection은 Dependency 클래스(여기서는 Class Car)가 종속성(Class Engine 및 Class Tire)을 생성하는 대신 종속성의 구체적인 인스턴스를 클래스에 주입해야 한다고 제안합니다.

좀 더 실용적인 예를 들어 이해합시다.독자적인 Text Editor 를 작성하고 있다고 생각해 주세요.무엇보다도, 당신은 사용자에게 텍스트의 오타를 검사할 수 있는 기능을 제공하는 맞춤법 검사기를 가질 수 있다.이러한 코드의 간단한 실장은 다음과 같습니다.

Class TextEditor
{

    //Lot of rocket science to create the Editor goes here

    EnglishSpellChecker objSpellCheck;
    String text;

    public void TextEditor()

    {   

        objSpellCheck = new EnglishSpellChecker();

    }

    public ArrayList <typos> CheckSpellings()
    {

        //return Typos;

    }

}

첫눈에 모든 게 장밋빛으로 보인다.사용자가 텍스트를 작성합니다.개발자는 텍스트를 캡처하여 CheckSpellings 함수를 호출하여 사용자에게 보여줄 오타 목록을 찾습니다.

어느 화창한 날 한 사용자가 Editor에서 프랑스어를 쓰기 시작할 때까지 모든 것이 잘 작동하는 것처럼 보입니다.

더 많은 언어를 지원하려면 더 많은 Spell Checker가 필요합니다.아마 프랑스어, 독일어, 스페인어 등일 겁니다.

여기서는 "English" Spell Checker"와 TextEditor 클래스가 밀접하게 결합되어 있는 코드를 만들었습니다.즉, TextEditor 클래스는 EnglishSpell Checker에 의존합니다.즉, EnglishSpell Checker는 TextEditor에 의존합니다.우리는 이 의존성을 제거할 필요가 있다.또한 당사의 텍스트 편집기는 실행 시 개발자의 재량에 따라 맞춤법 검사기의 구체적인 참조를 유지할 수 있는 방법이 필요합니다.

그래서 DI의 도입에서 보았듯이 클래스에 의존성을 주입해야 한다는 것을 시사하고 있습니다.따라서, 모든 의존 관계를 착신측 클래스/코드에 주입하는 것은, 발신측 코드의 책임입니다.코드를 재구성할 수 있습니다.

interface ISpellChecker
{

    Arraylist<typos> CheckSpelling(string Text);

}

Class EnglishSpellChecker : ISpellChecker

{

    public override Arraylist<typos> CheckSpelling(string Text)

    {

        //All Magic goes here.

    }

}



Class FrenchSpellChecker : ISpellChecker

{

    public override Arraylist<typos> CheckSpelling(string Text)

    {

        //All Magic goes here.

    }

}

이 예에서는 TextEditor 클래스가 ISpellChecker 유형의 구체적인 인스턴스를 수신해야 합니다.

이제 종속성을 생성자, 공용 속성 또는 메서드에 삽입할 수 있습니다.

컨스트럭터 DI를 사용하여 클래스를 변경해 봅시다.변경된 TextEditor 클래스는 다음과 같습니다.

Class TextEditor

{

    ISpellChecker objSpellChecker;

    string Text;



    public void TextEditor(ISpellChecker objSC)

    {

        objSpellChecker = objSC;

    }



    public ArrayList <typos> CheckSpellings()

    {

        return objSpellChecker.CheckSpelling();

    }

}

텍스트 에디터 작성 중에 호출 코드가 TextEditor 인스턴스에 적절한 철자 검사 유형을 삽입할 수 있도록 합니다.

기사 전문은 이쪽에서 보실 수 있습니다.

IOC는 다른 사람이 대신 오브젝트를 만들도록 하는 기술입니다.그리고 봄철에 대비해 다른 한 명은 IOC 컨테이너입니다.

종속성 주입은 한 개체가 다른 개체의 종속성을 제공하는 기술입니다.

IOC는 제어의 반전(Inversion of control)의 약자로 발신자에서 착신자로 객체 작성 제어를 반전한다는 상위 수준의 개념입니다.

제어의 역전이 없으면 오브젝트 작성은 사용자가 담당합니다.제어 시나리오의 반전에서는 클래스의 인스턴스를 만드는 프레임워크가 담당합니다.

의존성 주입은 우리가 통제의 반전을 달성할 수 있는 방법이다.제어를 프레임워크 또는 작업에 맡기 위해 우리는 종속성을 선언하고 IOC 컨테이너는 이러한 종속성을 클래스 내에 주입합니다(즉, 프레임워크는 우리를 위한 인스턴스를 만들고 그것을 클래스에 제공합니다).

그럼 이것의 장점은 무엇일까요?

우선 수업과 수업의 라이프 사이클은 봄에 의해 관리된다.스프링은 창조에서 파괴까지의 과정을 완벽하게 관리합니다.

둘째, 클래스 간 커플링이 감소합니다.클래스는 다른 클래스의 구현과 밀접하게 연결되어 있지 않습니다.구현이 변경되거나 삽입된 인터페이스의 구현을 변경하는 경우 코드베이스 내의 모든 인스턴스를 수동으로 변경할 필요 없이 쉽게 변경할 수 있습니다.

셋째, 계층 간의 결속력이 높아집니다.높은 응집력은 서로 연관된 클래스를 유지하는 것을 의미합니다.다른 클래스에 인터페이스를 삽입하고 있기 때문에 콜링 클래스가 동작하기 위해 필요한 클래스는 명확합니다.

넷째, 시험성 향상입니다.컨스트럭터에서 인터페이스를 사용하고 있기 때문에 구현과 모의 구현을 쉽게 교환할 수 있습니다.

다섯째, 프록시 개체에 대한 JDK 동적 프록시 사용입니다.JDK 다이내믹프록시에서는 인터페이스를 사용해야 합니다.이것은 사실입니다.이것은, 이러한 인터페이스를 주입하고 있기 때문입니다.이 프록시는 Spring AOP, 트랜잭션 처리, Spring 데이터, Spring 보안 등에 사용할 수 있습니다.

Employee에서 주소 인스턴스를 가져오는 기존 방법은 주소 클래스의 새 인스턴스를 만드는 것입니다.봄은 우리에게 모든 의존적인 물체를 만들어주므로 우리는 물체에 대해 걱정할 필요가 없다.

따라서 봄에는 종속 개체를 제공하는 스프링 컨테이너에 의존합니다.

Spring 프레임워크는 Spring AOP, Spring ORM, Spring Web Flow 및 Spring Web MVC와 같은 레이어라고도 불리는 서브프레임의 집합으로 간주할 수 있습니다.웹 응용 프로그램을 구성하는 동안 이러한 모듈을 개별적으로 사용할 수 있습니다.웹 응용 프로그램에서 더 나은 기능을 제공하기 위해 모듈을 함께 그룹화할 수도 있습니다.

스프링을 통해 컨테이너까지 침투하기 전에 스프링은 다음과 같은 두 가지 유형의 컨테이너를 제공한다는 것을 기억하십시오.

  1. Bean Factory 컨테이너
  2. Application Context 컨테이너

IoC, AOP, 트랜잭션 관리 등의 Spring 프레임워크의 기능은 프레임워크 목록 중 고유합니다.스프링 프레임워크의 가장 중요한 기능은 다음과 같습니다.

  1. IoC 컨테이너
  2. 데이터 액세스 프레임워크
  3. 봄 MVC
  4. 트랜잭션 관리
  5. 스프링 웹 서비스
  6. JDBC 추상화 레이어
  7. 스프링 테스트 컨텍스트 프레임워크

스프링 IoC 컨테이너는 스프링 프레임워크의 핵심입니다.오브젝트 작성, 의존관계 구성 및 조립, 라이프 사이클 전체를 관리합니다.컨테이너는 의존성 주입(DI)을 사용하여 애플리케이션을 구성하는 구성요소를 관리합니다.구성 파일(XML), Java 코드 또는 Java 주석 및 Java POJO 클래스에서 개체에 대한 정보를 가져옵니다.이러한 오브젝트를 Bean이라고 부릅니다.Java 오브젝트와 그 라이프 사이클의 제어는 개발자에 의해 이루어지지 않기 때문에 Inversion Of Control이라는 이름이 붙습니다.

언급URL : https://stackoverflow.com/questions/9403155/what-is-dependency-injection-and-inversion-of-control-in-spring-framework

반응형