IoC 컨테이너와 DI

**IoC(Inversion of Control)
컨테이너가 코드 대신 오프젝트에 대한 제어권을 갖고 있다.
IoC 담당하는 컨테이너를 Bean Factory 또는 Application Context.
오프젝트 생성과 런타임 관계를 설정하는 D.I (Dependency Injection)관점으로 볼 땐 컨테이너는 Bean Factory.
스프링은 특정 포맷의 설정에 종속, 제한된적이 없고 어떤 형태로도 빈 설정 메타정보를 작성 가능함.

StaticApplicationContext

학습 테스트용

GenericApplicationContext

ex) junit test . .@contextConfiguration

xml파일 같은 외부 리소스에 있는 빈 설정 메타정보를 BeanDefinitionReader 로 변환하여 읽는다.(구현체로)

ex) XmlBeanDefinitionReader : classpaht: , file: , http: 접두어를 통해 구체적인 리소스 타입 지정가능

일반적인 애플리케이션 구현 클래스

DI를 통해 확장할 수 있게 설계되어 있다 

GenericXmlApplicationContext

XmlBeanDefinitionReader 내장

WebApplicationContext

가장 많이 사용되는 Application Context

웹환경에서 사용할 때 필요한 기능이 추가된 ApplicationContext

서블릿 커네이너가 브라우저로부터 오는 HTTP 요청을 받아서 해당 요청에 매핑되어 있는 서블릿을 실행해주는 방식

서블릿이 일종의 main() 메소드 역할을 하는 셈

서블릿 컨테이너는 브라우저와 같은 클라이언트로 들어오는 요청을 받아서 서블릿을 작동시켜준다.

서블릿은 웹 어플리케이션이 시작될 때 미리 만들어둔 WebApplicationContext에서 빈 오프젝트에 구성된 어플리케이션의 기동 역할을 해줄 빈을 요청해서 받는다. 

DispatcherServlet

이름의 서블릿을 스프링에서 제공

스프링 IoC 컨테이너는 WebApplicationContext 인터페이스를 구현한 것

각자 독립적인 설정정보를 이용해  빈 오브젝트를 만들고 관리함

자신의 부모 컨텍스트에게만 빈 검색 요청 자식 컨텍스트에게는 오청 X

검색 순서는 항상 자신이 먼저, 다음 직계 부모의 순서

자식 컨텍스트의 빈이 부모 컨텍스트 빈과 중복될 때 자식 컨텍스트가 우선한다.

  **프론트 컨트롤러 패턴

많은 웹 요청을 한번에 받을 수 있는 대표 서블릿을 등록해 공통 선행 작업을 수행 후 각 요청의 기능을 담당하는 핸들러라 불리는 클래스를 호출하는 방식

중앙집중식으로 모든 요청을 다 받아서 처리 

일반적으로는

스프링 어플리케이션 컨텍스트를 가지면서 프론트 컨트롤러 역할을 하는 서블릿은 하나만 만들어 사용

Why? 

웹 기술에 의존적인 부분과 그렇지 않은 부분(Bussiness Logic)을 구분하기 위해서이다.
스프링 서블릿을 사용하는 스프링의 웹 기술외의 웹 기술을 고려중일 경우
계층 형태로 구분하는 것이 바람직

Note: 언제든지 확장, 변경, 조합을 사용할 수 있다.

RootApplicationContext

Note: 서블릿 이벤트 리스너를 이용하여 웹 어플리케션이 시작 될 대 
Root ApplicationContext을 만들어 초기화한다.

Spring은 ContextLoaderListener를 제공

default 경로 : /WEB-INF/applicationContext.xml
  • contextConfigLocation을 이용하여 설정 위치를 정할 수 있음.

웹 계층 외의 빈을 정의

서비스 계층과 데이터 엑세스 계층의 빈을 모두 포함하며 각종 기반 서비스 및 기술 설정을 갖는다.

ServletApplicationContext

Note: 스프링 웹 기능 지원 프론트 컨트롤러 서블릿 = DispatcherServlet

default 경로 = ‘/WEB-INF/’+’ServletNamespace’-‘servlet.xml’

서블릿 컨테이너가 등록된 서블릿을 언제 만들고 초기화 시키는 순서 지정
* 웹 계층을 위한 빈의 생성과 소멸을 관리하는 Context
* IoC 컨테이너의 역할
* 오브젝트 생성과 관리
* BeanDefinition 정보를 IoC 컨테이너는 활용한다.

빈 설정 메타정보를 담은 소스는 어떤 식으로 만들어도 상관없다.
스프링은 오브젝트를 컨테이너가 생성하고 관리하는 과정에서 필요한 다양한 방법을 제공