Spring Web MVC는 Servlet API를 기반으로 구성된 웹 개발 프레임워크이다.<annotation-driven />
<resources mapping="/resources/**" location="/resources/" />
<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="dev.mvc.spring" />
</beans:beans>
<annotation-driven> 어노테이션 기반으로 동작하고
정적 리소스(image, css 등)가 위치한 폴더예를들면, 요청에 맞는 컨트롤러를 찾는것은 HandlerMapping.java가 담당하고, 컨트롤러 정보를 HandlerAdapter가 컨트롤러를 실행시킨다. 이런식으로 다른 클래스들과 상호작용하면서 실제 요청을 처리한다.
<web-app>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-context.xml</param-value>
</context-param>
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
</web-app>
<servlet> 블럭을 보면 DispathcerServlet을 빈으로 등록하고 있고, Servlet-mapping으로 /app 요청으로 오는 요청을 DispatcherServlet이 요청을 받게된다.
한마디로 우리가 쉽게 사용하는 @Controller, @Service, DAO 같은 의존성들을 탐색하고, 실행시켜주는 전반적인 과정들이 이렇게 추상화되어 있는것이다.
package com.example.demo.controller;
import com.example.demo.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
private final HelloService helloService;
@Autowired
public HelloController(HelloService helloService) {
this.helloService = helloService;
}
@GetMapping("/hello")
public ModelAndView sayHello() {
// 서비스 계층을 통해 DB에서 결과 값을 가져옴
String result = helloService.getHelloMessage();
// ModelAndView 객체 생성
ModelAndView modelAndView = new ModelAndView();
// 결과 값을 모델에 추가
modelAndView.addObject("message", result);
// 뷰 이름 설정 (DispatcherServlet이 /WEB-INF/views/list.jsp로 포워딩)
modelAndView.setViewName("list");
return modelAndView;
}
}
Annotaion 기반으로 핸들러를 맵핑해보자.@Component(value = "/mice")
public class HomeController {
@Controller // 클래스 레벨에 작성(class키워드 위에 작성한 Annotation)
public class HomeController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);