<Spring>Spring MVC Framework

Google 아니고 Joogle·2022년 10월 27일
0

Spring / Spring Boot 

목록 보기
3/5

💡MVC 진행 과정

  1. 클라이언트가 url 을 요청하면 웹 브라우저에서 스프링으로 request 가 보내짐
  2. Dispatcher Servletrequest를 받으면 Handler Mapping을 통해 해당 url을 담당하는 Controller를 탐색 후 찾아냄
  3. 찾아낸 Controllerrequest를 보내주고, 보내주기 위해 필요한 Model을 구성
  4. Model에서는 페이지 처리에 필요한 정보들을 Database에 접근하여 쿼리문을 통해 가져옴
  5. 데이터를 통해 얻은 Model정보를 Controller에게 Response해주면 Controller는 이를 받아 Model을 완성시켜 Dispatcher Servlet에게 전달해줌
  6. Dispatcher ServletView Resolver를 통해 request에 해당하는 view 파일을 탐색 후 받아냄
  7. 받아낸 View 페이지 파일에 Model을 보낸 후 클라이언트에게 보낼 페이지를 완성시켜 받아냄
  8. 완성된 View 파일을 클라이언트에 response하여 화면에 출력

💡구성 요소

Dispatcher Servlet

  • 모든 request를 처리하는 중심 컨트롤러
  • 서블릿 컨테이너에서 http 프로토콜을 통해 들어오는 모든 request에 대해 제일 앞단에서 중앙 집중식으로 처리해주는 핵심적인 역할
  • 기존에는 web.xml에 모두 등록해주어야 했지만 dispatcher servlet이 모든 request를 핸들링하면서 작업을 편리하게 할 수 있음

DispatcherServlet 생성

  1. Dispatcher Servlet은 Spring MVC 프로젝트를 생성한다면, 아래에 경로와 같이 이미 생성되어 있음
  • web.xml
	<!-- 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-INF/spring/appServlet/servlet-context.xml
    1. DispatcherServlet의 매핑 url-pattern이 '/*'일 때, jsp안에서 사용하는 js, css, img 등 resource 파일을 불러오는 데 문제가 생김
    2. resource file만 매핑하기 위해 <resources mapping="/resources/**" location="/resources/" /> 작성
    3. 즉, resource file들은 /resource/ 위치에 만들어 사용해야 함
    4. view의 prefix, suffix 지정 -> @Controller 에서 뷰 리턴시 적용!
      e.g. HomeController 에서 "home" 리턴시 /WEB-INF/views/home.jsp 파일 리턴
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- 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>
	
	<context:component-scan base-package="com.mycom.myboard.controller, com.mycom.myboard.common, com.mycom.myboard.config" />

Handler Mapping

  • 클라이언트의 request url을 어떤 컨트롤러가 처리해야 할 지 찾아서 Dispatcher Servlet에게 전달해주는 역할
  • 컨트롤러 상에서 url을 매핑 시키기 위해 @RequestMapping을 사용하는데, 핸들러가 이를 찾아주는 역할을 함
  • HandlerMethod를 찾아 HandlerMethodExecutionChain으로 감싸서 반환 -> 컨트롤러로 요청을 넘겨주기 위해 처리해야 하는 인터셉터 등을 포함하기 위해

Controller

  • 실질적인 요청을 처리하는 곳
  • Dispatcher Servlet이 front controller라면 이곳은 backend controller 라고 볼 수 있음
  • Model의 처리 결과를 담아 Dispatcher Servlet에게 반환

View Resolver

  • Controller의 처리 결과를 만들 view를 결정해주는 역할
  • 다양한 종류가 있기 때문에 상황에 맞게 활용 해야 함
profile
Born to be happy, Not perfect 🤍

0개의 댓글