[Spring] Spring Web MVC

SHINYEJI·2023년 10월 19일
0

Back-End

목록 보기
3/24

Spring MVC 특징

  • Spring은 DI나 AOP같은 기능 뿐만아니라, Servlet기반의 WEB개발을 위한 MVC Framework를 제공한다.

📌 Spring MVC 요청 흐름

🔴 DispatcherServlet
1. 클라이언트의 요청의 매핑되는 Controller를 HandlerMapping객체를 통해 찾는다.
2. 해당 Controller에게 요청을 넘기고 요청 결과를 받는다.
3. 요청 결과를 ViewResolver객체 넘기고 클라이언트에게 보여줄 viewd의 jsp 경로를 받는다.
4. ViewResolver로부터 얻은 View의 경로를 알기 때문에 View를 생성할 수 있다.

🔴 HandlerMapping

  • 클라이언트의 요청 URL을 어떤 Controller가 처리할지 결정한다.

🔴 Controller

  • 클라이언트의 요청을 처리한 후, 결과를 DispatcherServlet으로 반환한다.
    • Model And View를 저장하고, View의 논리 이름(요청할 jsp 파일명)을 return한다.

      Model And View
      : Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체

    @RequestMapping(value = "/", method = RequestMethod.GET)
     public String home(Locale locale, Model model) {
         ...
        model.addAttribute("serverTime", formattedDate );
        return "home";
     }

🔴 ViewResolver

  • Controller가 리턴 한 뷰 이름을 기반으로 보여줄 View의 물리적 경로를 결정한다.
    		<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    		<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    			<beans:property name="prefix" value="/WEB-INF/views/" />
    			<beans:property name="suffix" value=".jsp" />
    		</beans:bean>

🔴 View

  • Controller의 처리 결과를 보여줄 응답화면을 생성하여 클라이언트에게 보낸다. (jsp파일)

📌 Spring Web 프로젝트 실행 순서

  1. 프로젝트 구동 시, tomcat에 의해 Servlet Container 생성된다.
    1-1. Servlet Container는 web.xml을 읽어서 초기화한다.
    web.xml을 초기화 한다는 것은, 아래와 같다.
  2. ContextLoaderListener 객체가 생성된다.
    2-2. ContextLoaderListenerWebApplicationContext(Root Spring Container)를 생성하고 관리한다.
    2-3 WebApplicationContext/WEB-INF/spring/root-context.xml을 읽어서 Bean으로 만들어야 할 객체가 있다면 Bean객체로 등록한다.
  3. DispatcherServlet 객체를 생성한다.
    3-1. DispatcherServlet 초기화 시에 servlet-context.xml(Spring Container)을 읽어 WebApplicationContext(Spring Container)을 생성한다.

    🤔 여기서 WebApplicationContext(Spring Container)가 2개 생성되는 이유 ❓
    ContextLoaderListener가 Root WebApplicationContext를 생성 및 관리하고,
    DispatcherServlet가 servlet WebApplicationContext를 생성 및 관리한다.


    Root WebApplicationContext는 주로 애플리케이션의 비즈니스 로직, 서비스, DAO와 같이 핵심 비즈니스 구성요소를 로드하는데 사용된다. 또한 애플리케이션 전체에 걸려 공유되는 Bean을 정의하는데 사용된다.
    Servlet WebApplicationContext는 Servlet에 대한 , Controller, View, Resolver, Handler Mapping등 웹 관련 Bean을 로드하는 데 사용된다.
    또한 각 Servlet마다 별도의 Servlet WebApplicationContext를 가질 수 있으며, 각 Servlet 자체 설정 파일을 가질 수 있다.

web.xml 파일

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
	</context-param>
	
  	<!-- ContextLoaderListener가 생성 -->
	<!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

    <!-- DispatcherServlet가 생성 -->
	<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

</web-app>

0개의 댓글