<용어>
HandlerMapping : 여러 개의 핸들러를 찾아주는 역할 수행
HandlerAdapter : 다양한 종류의 핸들러를 호출하는 역할 수행
Model : Map<String, Value> 형태의 데이터 저장소
: HTTP Request 속의 데이터를 파싱해 Key-Value 쌍으로 만들어 저장
: 이후 View를 그리기 위해 사용
View, View Name : ViewResolver에서 그릴 View를 지정
<HTTP 요청에 따른 Spring MVC 처리 흐름>
- 클라이언트가 브라우저를 통해 HTTP 요청을 보냄
- 요청이 DispatcherServlet에 들어옴
- DispatcherServlet에서 HandlerMapping을 통해 요청을 처리할 수 있는 Handler를 조회함
- DispatcherServlet에서 조회한 Handler를 처리할 수 있는 HandlerAdapter 목록에 있는 HandlerAdapter를 조회함
- 조회한 Handler를 HandlerAdapter에 넘겨서 Handler를 호출함
- HandlerAdapter는 ModelAndView 객체를 DispatcherServlet 에 반환함
- DispatcherServlet는 ModelAndView 를 이용해서 viewName을 viewResolver에 보냄
- viewResolver는 View 객체를 DispatcherServlet 한테 반환해줌
- DispatcherServlet는 반환받은 View 객체에 있는 render 메소드를 통해 화면 그려서 클라이언트에 보여줌.
(모델이 여기에 담겨져 있어서 화면 바로 그리기 가능)
DispatcherServlet(Front Controller)
HandlerMapping
Handler(Controller)
ModelAndView
ViewResolver
View
Spring MVC는 HTTP Request를 처리하는 부분인 Controller, 데이터를 처리해 정제된 데이터를 넣는 Model, 정제된 데이터를 활용해 사용자에게 보여지는 View에 대한 역할 분리를 잘 해놓았다. Spring MVC 패턴을 사용하면 Model, View, Controller 모두를 인터페이스를 사용해 규격화해놓아 유연하고 확장성 있게 웹 어플리케이션을 설계할 수 있다.
# HelloResponseController
@GetMapping("/html/dynamic/")
public String helloHtmlFile(Model model) {
visitCount++;
model.addAttribute("visits", visitCount);
return "hello-viist";
}
- Handler mapping에 API path 와 Controller 함수가 매칭되어 있다는 뜻!
- GET /response/html/dynamic
→ HelloResponseController 의 helloHtmlFile() 함수와 연결
package com.sparta.springmvc;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/request")
public class HelloRequestController {
# 1
@GetMapping("/form/html")
public String helloForm() {
return "hello-request-form";
}
# 2
@GetMapping("/star/{name}/age/{age}")
@ResponseBody
public String helloRequestPath(@PathVariable String name, @PathVariable int age)
{
return String.format("Hello, @PathVariable.<br> name = %s, age = %d", name, age);
}
# 3
@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam String name, @RequestParam int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
# 4
@PostMapping("/form/param")
@ResponseBody
public String helloPostRequestParam(@RequestParam String name, @RequestParam int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
# 5
@PostMapping("/form/model")
@ResponseBody
public String helloRequestBodyForm(@ModelAttribute Star star) {
return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age);
}
# 6
@PostMapping("/form/json")
@ResponseBody
public String helloPostRequestJson(@RequestBody Star star) {
return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age);
}
}
@ModelAttribute
을 사용하려면 해당 클래스에 @Setter
필요@ModelAttribute
애노테이션 생략 가능