이전에 포스팅에서 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" />
'Programming > Spring' 카테고리의 다른 글
스프링부트 기초 - 2. 게시판 시작해보기 (0) | 2021.12.02 |
---|---|
스프링부트 기초 - 1. 스프링부트 개요 & 프로젝트 설치 및 설정 (0) | 2021.12.02 |
스프링 이미지게시판 - div 태그 contentEditable 기능 (0) | 2021.10.25 |
Spring 의 기본 동작순서와 구조 MVC (0) | 2021.10.08 |
Spring 의 개요 (0) | 2021.10.08 |