서블릿에 스프링 넣어보기
스프링 사용한다는 이야기는 2가지의 경우에 해당 된다.
1. 스프링이 제공하는 IOC 컨테이너를 사용한다.
2. MVC 를 사용한다는 말
먼저 우리가 만든 서블릿에서 스프링이 제공하는 IOC 컨테이너를 활용하는 방법을 알아보자
webmvc 를 추가하게 되면 거기에 해당되는 디펜던시들이 같이 설치 되게 된다
이 후 web.xml 에 스프링이 제공해주는 리스너가 있다.
ContextLoaderListener 를 추가 해준다 .
이게 해주는게 뭐냐면 application Context를 서블릿 애플리케이션에 생명주기에 맞춰서 바인딩 해주는 것
(웹 어플리케이션에 등록 되어 있는 서블릿들이
application Context를 사용 할 수 있도록 서블릿 컨텍스트에 등록해준다.
종료 될때 application Context를 제거 해주고)
서블릿 컨텍스트의 라이프사이클에 맞춰서 application Context를 연동해주는 핵심적인 리스너라고 할 수 있다.
여기서 서블릿 컨텍스트란? 모든 서블릿들 끼리 사용 할 수 있는 공용의 정보를 저장하고 있는 저장소
근데 application context 를 만든다는 것은 스프링 설정 파일이 필요하다는 것
그럼 , 이제 application context 의 java 설정 파일을 만들어 보자
자바 설정 파일을 생성시켜준 후
Context-param 에 AnnotationConfigWebApplicationContexrt 를 추가해주고
context-param 에 설정파일 위치를 적어준다.
param-value에 AppConfig 으로
이렇게 설정을 하면 ContextLoaderListener 가 AppConfig 설정을 따라서
AnnotationConfigWebApplicationContexrt 를 만든다
*
web.xml 은 내용들의 위치가 중요한데
이 IOC 컨테이너를 활용하는 방법에서는 (아직 MVC는 아님 )
<web-app> 안에서
<filter> 보다는 <context-param> 위치가 앞에 있어야 한다.
*
ContextLoaderListener 가 application context를 서블릿 컨텍스트에 등록해준다.
어플리케이션 컨텍스트의 initWebApplicationContext 가 있는데
이 이름으로 만들어 쓰고 있어서 이걸로 꺼내 쓸 수 있다.
로 ApplicationContext 를 가져올 수 있다.
이렇게 사용을 하면 application context에서 직접적으로
HelloService 라는 빈을 가져 올 수 있다.
---이런 IOC 컨테이너 를 썻을때 불편 한 점----
서블릿을 만들 때 마다
서블릿을 계속 추가 해야된다.
또 여러 서블릿에서 공통으로 사용하고 싶은게 생길 수 있는데,
필터로 해결할 수 잇지만, 이걸 해결하기 위해 나온 디자인 패턴 중 하나가 Front Controller 라는게 있다.
모든 요청을 컨트롤러 하나가 받는 것
이 프론트 컨트롤러가 해당 요청을 처리할 컨트롤러들에게 분배를 하는것 (dispatch 하는 것 )
이게 바로 스프링 MVC 가 구현을 해놓은 핵심적인 클래스 DispatcherServelet 이다
이미지로 봐보면 밑 이미지에서 서블릿 컨텍스트에 등록되어 있는 application Context가 바로 Root WebApplicationContext 다
Dispatcher Servelet
디스패쳐 서블릿은 우리가 만든 Application Contect 를 상속받는 Application Context 를 다시 만든다.
이렇게 상속 관계를 만드는 이유는
저 Root WebApplicationContext 는 여러 다른 서블릿들이 공용으로 사용할 수 있다
반면에 Servelet WebApplicationContext 는 디스패처 서블릿에서만 한정으로 사용된다.
(저 2개의 어플리케이션 컨텍스트들은 스코프가 다르다
ContextLoaderListener 가 만든 Root Application Context 는
공용이라 모든 서블릿이 쓸 수 있는데,
디스패서 서블릿이 만든 application Context는 해당 디스패처 서블릿이 가지고 있는 서블릿만 사용 가능하다.)
혹시라도 디스패처 서블릿을 여러개 만들어야 하는 경우에 , 또 이 디스패처 서블릿들이 공용으로 써야 될 빈들이 있는 경우들도 커버 할 수 있도록 상속 구조로 되어 있다.
그래서 저 이미지를 봐보면,
web 과 관련된 controller .. 등 의 서블릿 들은 디스패처 서블릿 안에 있고
나머지 service 나 repository 는 root application context 에 있다.
'Spring > MVC' 카테고리의 다른 글
Dispatcher Servlet (0) | 2020.02.08 |
---|---|
스프링 MVC 연동 (0) | 2020.02.07 |
서블릿 리스너와 필터 (0) | 2020.02.06 |
서블릿 애플리케이션 (0) | 2020.02.05 |
서블릿이란? (0) | 2019.11.17 |