
MVC 프레임워크의 흐름은 다음과 같다.
DispatcherServlet이 모든 연결을 담당하며, 웹 브라우저로부터 요청을 받음HandlerMapping Bean 객체에게 컨트롤러 검색을 요청HandlerMapping은 클라이언트의 요청 경로를 이용해 컨트롤러 Bean객체를 DispathcerServlet에게 전달HandlerAdapter Bean에게 요청 처리를 위임HandlerAdapter는 컨트롤러의 알맞은 매서드를 호출해 요청을 처리ModelAndView라는 객체로 DispathcerServlet에게 반환ViewResolver Bean 객체를 사용ViewResolver는 ModelAndView 내부에 있는 뷰 이름에 해당하는 View 객체를 찾거나 생성후 리턴응답 결과 생성을 요청컨트롤러DispathcerServlet는 클라이언트의 요청을 전달받는 창구 역할HandlerMapping은 특정 요청 경로를 처리해주는 핸들러를 찾아주는 역할HandlerAdapter는 핸들러의 처리결과를 ModelAndView 객체로 변환하여 DispathcerServlet에게 전달 // ControllerConfig.java
@Configuration
@EnableWebMvc
public class MvcConfig{
...
}
@EnableWebMvc 어노테이션을 통해 HandlerMapping이나 HandleAdapter 설정을 자동으로 추가 // HelloController.java
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model,
@RequestParam(value = "name", required = false) String name)
{
model.addAttribute("greeting", "안녕하세요, " + name);
return "hello";
}
}
@EnableWebMvc 어노테이션은 @Controller 타입의 핸들러 객체를 처리하기 위한 클래스를 포함RequestMappingHandlerMapping이며, @GetMapping 어노테이션 값을 이용해서 웹 브라우저의 요청을 처리할 컨트롤러 Bean을 찾음
GET & POST는 여기를 참조
요청 경로에 대해 hello() 매서드를 호출Model 객체를 생성해 첫 번째 파라미터로, HTTP 요청 파라미터를 두 번째 파라미터로 전달RequestMappingHandlerAdapter는 컨트롤러 매서드 결과 값이 String 타입이면,ModleAndView 객체를 생성해 DispatcherServlet에 리턴
위의 예제에서 결국 뷰의 이름은
hello가 된다.
JSP를 이용해서 생성하기 위해 다음 설정을 사용
// MvcConfig.java
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
...
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/view/", ".jsp"); // 접두사, 접미사 설정
}
}
WebMvcConfigurer 인터페이스에 정의된,
jsp() 매서드를 이용해 ViewResolver를 설정가능뷰 이름에 해당하는 객체를 요청
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver vr =
new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/view/");
vr.setSurfix(".jsp");
return vr;
}
"prefix + 뷰이름 " surfix"에 해당하는 경로를 할당JSP 코드를 실행하여 결과 생성'/'로 설정
<!-- web.xml -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
모든 요청을 DispatcherServlet이 처리찾을 수 없음configureDefaultServletHandling() 매서드를 사용하는 것이 편리
// MvcConfig.java
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling
(DefaultServletHandlerConfigurer configurer)
{
configurer.enable();
}
...
enable() 매서드는 다음의 두 Bean 객체를 추가
DefaultServletRequestHandlerSimpleUrlHandlerMappingDefaultServletRequestHandler는 클라이언트의 모든 요청을 WAS가 제공하는 디폴트 서블릿에 전달
“/index.html”에 대한 처리를 결국
디폴트 서블릿이 처리하도록 만듦
그리고 SimpleUrlHandlerMapping를 이용하여 모든 경로(“/**“)를 DefaultServletHttp RequestHandler를 이용해 처리하도록 함
HandlerMapping의 적용 우선순위가 enable() 매서드가 등록하는 디폴트 핸들러보다 높음RequestMappingHandlerMapping을 사용해 요청 처리할 핸들러 검색
SimpleUrlHandlerMapping을 사용해 요청을 처리할 핸들러 검색
DefaultServletHttpRequestHandler를 리턴요청디폴트 서블릿에 처리를 위임
예를 들어 “/index.html” 경로로 요청이 들어오면, 1과정에서 해당하는 경로를
찾지 못하므로,
2과정을 통해디폴트 서블릿이 /index.html 요청을 처리하게 됨