IoC Container
- 자바 Configuratio file 로 web.xml 로 대체가 가능하다.
- <context-param> 을 통해서 AnnotationConfigWebApplicationContext 로 바꿔준뒤 (왜냐면 우리는
@Configuration
를 사용할 것이기 때문에)
- 추가 해준뒤 <context-param> 에 contextConfigLocation 을 해준뒤 해당 위치를 추가해준다.
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.
AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>ConfigurationFilePath</param-vlaue>
</context-param>
- 이렇게 해서 실행시키게 되면
ContextLoaderListener
가 AnnotationConfigWebApplicationContext
를 생성할 때 ConfigurationFilePath
를 기반으로 해당 객체를 생성하게 됩니다. 그러면 ConfigurationFilePath
에 적혀있는 Bean
파일들이 해당 Context 안에 존재하게 됩니다.
- 이 과정은 Spring 본문 옮기기 를 참조하여 읽으면 좋다. (내가 번역하고 있는 건데.. 오역이 있을 수도 있다. 확실히 MVC 를 공부하면서 저걸 참조하여 보니 더 공부가 잘된다. 조금이라도 번역해두길 잘했다.)
- 코드를 살펴보면
WebApplicationContext
가 초기화 되는 시점에 ROOT_WEB_APPLICATION_CONTEXT_ ATTRIBUTE
를 Application Context
를 등록하는데 우리가 이 ROOT_WEB_APPLICATION_CONTEXT
_ATTRIBUTE
로 꺼내쓸수 있는 것이다.
ApplicationContext ac = getServletContext().getAttribute(ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
- 이제야 IoC 에 대해서 조금씩 이해가 오기시작한다. 그니까 우리가
Bean
을 만들고 관리하는 것이 아닌 IoC Container
에 맡긴 뒤 우리는 해당 컨테이너에서 받아와서 쓰는 입장이 되는것이다. 그래서 Inversion of Controll (제어의 역전) 이라고 부르는 것 같다.
Front Controller
- 우리는 Servlet 을 추가해줄 때 마다 Web.xml 에 해당 정보를 추가해주어야 한다. (이런것도 일련의 중복이라고 볼 수 있겠다.)
- 여하튼 이렇게 하다보면 동일작업을 처리해줘야 하는 일도 생길 수 있는데, 그 때 마다 Filter 로 하기에는 너무 복잡하고, 계속하여 중복될 것이다. 그래서
FrontController
라는 개념이 등장하게 되었다.
- 만약 Client 로 부터 Request 가 들어오면
FrontController
가 해당 요청을 처리해야할 Controller
에게 Dispatch
해준다. Spring 은 해당 FrontController 를 Dispatcher Servlet
으로 구현해 두었다.
Root WebApplicationContext
- DispatcherServlet 안에서 만드는 Servlet 이나 그런것들은 DispatcherServlet 안으로 Scope가 제한된다. 그래서 다른 DispatcherServlet 에서는 해당 DispatcherServlet 에 대해 모르고 있다. 그런데 우리가 DispatcherServlet 간 같은 정보를 공유해야 할 때가 있는데 그래서 RootWebApplicationContext 를 구분지어 놓은 것이다. 해당
RootWebApplicationContext
의 내용은 서로 다른 DispatcherServlet 에서도 공유되어 사용될 수 있다. 그래서 RootWebApplicationContext
에 담긴 정보는 Web 에 관한 정보는 없으며, Service 와 Repositories 에 관련된 정보들이 존재한다.
Servlet WebApplicationContext
- 여기에는 Dispatcher Servlet 안에서 생긴 Bean 들이 존재하는데
Controllers
, ViewResolver
, HandlerMapping
등 웹과 관련된 빈들의 정보가 담긴다.
위의 두 얘기를 살짝 종합하면..
- Service, Repositories 등등은 ContextLoaderListener 쪽에 등록되어야 하고, Controller, ViewResolver, HandlerMapping 등은 이제 Dispatcher 쪽에 등록되어야 한다. 아래에서 init-param 을 통해서 해당 과정을 구현해볼 것이다.