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 객체를 추가
DefaultServletRequestHandler
SimpleUrlHandlerMapping
DefaultServletRequestHandler
는 클라이언트의 모든 요청을 WAS가 제공하는 디폴트 서블릿
에 전달
“/index.html”에 대한 처리를 결국
디폴트 서블릿
이 처리하도록 만듦
그리고 SimpleUrlHandlerMapping
를 이용하여 모든 경로(“/**“)를 DefaultServletHttp RequestHandler
를 이용해 처리하도록 함
HandlerMapping
의 적용 우선순위
가 enable() 매서드가 등록하는 디폴트 핸들러
보다 높음
RequestMappingHandlerMapping
을 사용해 요청 처리할 핸들러 검색
SimpleUrlHandlerMapping
을 사용해 요청을 처리할 핸들러 검색
DefaultServletHttpRequestHandler
를 리턴요청
디폴트 서블릿
에 처리를 위임
예를 들어 “/index.html” 경로로 요청이 들어오면, 1과정에서 해당하는 경로를
찾지 못하므로
,
2과정을 통해디폴트 서블릿
이 /index.html 요청을 처리하게 됨