스프링 MVC 동작 원리(8) : DispatcherServlet 2부 - SimpleController

de_sj_awa·2021년 6월 27일
0

이번에는 RestController가 아닌 View가 있는 경우를 살펴본다.

8. DispatcherServlet 2부

  1. @RestController에서 @Controller로 바꾸고 메소드에 @ResponseBody 애노테이션을 붙인다.
@Controller
public class HelloController {

    @Autowired
    HelloService helloService;

    @GetMapping("/hello")
    public @ResponseBody String hello() {
        return "Hello, " + helloService.getName();
    }

    @GetMapping("/sample")
    public String sample(){
        return "/WEB-INF/sample.jsp";
    }
}

첫번째 메소드는 @ResponseBody를 가지고 문자열을 반환하고, 두번째 메소드는 @ResponseBody 없이 그냥 문자열을 반환한다.

  1. webapp/WEB-INF 디렉터리 하위에 sample.jsp를 만든다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>Hello Spring MVC!</h2>
</body>
</html>

doDispatch -> mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

첫번째 메소드에 해당하는 요청을 보내면 ModelAndView가 null이 되는데 두번째 메소드에 해당하는 요청을 보내면 ModelAndView가 null이 아니고, /WEB-INF/sample.jsp가 들어오게 된다. 그러면 View 객체에 모델 객체를 바인딩해서 뷰를 렌더링한다.

DispatcherServlet 동작 순서

  1. 요청을 분석한다. (로케일, 테마, 멀티파트 등)
  2. (핸들러 맵핑에게 위임하여) 요청을 처리할 핸들러를 찾는다.
  3. (등록되어 있는 핸들러 어댑터 중에) 해당 핸들러를 실행할 수 있는 “핸들러 어댑터”를 찾는다.
  4. 찾아낸 “핸들러 어댑터”를 사용해서 핸들러의 응답을 처리한다.
    • 핸들러의 리턴값을 보고 어떻게 처리할지 판단한다.
    • 뷰 이름에 해당하는 뷰를 찾아서 모델 데이터를 랜더링한다.
    • @ResponseBody가 있다면 Converter를 사용해서 응답 본문을 만들고.
  5. (부가적으로) 예외가 발생했다면, 예외 처리 핸들러에 요청 처리를 위임한다. 6. 최종적으로 응답을 보낸다.

아무런 설정을 하지 않아도 DispatcherServlet이 기본적으로 등록한 기본 전략인 BeanNameUrlHandlerMapping, RequestMappingHandlerMapping 두 개의 HandlerMapping이 있다. 지금까지 RequestMappingHandlerMapping을 살펴봣으니 BeanNameUrlHandlerMapping을 살펴보자.

Dispatcher.class

doService -> doDispatch -> mappedHandler = getHandler(processedRequest); (핸들러를 찾아오는 부분)

HandlerMapping

  • BeanNameUrlHandlerMapping
@org.springframework.stereotype.Controller("/simple")
public class SimpleController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        return new ModelAndView("/WEB-INF/simple.jsp");
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>Hello Simple MVC!</h2>
</body>
</html>

아무런 설정을 하지 않아도 DispatcherServlet이 기본적으로 등록한 기본 전략인 HttpRequestHandlerAdpater, SimpleControllerHandlerAdpater, RequestMappingHandlerAdapter 세 개의 HandlerAdpater가 있다. 이 경우에 핸들러를 실행시키는 HandlerAdpater는 SimpleControllerHandlerAdapter가 된다.

doDispatch -> HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

HandlerAdapter

  • SimpleControllerHandlerAdapter

doDispatch -> mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

참고

  • 인프런 : 스프링 웹 MVC(백기선)
profile
이것저것 관심많은 개발자.

0개의 댓글