프레임워크 IoC - peuleim-wokeu IoC

Spring Framework - IOC(Inversion of Control)의 개념, DI(Dependency Injection)의 개념 , Spring DI 컨테이너

1. Ioc의 개념
2. DI의 개념
3.Spring DI 컨테이너

1. Ioc(Inversion of Control )

  IOC의 개념
     IOC(제어권의 역전)이란? 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미한다.
 (개발자가 생명주기(생성 및 삭제에 대한 제어)를 관리하는게 아니라 프레임워크가 대신해줌)

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

프레임워크 IoC - peuleim-wokeu IoC

- loc가 아닌경우에는 개발자가 Obj를 생성한다. (기존의 코드,,)
- ioc인 경우 framework container에서 제어하여 객체를 생성한다 (팩토리패턴개념인가..?)

IOC컨테이너
 - 스프링 프레임워크도 객체에 대한 생성 및 생명주기를 관리할 수 있는 기능을 제공하고 있음.
즉 IOC 컨테이너 기능을 제공한다
 1. ioc 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.
 2. POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다.
 3. 개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡긴다.

프레임워크 IoC - peuleim-wokeu IoC



IOC 의 분류
-DL (Dependency Lookup)
 EJB, Spring  - (특정 컨테이너에 종속되기때문에 잘안씀)
-DI  (Dependoncy Injection)
  Spring, PicoContainer
    1. Setter Injection
    2. Constructor Injection
    3. Method Injection

프레임워크 IoC - peuleim-wokeu IoC

DL 과 DI  
DL( Dependency Lookup) - 의존성 검색
  - 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lookup하는것
  컨테이너를 제공하는 API를 쓰기떄문에 특정 API종속됨으로 잘안쓰임..

DI ( Dependency Injection )   - 의존성 주입
   - 각 클래스간의 의존관계를 빈설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해주는것 
   / /주로 DI 사용  : setter injection, construnctor injection , method injection



2. DI의 개념

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

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

DI 장점 : 코드가 단순해진다. // 컨포넌트간의 결합도가 제거된다.
Ex> a class 와 b class 사이에서
a.class에서 new B 를 쓰는게 아니라 
어노테이션이나 XML을 통해  의존관계를 설정해놓으면 
자동적으로 읽어서 의존관계를 주입한다.


DI의 유형
1. Setter Injection - Setter 메서드를 이용한 의존성 삽입
   - 의존성을 입력 받는 setter 메서드를 만들고 이를 통해 의존성을 주입한다.
2. Constructor Injection- 생성자를 이용한 의존성 삽입
   - 필요한 의존성을 포함하는 클래스의 생성자를 만들고 이를 통해 의존성을 주입한다.
3. Method Injection - 일반 메서드를 이용한 의존성 삽입
   - 의존성을 입력 받는 일반 메서드를 만들고 이를 통해 의존성을 주입한다.

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

프레임워크 IoC - peuleim-wokeu IoC

[클래스]에서 바로 [구현클래스]에 접근하는게 아니라, [인터페이스]에 접근한다.
해당 구현 클래스의 정보는 XML(설정파일)에 기술함..
F/W에서 자동적으로 클래스의 의존성을 삽입시켜줌


Hello 에서 String Printer나 Console Printer를 사용할떄
Hello는 String 이나 Console을 객체생성을 하지않고, Interface Printer를 사용한다.
Beans.xml에 어떨때는 String 어떨때는 Console을 쓰도록 설정을 해놓으면
이정보를 통해 런타임에 동적할당을 하여 사용된다.

프레임워크 IoC - peuleim-wokeu IoC

위 코드에는  New StringPrint나 New ConsolePrint는 존재하지 않는다.! 
StringPrint,ConsolePrint의 상위 인터페이스인 Printer 변수를 선언하고
setName, SetPrinter (setter)로 설정해주면 된다.

프레임워크 IoC - peuleim-wokeu IoC

의존관계는 위 XML에 설정파일에 저장한다.
<Bean> 스프링에서 관리하는 자바객체
--> Hello 클래스에서 printer를 의존하고있다 printer에는 StringPrinter//consolePrinter가 있다.

--> 동적할당이 되어 Printer에는 string과 console이 있는걸 연결시켜줌..

Setter는 한번에 1번씩만 의존성투입받을수있다!!!


2.Construtor Injection 예제

setter 는 한번에 한번씩 --> 개선 

프레임워크 IoC - peuleim-wokeu IoC

프레임워크 IoC - peuleim-wokeu IoC

첫번째 = Spring
두번째 = printer  ---사실은--> <bean id ="printer" class = "bean.StringPrinter"/>



3. Spring DI 컨테이너

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

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

프레임워크 IoC - peuleim-wokeu IoC



BeanFactory와 AppliectionContext

-BeanFactory
    > Bean은 등록, 생성, 조회, 반환 관리함
    > 보통은 BeanFactory를 바로 사용하지 않고, 이를 확장한 Applictioncontext를 사용함
    > getBean() 메서드가 정의되어있음
  // 바로사용하지않고 application context 주로 사용함
-Application Context
   > Bean을 등록, 생성, 조회, 반환 관리하는 기능은 BeanFactory와 같음
   > Spring의 각종 부가 서비스를 추가로 제공함
   > Spring이 제공하는 ApplicationContext 구현 클래스가 여러가지 종류가 있음.

프레임워크 IoC - peuleim-wokeu IoC

ApplicationContext가 Di Container라고 볼수 있다. 



IOC(inversion of Control)
 - 제어의 역전 ioc 컨테이너, DL, DI
Di(Dependcy injection)
 - 클래스 간의 의존관계를 컨테이너가 주입
 - Setter Injection , Constructor injection
Spring DI 컨테이너
 - BeanFactory, ApplicationContext