1. IoC란?


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

- 컴포넌트 의존관계 결정(component dependency resolution),

  설정(configuration) 및 생명주기(lifecycle)를 해결하기 위한 디자인 패턴(Design Pattern)이다.



IoC가 아닌경우 - new 방식을 써서 객체가 필요할때마다 생성해야 한다.

IoC인경우 - new 방식을 써서 객체를 생성할 필요없다.




2. IoC 컨테이너란?




- 객체에 대한 생성 및 생명주기를 관리 할수 있는 기능을 제공하고 있다.

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

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

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




3. IoC의 분류






1. DL ( Dependency Lookup 의존성 검색 )이란?


 - 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lookup 하는 것

 - DL 사용 시 컨테이너 종속성이 증가한다.


2. DI ( Dependency Injection 의존성 주입 )란?


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


- 개발자들은 단지 빈 설정파일에서 의존관계가 필요하다는 정보를 추가하면 된다.

- 객체 레퍼런스를 컨테이너로부터 주입 받아서 실행 시에 동적으로 의존관계가 생성된다.

- 컨테이너가 흐름의 주체가 되어 애플리케이션 코드에 의존관계를 주입해 주는 것이다.


2.1 DI 장점 


- 코드가 단순해진다.

- 컴포넌트 간의 결합도가 제거된다.




4. DI 용어



1. 빈(Bean)


- 스프링이 IoC 방식으로 관리하는 객체라는 뜻이다.

- 스프링이 직접 생성과 제어를 담당하는 객체를 Bean이라고 한다.



2. 빈 팩토리(BeanFactory)


- 스프링의 IoC를 담당하는 핵심 컨테이너를 가리킨다.

- Bean을 등록, 생성, 조회, 반환 기능을 담당한다.

- 이 BeanFactory를 바로 사용하지 않고 이를 확장한 ApplicationContext를 주로 이용한다.


3. 애플리케이션 컨텍스트(ApplicationContext)


- BeanFactory를 확장한 IoC 컨테이너

- Bean을 등록하고 관리하는 기능은 BeanFactory와 동일하지만 

스프링이 제공하는 각종 부가 서비스를 추가로 제공한다.

- 스프링에서는 ApplicationContext를 BeanFactory보다 더 많이 사용한다.



4. 설정 메타정보(Configuration metadata)


- Applicationcontext또는 BeanFactory가 IoC를 적용하기 위해 사용하는 메타정보를 말한다.

- 설정 메타정보는 IoC컨테이너에 의해 관리되는 Bean객체를 생성하고 구성할 때 사용된다.




5. DI의 유형



1. Setter Injection ( Setter 메서드를 이용한 의존성 삽입 )

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


2. Constructor Injection ( 생성자를 이용한 의존성 삽입 )

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


3. Method Injection ( 일반 메서드를 시용한 의존성 삽입 )

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




6. DI : Bean 의존관계



1. Setter Injection : <property> 태그


- Setter 메서드를 통해 의존관계가 있는 Bean을 주입하려면 <property> 태그의 ref 속성을 사용할 수 있다.

- Setter메서드를 통해 Bean의 레퍼런스가 아니라 단순 값을 주입하려고 할때는 <property> 태그의 value 속성을 사용한다.

- ref 속성을 사용하면 Bean의 id를 이용해 주입할 Bean을 찾는다.

- value 속성은 단순 값 또는 Bean이 아닌 객체를 주입 할 때 사용한다.


2. Constructor Injection : <constructor-arg> 태그


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

- Constructor 주입방식은 생성자의 파라미터를 이용하기 때문에 한번에 여러개의 객체를 주입할 수 있다.



다음은 Setter Injection , Constructor Injection 사용한 beans.xml 코드이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
    <!-- StringPrinter 클래스를 bean으로 등록 -->
    <bean id="stringPrinter" class="di.xml.StringPrinter"/>
    <!-- Console.Printer 클래스를 bean으로 등록 -->
    <bean id="consolePrinter" class="di.xml.ConsolePrinter"/>
    
    <!-- setter injection -->
    <!-- di.xml.Hello 클래스를 bean으로 등록 -->
    <bean id="helloBean" class="di.xml.Hello" scope="singleton">
        <property name="name" value="상현"/>
        <property name="printer" ref="stringPrinter"/>
    </bean>
    
    <!-- constructor injection -->
    <bean id="helloConstructor" class="di.xml.Hello">
        <!-- constructor injection  -->
        <constructor-arg index="0" value="생성자" />
        <constructor-arg index="1" ref="consolePrinter" />
    </bean>
</beans>
cs




7. Spring DI 컨테이너 구조



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

- 객체의 생성과 객체 사이의 런타임(run-time)관계를 DI관점에서 볼때는 컨테이너를 BeanFactory라고 한다.

- Bean Factory에 여러가지 컨테이너 기능을 추가하여 애플리케이션 컨텍스트(ApplicationContext)라고 부른다.


1. BeanFactory


- Bean을 등록, 생성, 조회, 반환 관리한다.

- 보통은 BeanFactory를 바로 사용하지 않고, 이를 확장한 ApplicationContext를 사용한다.

- getBean() 메서드가 정의되어 있다.


2. ApplicationContext


- Bean을 등록, 생성, 조회, 반환 관리하는 기능은 BeanFactory와 같다.

- Spring이 각종 부가 서비스를 추가로 제공한다.

- Spring이 제공하는 ApplicationContext 구현 클래스가 여러가지 종류가 있다.




+ Recent posts