본문 바로가기

Spring/MVC

스프링 IOC 컨테이너 연동

서블릿에 스프링 넣어보기

 

스프링 사용한다는 이야기는 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를 서블릿 컨텍스트에 등록해준다.

 

서블릿 컨텍스트에서 application context를 넣어주고 있는 모습

어플리케이션 컨텍스트의 initWebApplicationContext 가 있는데 

Root 로 application contex를 만들고 있다.

이 이름으로 만들어 쓰고 있어서 이걸로 꺼내 쓸 수 있다.

 

로 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