Programming/Spring

Spring - DI 그리고 IoC

긍정왕웹서퍼 2021. 10. 9. 00:38
728x90

이전에 포스팅에서 Spring의 개요중 DI 와 IoC를 언급했었다.

 

Spring에 Core 기능이라고 할 수 있으며, 핵심 기능인 만큼 대단히 중요도가 높다고 할수있겠다.

 

이번 글에서는 DI 와 IoC에 대한 개념을 알아보자.

Spring IOC ( Inversion Of Control )

IoC (반전제어) 란?

- Inversion of Control 의 약자로 프로그램을 구동하는데 필요한 객체에 대한 생성, 변경등의 관리를 프로그램을 개발하는 사람이 아닌
프로그램을 구동하는 컨테이너에서 직접 관리하는 것을 말한다.

기존의 웹 애플리케이션에서는 소스코드의 제어권은 오로지 개발자가 직접관리하며 권한을 가지고 있었지만,

Spring에서는 소스코드의 제어권을 컨테이너가 라이브러리로 제공하며 개발자는 온전히 코드에 집중할수 있도록 도와준다는 것이다. 

 

 

IOC 컨테이너 ?

스프링에서 관리하는 객체를 Bean(빈) 이라고 하고, 해당 빈들을 관리한다는 의미로 컨테이너를 'Bean Factory' 라고 한다. 

컨테이너의 역할은 

  • 객체의 생명주기와 의존성을 관리한다.
  • VO (DTO / POJO) 객체의 생성, 초기화, 소멸등의 처리를 담당한다.
  • 개발자가 직접 객체를 생성할 수 있지만, 해당 권한을 컨테이너에 맡김으로써 소스 코드 구현의 시간을 단축할 수 있다.

 

IOC 컨테이너와 Bean 객체의 종류와 설명

Bean 빈 스프링이 IoC방식으로 관리하는 Class, 스프링이 직접 생성과 제어를 담당하는 객체
Bean Foctory 빈 팩토리 스프링의 IoC를 담당하는 핵심 컨테이너, Bean을 등록, 생성, 조회, 반환하는 기능을 담당
ApplicationContext 어플리케이션 컨텍스트 Bean Factory를 확장한 컨테이너,
빈을 등록하고 관리하는 기능은 동일하나 각종 부가 서비스가 존재
GenericXmlApplicationContext ApplicationContext 를 구현한 Class, 일반 XML형태의 문서를 읽어 컨테이너 역할을 수행
Configuration metadata 설정 메타 정보 ApplicationContext 또는 Bean Foctory 가 IoC를 적용하기 위해 사용하는 설정 정보,
설정 메타 정보는 IoC컨테이너에 의해 관리되는 Bean 객체를 생성하고 구성할 때 사용 

 

 


Spring DI ( Dependency Injection )

DI (의존성 주입) 란 ? 

- Dependency Injection 의 약자로 IoC 구현의 핵심 기술이라고 할 수 있다. 

사용하는 객체를 직접 생성하여 만드는 것이 아닌 컨테이너가 빈의 설정 정보를 읽어와 자동으로 해당 객체에 연결하는 것을 의미한다.

이렇게 의존성을 주입 받게 되면 이후 해당 객체를 수정해야 할 상황이 발생했을 때 소스코드의 수정을 최소화 할 수 있다.

장점으로 개발자가 작성해야 할 코드가 단순해지고,  각 객체간의 종속관계(결합도)를 낮추거나 해소할 수 있다.

  • 결합도 ( 객체간의 종속관계 ) : 한 클래스에서 필드객체를 생성할 때 발생하는 두 객체간의 관계를 말하며, 각 객체간의 내용이 수정될 경우 영향을 미치는 정도를 나타낸다. 

 

DI의 종류 

  • Setter : 의존성을 주입 받는 Setter 메소드를 만들고 이를 통해 의존성을 주입.
  • Constructor : 생성자를 통해 의존성 주입, 필요한 의존성을 포함하는 클래스에 생성자를 만들고, 이를 통해 의존성을 주입 
  • Method : 의존성을 입력받는 일반 메소드를 만들고 이를 통해 의존성을 주입 

Setter 메소드를 통한 의존성 주입

- Setter 메소드를 통해 의존 관계가 있는 Bean을 주입하려면 <property> 태그를 사용한다. 

XML 선언 방법 

<bean id="객체이름" class="클래스풀네임">
	<property name="name" value="예시" />
   	<property name="name" ref="예시" />
</bean>
  • name 속성 : Class에서 선언한 필드 변수의 이름
  • value 속성 : 단순 값 또는 Bean이 아닌 객체를 주입할 때 사용
  • ref 속성 : Bean 이름을 이용해 주입할 Bean을 찾는다. 

예시

<bean id="student" class="com.hi.spring.person.model.vo.Student">
	<property name="name" value="홍길동" />
    <property name="wallet" ref="money" />
</bean>

<bean id="money" class="com.hi.spring.wallet.model.vo.Wallet"/>

 

Constructor 를 통한 의존성 주입

- 생성자를 통해 의존관계가 있는 Bean을 주입하려면 <constructor-arg> 태그를 사용한다. 

XML 선언방법

<bean id="불러올객체" class="클래스풀네임">
	<constructor-arg index="0" value="예시" />
    <constructor-arg name="예시" ref="예시" />
</bean>
  • 생성자 주입 방식은 사용자의 파라미터를 이용하기 때문에 한번에 여러개의 객체 주입이 가능
  • 필드 선언 순서에 따라 index속성을 통해서도 접근이 가능하다. 

예시

<bean id="student" class="com.hi.spring.person.model.vo.Student">
	<constructor-arg index="0" value="홍길동" />
    <constructor-arg index="1" value="money" />
</bean>

<bean id="money" class="com.hi.spring.wallet.model.vo.Wallet" />