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 구현 클래스가 여러가지 종류가 있다.
'전체 > Spring' 카테고리의 다른 글
Bean 등록 및 의존관계 주입 Annotation 종류 (0) | 2019.02.23 |
---|---|
jUnit 개념, 특징, 어노테이션, 메서드 (1) | 2019.02.23 |
Spring Framework 개념, 전략, 특징, 기능요소 (0) | 2019.02.23 |
Spring 프레임워크의 프레임워크란? (0) | 2019.02.23 |
sts 사용, spring starter project 만들기, mysql 연결, lombok 사용 (0) | 2018.12.18 |