Spring MVC 의 흐름과 주요 컴포넌트, 웹 서비스 흐름
Spring MVC 의 흐름과 주요 컴포넌트, 웹 서비스 흐름
이번 포스팅은 기본으로 돌아가서 Spring MVC 흐름을 보면서 주요 컴포넌트가 어떻게 동작하는지
알아보도록 하겠습니다.
브라우저에서 URL를 입력하면 OS의 인터넷 프로토콜에 설정된 DNS 서버 주소로 URL이 전달됩니다.
그럼 DNS서버는 URL주소와 매핑된 IP, PORT로 해당 Request를 전달하게됩니다.
(DNS에 대한 정보는 아래의 Link를 참고하세요.)
Link : https://aljjabaegi.tistory.com/567
전달된 IP:PORT 에 WAS(Web Application Server)가 동작중이라면 (Filter 설정이 있다면 Filter를 거쳐)
Spring MVC의 dispatcher-servlet이 요청을 받게됩니다.
Dispatcher-servlet은 HandlerMapping 이라는 과정을 통해
URL을 어떤 Controller가 처리할지를 결정하고
HandlerAdaptor는 결정된 Controller를 실행하게 됩니다.
(Interceptor 설정이 있다면, Controller 실행 전 Interceptor가 실행됩니다.)
HandlerAdaptor는 실행한 Controller의 결과를 ModelAndView로 변환해서 리턴하게 되며
(AOP 설정이 있다면, Controller를 감싼 Proxy Pattern으로 AOP 메소드가 실행됩니다.)
Dispatcher-servlet은 Controller의 실행 결과를 보여줄 View를 ViewResolver를 통해 검색하여
브라우저로 전송하게 됩니다.
(AOP에 대해서는 아래의 Link를 참고)
https://aljjabaegi.tistory.com/595
Spring MVC Framework를 쓰면 HandlerMapping과 HandlerAdaptor, ViewResolver의 코드를
개발자가 직접 구현하지 않고, Spring Container가 IoC, DI 를 통해 처리해주기 때문에 개발자는 좀 더 비지니스 로직 구현에 집중할 수 있게 됩니다.
이제부터는 WAS 이후의 처리를 좀 더 자세하게 알아보도록 하겠습니다.
WAS가 구동이되면 Application의 web.xml 파일을 가장 먼저 로드하게 되는데
web.xml 에는 Filter, Spring MVC, DispatcherServlet 설정 등이 포함되어야 합니다.
Filter 설정
Filter는 dispatcher-servlet 설정 이전에 실행되기 때문에 Spring Bean이나 Controller의 요청/응답에 대해서는 컨트롤 할 수 없습니다. 단순히 URL 패턴에 따른 인코딩 설정이나 보안관련 설정을 하게 됩니다.
아래는 인코딩 Filter 설정 부분입니다.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
Listener 설정
Listener는 dispatcher-servlet 설정 이전에 비지니스 레이어의 Spring 설정 파일을 로드 합니다.
conetext-param 태그로 설정파일의 경로를 설정하지 않은 경우 /WEB-INF/aplicationContext.xml 파일을 로드합니다.
Listener는 dispatcher-servlet 설정 이전에 pre-loading되는 객체로 dispatcher-servlet에서 실행하는 Controller를 제외하고 참조하는 객체들을 인스턴스화 하는 역할을 하게 됩니다. (Service, Repository or Mapper, DB관련, AOP 등)
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/context-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
DispatcherServlet 설정
Spring 등장 이전에는 모든 URL 요청에 대한 Controller 매핑을 서블릿으로 설정해주어야 했습니다. Spring이 등장하면서 모든 Servlet의 역할이 DispatcherServlet 하나로 통합됩니다.
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/springmvc/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
web.xml의 dispatcher-servlet 설정부분 입니다.
FrameworkServlet 클래스를 상속 받은 DisaptcherServlet 클래스의 contextConfigLocation 초기화 파라메터로 .xml 파일을 지정합니다. 설정파일이 여러개일 경우 콤마(,), 공백(" "), 탭(\t), 줄 바꿈(\n), 세미콜론(";") 을 이용해서 param-value 태그 내에 추가해주시면 됩니다.
servlet-mapping 태그를 통해 특정 URL 패턴일 경우만 Dispatcher-servlet으로 전달 할 수 있게 설정할 수 있습니다.
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
.do라는 Url-pattern에 대해서 action 서블릿으로 전달하는 설정입니다.
dispatcher-servelt.xml 파일 내에는 위에서 말씀드린 HandlerMapping, HandlerAdaptor, ViewResolver 의 구현체를 Spring Bean에 등록해 주어야 합니다.
xml 파일 내에 RequestMappingHandlerAdapter, RequestMappingHandlerMapping 을 Bean으로 따로 등록하지 않고 <mvc:annotation-driven> 태그만 설정해도 됩니다. 해당 태그는 위 두 클래스의 Bean 등록 외에 JSON이나 XML 등 요청/응답 처리를 하는 변환 모듈이나 데이터 바인딩 처리를 위한 ConversionService 등을 Bean으로 등록해주는 역할을 합니다. <mvc:annotation-driven> 태그를 추가하여도 viewResolver는 등록 해주셔야 합니다.
JSP를 이용해서 뷰를 생성할 때는 InternalResourceViewResolver 구현체를 사용하고 논리적인 뷰의 이름과 실제 뷰 객체의 이름이 같을 때는 UrlBasedViewResolver 구현체를 사용합니다.
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
Spring MVC 흐름 정리
(1~9 이후 순서는 Service-> Service Implements -> Repository or Mapper -> Database 후 역순으로 진행)