DIspatcherServlet과 스프링 컨테이너
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
config.MvcConfig
config.ControllerConfig
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
위의 web.xml 소스를 보면 DispatcherServlet의 contextConfigLocation 초기화 파라미터를 이용해서 스프링 설정 클래스 목록을 전달했습니다. DispathcerServlet은 전달받은 설정 파일을 이용해서 스프링 컨테이너를 생성하는데 HandlerMapping, HandlerAdapter, 컨트롤러, ViewResolver 등의 빈은 DispatherServlet이 생성한 스프링 컨테이너에서 구합니다. 따라서 DispatherServlet이 사용하는 설정 파일에 빈에 대한 정의가 포함되어 있어야 합니다.
DispatcherServlet은 스프링 컨테이너를 생성하고, 그 컨테이너로부터 필요한 빈 객체를 구한다.
@Controller를 위한 HandlerMapping과 HandlerAdapter
@Controller 적용 객체는 DispatcherServlet 입장에서 보면 한 종류의 핸들러 객체입니다.
DispatcherServlet은 웹 브라우저의 요청을 처리할 핸드러 객체를 찾기 위해 HandlerMapping을 사용하고 핸들러를 실행하기 위해 HandlerAdapter를 사용합니다. DispatcherServlet은 스프링 컨테이너에서 HandlerMapping과 HandlerAdapter 타입의 빈을 사용하므로 핸들러에 알맞은 HandlerMapping 빈과 HandlerAdapter 빈이 스프링 설정에 등록되어 있어야 합니다.
package config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/view/", ".jsp");
}
}
위의 코드에서는 HandlerMapping이나 HandlerAdater 클래스를 빈으로 등록하는 코드를 작성하지 않고 @EnableWebMvc 어노테이션만 추가했습니다. 해당 어노테이션 하나로 매우 다양한 스프링 빈 설정을 추가해 줄 수 있습니다.
해당 어노테이션에 RequestMappingHandlerMapping, RequestMappingHandlerAdapter가 포함되어 있습니다.
RequestMappingHandlerMapping 은 @Controller 어노테이션이 적용된 객체의 요청 매핑 어노테이션(@GetMapping) 값을 이용해 웹 브라우저의 요청을 처리할 컨트롤러 빈을 찾습니다.
RequestMappingHandlerAdapter는 컨트롤러의 메서드를 알맞게 실행하고 그 결과를 ModelAndView 객체로 변환해서 DispatcherServlet에 리턴합니다.
컨트롤러 코드
package chap09;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model,
@RequestParam(value = "name", required = false) String name) {
model.addAttribute("greeting", "안녕하세요, " + name);
return "hello";
}
}
RequestMappingHandlerAdapter 는 "/hello" 요청 경로에 대해 hello() 메서드를 호출합니다. 이때 Model 객체를 생성해서 첫 번째 파라미터로 전달합니다. name 파라미터를 HTTP 요청 파라미터의 갓을 두 번째 파라미터로 전달합니다.
RequestMappingHandlerAdapter는 컨트롤러 메서드 결과 값이 String 타입이면 해당 값을 뷰 이름으로 갖는 ModelAndView 객체를 생성해서 DispatcherServlet에 리턴합니다. 첫 번째 파라미터로 전달한 Model 객체에 보관된 값도 ModelAndView에 함께 전달하고, hello 뷰를 사용합니다.
'Spring' 카테고리의 다른 글
[Spring] JSP를 위한 ViewResolver (0) | 2024.04.08 |
---|---|
[Spring] WebMvcConfigurer 인터페이스와 설정 (0) | 2024.04.03 |
[Spring] controller와 handler (0) | 2024.04.01 |
[Spring] 스프링 MVC 핵심 구성 요소 (0) | 2024.04.01 |
[Spring] Spring MVC - 컨트롤러와 JSP (0) | 2024.03.26 |