본문 바로가기
자바/스프링 프레임워크

[Spring Framework] DI(Dependency Injection : 의존성 주입)와 IoC(Inversion of Control : 제어의 역행)

by drCode 2021. 10. 1.
728x90
반응형
728x90

https://www.youtube.com/watch?v=GKoCibDM6Ns 

참고 동영상 : SKplanet Tacademy

 

1. IoC

IoC의 개념

IoC(제어권의 역전)이란, 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미

 

※ 컴포넌트 의존관계 결정 (Component dependency resolution), 설정(configuration) 및 생명주기(lifecycle)를 해결하기 위한 디자인 패턴(Design Pattern)

 

IoC의 케이스

 

IoC가 아닌 경우개발자가 직접 객체들을 생성하는 작업들이 있다.

Object o1 = new Object();

Object o2 = new Object();

 

IoC인 경우, 프레임워크에서 제공하는 컨테이너가 객체를 생성해서 개발자의 코드에 주입한다.

 

반응형

IoC 컨테이너

스프링 프레임워크도 객체에 대한 생성 및 주기를 관리할 수 있는 기능을 제공할 수 있음.

즉, IoC 컨테이너 기능을 제공한다.

 - IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.

 - POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다.

 - 개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡긴다.

 

※ POJO(Plain Old Java Object)

  : 말 그대로 오래된 방식의 자바 오브젝트라는 말로서 Java EE 등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운 객체"를 만들게 된 것에 반발해서 사용되게 된 용어이다.

 

IoC 컨테이너가 직접 POJO에 대한 관리 권한을 가진다.

 

IoC의 분류

IoC의 분류

 

DL : 의존관계 검색

   - EJB(Enterprise Java Bean), Spring

DI : 의존관계 주입

   - Spring, PicoContainer

 

DL(Dependenct Lookup)과 DI(Dependency Injection)

DL과 DI

 ※ DL 사용 시 컨테이너 종속성이 증가하여, 주로 DI를 사용함

 

2. DI(Dependency Injection)

 

DI의 개념

각 클래스 간의 의존관계를 빈 설정(Bean Definition, 예) XML, Annotation) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말함

  • 개발자들은 단지 빈 설정파일에서 의존관계가 필요하다는 정보를 추가하면 된다.
  • 객체 레퍼런스를 컨테이너로부터 주입 받아서, 실행 시에 동적으로 의존관계가 생성된다.
  • 컨테이너가 흐름의 주체가 되어 애플리케이션 코드에 의존관계를 주입해 주는 것이다.

DI 장점

 DI의 유형

Setter Injection

  • 의존성을 입력받는 setter 메서드를 만들고 이를 통해 의존성을 주입한다.

Constructor Injection

  • 필요한 의존성을 포함하는 클래스의 생성자를 만들고 이를 통해 의존성을 주입한다.

Method Injection

  • 의존성을 입력 받는 일반 메서드를 만들고 이를 통해 의존성을 주입힌다.

 

DI를 이용한 클래스 호출방식

DI를 이용한 클래스 호출방식

왼쪽 클래스가 구현 클래스를 사용할 경우, DI를 이용할 경우, 반드시 상위 인터페이스를 만들어서 구현클래스로 구현을 해놓고, 왼쪽 클래스가 바로 구현 클래스를 바로 의존하는 것이 아니라 인터페이스를 사용하게 된다.

구현 클래스에 대한 정보는 XML(설정 파일)에 기술해놓거나 어노테이션을 사용한다.

프레임워크(컨테이너)가 설정파일을 읽어서 구현 객체를 생성해준다(의존성 주입을 컨테이너가 해주는 방식이다.)

 

beans.xml
Hello.java

bean => 자바 객체라는 뜻, 컨테이너에게 관리를 부탁하는 객체는 Bean으로 관리한다.

 

StringPrinter와 ConsolePrinter같은 구현 객체는 위의 Hello.java 처럼 구현해 놓는다.

그리고 나서 Hello 클래스가

 

Hello.java에서 setName() << <bean id="hello">에서 <property name="name" value="Spring" /> 와 연결되고,

setPrinter() << <property name="printer" ref="printer" />와 연결된다.

 

Setter Injection은 한 번에 한 개의 의존관계를 주입 받을 수 있고,

Constructor Injection은 여러 개의 의존관계를 주입 시킬 수 있다.

 

Spring DI Container는 Bean Factory를 의미하며, ApplicationContext가 그 역할을 수행한다.

컨테이너가 관리하는 객체는 빈BEAN

 

3. Spring DI 컨테이너

Spring DI 컨테이너의 개념

Spring DI 컨테이너가 관리하는 객체를 빈(bean)이라고 하고, 이 빈(bean)들을 관리한다는 의미로 컨테이너를 빈 팩토리(BeanFactory)라고 부른다.

  • 객체의 생성과 객체 사이의 런타임(run-time) 관계를 DI 관점에서 볼 때는 컨테이너를 BeanFactory라고 한다.
  • Bean Factory에 여러 가지 컨테이너 기능을 추가하여 애플리케이션 컨텍스트(ApplicationContext)라고 부름

Spring dI 컨테이너

 

BeanFactory와 ApplicationContext

BeanFactory와 ApplicationContext

궁극적으로는 ApplicaitonContext가 DI의 역할을 한다.

 

728x90
반응형

댓글