Spring IoC 컨테이너 연동

Spring Web MVC

백기선님의 강의인 Spring Web MVC 강의를 듣고 공부한 내용을 정리한 글

Spring IoC 컨테이너 연동

Spring을 사용한다는 것은 두 가지 의미가 있다.

  1. 스프링이 제공하는 IoC 컨테이너를 사용하겠다.

  2. 스프링 MVC를 사용하겠다.

1번부터 살펴보자.

서블릿에서 스프링이 제공하는 IoC 컨테이너를 활용하기 위해서는

리스너로 ContextLoaderListener를 등록해야한다.

ContextLoaderListener의 역할은 ApplicationContextServlet Application의 생명주기에 맞춰서 바인딩한다.

그러기 위해 ApplicationContext를 만들고 Servlet Container에 등록하면 Servlet Context에서 Application Context를 꺼내올 수 있고, Application Context에서 빈으로 등록된 객체를 가져올 수 있다.

그런데, Servlet을 만들때 마다 불편한 점은 요청 하나 당 (url 당) web.xml에 일일이 Servlet을 추가해줘야 한다.

이는 상당히 귀찮고 불편한 작업이다.

그리고 여러 Servlet에 공통적으로 처리해주고 싶은 부분이 있는 경우 Servlet만으로는 요구사항을 충족하기 어렵다. (물론 Filter를 써도 되긴 하지만…)

그래서 Spring MVC에서는 DispatcherServlet이라는 것을 제공해주는데, 이는 디자인 패턴의 하나인 Front Controller의 역할을 담당한다.

모든 요청을 하나의 Controller가 받아 처리하고, 이 Controller가 해당 요청을 처리할 핸들러에게 요청을 분배해주는 기능을 담당하는 것이 DispatcherServlet의 역할이다.

이러한 분배를 영어로 Dispatch라고 표현한다.

DispatcherServletMVC의 가장 핵심적인 Servlet이다.

DispatcherServlet은 여러개 만드는 것이 가능하기 때문에 기본적으로 DispatcherServlet 내부에는 다음과 같은 형태를 띈다.

스크린샷 2020-03-28 오후 10 12 20

Servlet Context에 등록된 Application ContextRoot WebApplicationContext이다.

DispatcherServletRoot WebApplicationContext 상속받아 구현한 것이 Servlet WebApplicationContext이다.

이러한 상속 관계를 갖는 이유는, Root WebApplicationContext를 다른 Servlet에서 공용으로 사용할 수 있기 때문이다.

반면에 DispatcherServlet이 만든 Servlet WebApplicationContext은 해당 DispatcherServlet 내부에서 사용 가능하다. Scope이 다르다는 이야기다.

만약 DispatcherServlet를 여러개 만들어야하는 경우, 독립적인 Scope를 갖게 하기 위해 이러한 상속구조를 만들게 된 것이다.

Root WebApplicationContextWeb과 관련된 빈들을 관리하지 않는다.

왜냐하면 ServiceRepository는 다른 DispatcherServlet에서도 공용으로 사용할 수 있기 때문이고 그래서 Web과 관련된 Bean이 여기에 등록될 필요가 없기 때문이다.

DispatcherServlet이 만드는 Servlet WebApplicationContext에는 Web과 관련된 Bean들이 등록되어 있다.

물론 굳이 상속을 받지 않고 DispatcherServletRoot WebApplicationContext에 모든 빈을 등록해서 사용해도 상관은 없다.

백기선님 피셜로는 DispatcherServlet이 여러개인 경우는 거의 없다고 한다.

일반적으로는 DispatcherServlet 하나만 사용하고, 그 안에 있는 Root WebApplicationContext에 모든 빈들을 등록해서 사용하는 것이 일반적이라고 한다.

그리고 주의할 점은, 스프링 부트와 스프링 MVC와는 동작 방법이 조금 다르다.

web.xml에 등록하여 사용하는 방법은 Servlet Container가 실행되고 Servlet Container안에 등록된 WebApplicationContext에다가 Spring을 연동하는 방식을 사용했다.

반대로 스프링 부트의 경우 스프링 부트 Application이 먼저 뜨고, 그 안에 Tomcat이 내장 서버로 실행이 된다.

그래서 스프링 부트에서는 서블릿을 코드로 등록을 한다.

Reference

인프런 백기선님의 스프링 Web MVC



© 2022. by minkuk

Powered by minkuk