[Spring] Spring MVC 프레임워크

호호빵·2022년 8월 22일
0

Spring

목록 보기
15/24

Spring MVC 프레임워크

  • Spring에서 제공하는 웹 모듈로, Model, View, Controller 세가지 구성요소를 사용해 사용자의 다양한 HTTP Request를 처리하고 단순한 텍스트 형식 응답부터 REST 형식의 응답, View를 표시하는 html을 return하는 응답까지 다양한 응답을 할 수 있는 프레임 워크
  • 다양한 요쳥을 처리하고 응답하기 위해 주요 구성요소들을 만들어놓고 구성요소들을 확장할 수 있게 만들어 놓음

Spring MVC 구조

<용어>

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)

  • 서블릿 컨테이너에서 http 프로토콜을 통해 들어오는 모든 request에 대해 제일 앞단에서 중앙집중식으로 처리해주는 핵심적인 역할
    (앞쪽에서 처리하는 컨트롤러를 두는 패턴 : Front Controller 패턴)

HandlerMapping

  • 클라이언트의 request url을 어떤 컨트롤러가 처리해야 할 지 찾아서 Dispatcher Servlet에게 전달해주는 역할
  • 컨트롤러 상에서 url을 매핑시키기 위해 @RequestMapping을 사용하는데, 핸들러가 이를 찾아줌

Handler(Controller)

  • HTTP Request를 처리해 Model을 만들고 HTTP가 보여줄 View Name을 지정
  • 실질적인 요청을 처리하는 곳이고, Dispatcher Servlet이 프론트 컨트롤러라면, 이 곳은 백엔드 컨트롤러라고 볼 수 있음
  • Model의 처리 결과를 담아 Dispatcher Servlet에게 반환

ModelAndView

  • Controller에 의해 반환된 Model과 View가 Wrapping된 객체
  • View가 지정되더라도 데이터가 세팅된 View가 지정되지 않음

ViewResolver

  • String 형태로 넘어온 viewName을 받고, Model에 저장된 데이터를 사용해 View 객체 생성
  • 컨트롤러의 처리 결과를 만들 view를 결정해주는 역할

View

  • 모델과 viewName 받아서 화면에 그려주는 역할 수행

Spring MVC 구조 의의, 사용이유

Spring MVC는 HTTP Request를 처리하는 부분인 Controller, 데이터를 처리해 정제된 데이터를 넣는 Model, 정제된 데이터를 활용해 사용자에게 보여지는 View에 대한 역할 분리를 잘 해놓았다. Spring MVC 패턴을 사용하면 Model, View, Controller 모두를 인터페이스를 사용해 규격화해놓아 유연하고 확장성 있게 웹 어플리케이션을 설계할 수 있다.





+ 221207 추가

DispatcherServlet → Controller

  • API 를 처리해 줄 Controller 를 찾아 요청을 전달
  • Handler mapping 에는 API path 와 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 
 				→ HelloResponseControllerhelloHtmlFile() 함수와 연결



Controller 와 HTTP Response 메시지


Controller 와 HTTP Request 메시지

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);
    }
}

  • 5번에서 @ModelAttribute을 사용하려면 해당 클래스에 @Setter 필요
    - 현재는 필드가 두가지 뿐이지만 더 늘어날 경우 객체를 반환하기위해
    -@ModelAttribute 애노테이션 생략 가능



Spring MVC 과정
con, ser, rep

profile
하루에 한 개념씩

0개의 댓글