MVC 전체 구조
실제 SpringMVC 구조는 이전 수업부터 계속해서 만들어왔던 MVC 프레임워크 구조와 매우 유사하다.
하지만 FrontController 부분이 MVC에서는 DispatcherServlet라고 하는데
공식 문서에서도 보면 '스프링 MVC는 중앙 서블릿인 DispatcherServlet이 모든 컨트롤러 패턴을 중심으로 설계되었다'고 했다.
DispatcherServlet에서는 doDispatch 메서드에서 handler를 조회하고 adapter를 가져와서 핸들러를 호출하게 된다.
이 때, Special Bean Types를 제공한다.
ex) HandlerMapping, HandlerAdapter, ViewResolver ..
위의 bean types들을 사용하여 handler, adapter, view를 반환하게 된다.
핸들러 매핑과 핸들러 어댑터
핸들러 매핑에서는 컨트롤러를 찾아야한다.
HandlerMapping은 처음에 @RequestMapping 어노테이션을 사용한 것부터 찾는다.
없다? 하면 이제 스프링 빈의 이름으로 핸들러를 찾는다.
여기서 핸들러를 찾으면 핸들러를 실행할 수 있는 어댑터를 찾아야한다.
HandlerAdapter는 처음에 @RequestMapping 어노테이션을 사용한 것부터 찾는다.
없다? 하면 HttpRequestHandlerAdapter를 구현하는 핸들러를 찾는다.
없다? 하면 Controller 인터페이스를 구현하는 핸들러를 찾는다.
뷰 리졸버
ViewResolver는 핸들러 어댑터에서 반환받은 ModelAndView 객체에서 View를 반환해주는 인터페이스이다.
스프링 부트는 InternalResourceViewResolver(JSP)라는 것을 등록하는데, application.properties에 등록한 prefix, suffix 설정 정보를 사용한다.
코드에서 보면 핸들러 어댑터가 new-form이라는 논리 이름 반환
-> 빈 이름으로 뷰를 찾는다
-> 없다? 하면 InternalResourceViewResolver을 이용하여 JSP를 실행한다.
진짜 스프링 MVC 사용
@RequestMapping( RequestMappingHandlerMapping + RequestMappingHandlerAdatper)
- RequestMapping 어노테이션은 URL 패턴을 사용하여 요청을 컨트롤러 매서드에 매핑할 수 있다.
@Controller
- 내부에 @Component가 있어 스프링 빈으로 등록한다.
- 스프링 MVC에서 어노테이션 기반 컨트롤러로 인식함
RequestMappingHandlerMapping은 등록된 스프링 빈 중에서( 등록된 빈이라는 것이 중요하다고 생각)
@RequestMapping 또는 @Controller가 클래스 레벨에 붙어 있는 경우 매핑 정보로 인식한다.
즉, 이 말은 메서드 레벨이 아닌 클래스 레벨에 두 어노테이션 중 하나가 붙어있어야
핸들러를 조회할 때, 조회 가능하게 해준다는 것이다.
그래서 전 강의에서 @Component만 붙게 된다면 핸들러 매핑을 해주지 않아 핸들러로 조회할 수 없다는 말씀을 하셨던 것 같다. @Component는 단지 빈으로만 등록하는 것이고, @RequestMapping을 사용하여 핸들러 매핑을 해줘야한다.
v1
v1은 회원 폼, 저장, 목록을 각각 controller로 만들고 ModelAndView 객체를 반환한다.
v1 -> v2
v1에서 v2로 넘어갈 때 폼, 저장, 목록의 controller들을 하나의 컨트롤러로 만들었다.
각각 메서드에 @RequestMapping을 이용하여 맵핑해주었다.
v2 -> v3
1. ModelAndView를 반환하지 않고 String 즉, 논리 이름만 반환한다.
- @Controller에 의해 String을 반환해도 된다
2. Model 객체를 파라미터로 받을 수 있다
3. username과 age를 받을 때, HttpServlet이 아닌 @RequestParam을 이용하여 요청 파라미터를 받는다.
4. @RequestMapping이 http 요청 메서드에 따라 GetMapping, PostMapping을 사용할 수 있다.
QnA
이번 단원을 들으면서 궁금한 점을 QnA에 올렸다.
Q.
DispatcherServlet을 서블릿으로 자동 등록되는데, 어떻게 등록이 될까?
A.
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-servlet-config
에서 ServletInitializer가 결국 WepApplicationInitializer를 구현한다.
WepApplicationInitalizer는 'DispatcherServlet의 위치를 지정하는 메서드를 재정의하여 DispatcherServlet을 등록하는 것을 훨씬 쉽게한다'라고 적혀있다. 그렇다면 ServletInitializer에 의해 등록이 되는거라 생각하면 된다. 즉, 스프링 부트가 등록하게 된다.
Q.
servlet이란 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램인데,
DispatcherServlet을 서블릿으로 자동 등록한다는 의미는 DispatcherServlet을 이용하여 웹 페이즈를 동적으로 생성한다는 말인가요?
A.
서블릿은 웹에서 요청을 받는 목적으로 만들어졌고, 응답 결과를 동적으로 만들어낸다.
여기에 스프링을 더하여 편리하게 한다.
Reference
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-requestmapping
https://www.inflearn.com/questions/319270
출처 : 인프런 스프링 MVC 1편(김영한 강사님)
'Spring 강의 > 스프링 MVC 1' 카테고리의 다른 글
MVC 1 - MVC 프레임워크 만들기 (0) | 2021.09.18 |
---|---|
MVC 1 - 서블릿, JSP, MVC 패턴 (0) | 2021.09.14 |
MVC 1 - 서블릿 (0) | 2021.09.13 |
MVC 1 - 웹 애플리케이션 이해 (0) | 2021.09.10 |