Spring Dispatcher
0. 웹에서 들어오는 입구를 하나로...
특징
모든 요청을 1개가 다 받자.
dispatcherServlet은 모든 요청을 받고 특정 URL 패턴의 요청만 받도록 제한도 가능.
Dispatcher Servlet은 요청이 들어오면 핸들러에게 어떤 컨트롤러를 불러올지 물어봄.
이렇게 분리되어있는 로직은 Dispatcher Servlet의 과부하를 줄여주고 보안성을 높임
1. request가 Dispatcher Servlet에 들어오면
2. Dispatcher Servlet은 해당 요청을 처리할 컨트롤러를 찾기 위해 Handler Mapping의 도움을 받는다.(xml, 객체모두를 이용할 수 있으나 현재는 객체를 이용하는 게 더 많음)
2-1. 핸들러 매핑에서 적당한 컨트롤러를 찾아 매핑(delegate request, 포워딩, 위임함)
3. 요청을 수행할 컨트롤러에게 해당 요청에 대한 비즈니스 로직 기능을 수행하도록 지시(handleRequest())
4. 컨트롤러는 모델앤뷰 객체를(스트링 객체를 반환하거나) 반환한다.
4-1. Model : 전달해줄 정보, 스프링이 자동으로 Request 객체에 넣어주고 View에 보여줄 수 있게 만든다.
4-2. View : jsp 등 view에 사용되는 웹 언어/형식(jsp의 위치가 어디냐) board/list.jsp인데 여기서 list인 값만 리턴
5 컨트롤러는 이름(list)만 반환하기 때문에 뷰리졸버를 이용해 데이터와 결합
5-1. 대표적으로 prefix, suffix 등(list가 들어오면 -> board/list.jsp로 변환해줌)
5-2. 뷰의 위치를 정해서 최종적으로 보냄
5-3. 뷰의 역할을 하는 객체에 포워딩하는 것, 이름만 넘기도록 약속한 것.
5-4. 뷰 리졸버는 실제 뷰들 포워딩함
6 뷰에서 보여준다.
src/main/java 아래에...
package com.grindman.web.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RootApplicationContextConfig {
}
package com.grindman.web.config;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.DispatcherServlet;
public class WebInitializer implements WebApplicationInitializer {
private static final String CONFIG_LOCATION = "com.grindman.web.cofing";
private static final String MAPPING_URL = "/";
public WebInitializer() {
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
WebApplicationContext context = getContext();
// encoding filter 설정
EnumSet<DispatcherType> dispatcherTypes = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD);
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
FilterRegistration.Dynamic characterEncoding = servletContext.addFilter("characterEncoding", characterEncodingFilter);
characterEncoding.addMappingForUrlPatterns(dispatcherTypes, true, "/*");
// dispatcher servlet 설정
servletContext.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping(MAPPING_URL);
}
private AnnotationConfigWebApplicationContext getContext() {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setConfigLocation(CONFIG_LOCATION);
return context;
}
}
package com.grindman.web.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.grindman.web.controller"})
public class ServletContextConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResoler() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
컨트롤러
@GetMapping(path = "/")
public String hello(Model model) {
return "hello";
}
hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>FROM "hello" controller</h1>
</body>
</html>
출처
realzero0.github.io/study/2017/07/05/Boost_Camp-_Spring_Dispatcher_%EC%A0%95%EB%A6%AC.html
[Boost_Camp] Spring Dispatcher 정리
안녕하세요~ Jay의 블로그입니다.
realzero0.github.io
--------------------------------
따라 치는데 문득 xml로 설정 연습코딩을 했던 기억이 떠올라서 위로 가보니 역시나..(xml이냐 자바 config냐)
아무튼 중요한건 dispatcher의 역할과 뷰리졸버