앞서 구현해본 MVC 패턴은 사실 springMVC에서 제공하는 패턴과 동일하다.
지금껏 구현해본 프레임워크와 스프링 MVC를 비교해보자.
스프링 MVC 역시 프론트 컨트롤러 패턴으로 구현되어 있고, 프론트 컨트롤러를 계승하는 것이 DispatcherServlet이다.
DispatcherServlet 역시 부모 클래스에서 HttpServlet을 상속받고, 스프링부트는 DispatcherServlet을 서블릿으로 자동 등록하며 기존에 존재했던 모든 경로('urlPatterns="/")
를 매핑한다.
하지만 이러한 매핑은 우선순위가 낮다. 다른 직접적인 경로 설정이 있다면 해당 설정이 우선될 것이다.
Q. service()?
1. javax.servlet.Servlet 인터페이스에 정의된 service() 메서드이자
Servlet 컨테이너에서 요청을 처리하기 위해 호출되는 중심 메서드.
2. service() 메서드는 요청에 대한 HTTP 메서드(GET, POST, PUT, DELETE 등)에 따라
doGet(), doPost(), doPut(), doDelete() 등의 메서드를 호출하여 요청을 처리한다.
3. 각각의 HTTP 메서드에 해당하는 메서드가 구현되어 있지 않으면,
기본적으로 405 Method Not Allowed 상태코드를 응답한다.
A. (요약) http 메시지가 들어오면 이 메시지의 종류에 따라,
각각 다른 메서드를 호출하여 받은 요청을 처리한다.
FrameworkServlet.service()
로부터 여러 메서드가 연속적으로 호출되며 DispatcherServlet.doDispatch()
가 호출된다.호출된 doDispatch()는 DispatcherServlet의 핵심 기능이다.
doDispatch() 메서드는 다음과 같은 일련의 과정을 거치게 된다.
HandlerMapping
을 사용하여 클라이언트의 요청에 해당하는 컨트롤러를 탐색HandlerAdapter
탐색HandlerAdapter
를 사용하여 컨트롤러를 실행ModelAndView
를 생성ModelAndView
에서 View 객체를 추출하여, resolveViewName
를 사용하여 실제 View 객체 탐색즉, doDispatch() 메서드는 클라이언트의 요청에 해당하는 컨트롤러를 찾아 실행하고, 컨트롤러의 실행 결과인 Model과 View를 처리하여 실제 HTTP 응답을 생성하는 일련의 과정을 수행한다.
이러한 과정을 통해 Spring MVC는 클라이언트의 요청에 따라 적절한 컨트롤러를 실행하고, 결과를 HTTP 응답으로 제공하는 웹 애플리케이션을 개발할 수 있게 된다.
스프링 MVC의 가장 큰 강점은 DispatcherServlet 코드의 변경 없이 원하는 기능을 확장하거나 변경할 수 있다는 점이다.
이는 인터페이스만 구현해서 DispatcherServlet에 등록하면 나만의 컨트롤러를 만들 수도 있다는 말과 동일하다.
핸들러 매핑과 핸들러 어댑터는 클라이언트로부터 들어온 HTTP 요청을 처리할 컨트롤러(핸들러)를 찾고 실행하는 역할을 수행한다.
과거 스프링이 애노테이션을 제공하기 전에는 다음과 같은 방식으로 핸들러 매핑을 수행했다.
package org.springframework.web.servlet.mvc.Controller;
public interface Controller {
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse
response) throws Exception;
}
v3 초기의 컨트롤러와 유사하다.
이 컨트롤러가 호출되려면 핸들러 매핑과 핸들러 어댑터가 필요하다.
스프링에서 제공하는 기본 핸들러 매핑:
BeanNameUrlHandlerMapping
,
RequestMappingHandlerMapping
,
ControllerClassNameHandlerMapping
등
스프링에서 제공하는 기본 핸들러 어댑터:
HttpRequestHandlerAdapter
,
SimpleControllerHandlerAdapter
,
AnnotationMethodHandlerAdapter
,
RequestMappingHandlerAdapter
등
ViewResolver는 컨트롤러에서 반환한 뷰 이름을 실제 뷰 구현체로 변환해주는 인터페이스이다.
ViewResolver는 다양한 구현체를 제공하고 있어서, 각각의 구현체가 뷰 이름을 해석하고 해당하는 뷰 객체를 반환한다.
일반적으로 Spring MVC에서는 InternalResourceViewResolver
를 사용한다.
InternalResourceViewResolver
는 뷰 이름을 JSP 파일의 경로로 해석하고, 해당하는 JSP 파일을 렌더링하는 InternalResourceView
객체를 반환한다. InternalResourceViewResolver
는 JSP 파일을 사용하는 뷰에서 흔히 사용된다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard