FrontController vs 스프링 MVC
- FrontController => DispatcherServlet
- handlerMappingMap => HandlerMapping
- MyHandlerAdatper => HandlerMapping
- ModelView => ModelAndView
- viewResolver => ViewResolver
- MyView => View
DispatcherServlet
- 부모 클래스에서 HttpServlet을 상속 받아서 사용, 서블릿으로 동작
- DispatcherServlet => FrameworkServlet => HttpServletBean => HttpServlet
- 스프링 부트는 DispatcherServlet을 서블릿으로 자동으로 등록
- 모든 경로(urlPatterns="/")에 대해서 매핑
핸들러 매핑과 핸들러 어댑터
- 핸들러 매핑으로 핸들러 조회
- HandlerMapping을 순서대로 실행해서, 핸들러를 찾는다
- 빈이름으로 핸들러를 찾음
- BeanNameUrlHandlerMapping 실행하고 핸들러인 [Controller이름]을 반환한다.
- 핸들러 어댑터 조회
- HandlerAdapter의 supports()를 순서대로 호출한다
- SimpleControllerHandlerAdapter가 Controller 인터페이스를 지원하므로 대상이 된다
- 핸들러 어댑터 실행
- DispatcherServlet이 조회한 SimpleControllerHandlerAdapter를 실행하면서 핸들러 정보도 함께 넘겨준다
- SimpleControllerHandlerAdapter는 핸들러인 [Controller이름]을 내부에서 실행하고, 결과를 반환한다.
뷰 리졸버
// application.properties
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
- 스프링 부트는 InterResourceViewResolver라는 뷰 리졸버를 자동 등록
- 위의 설정을 읽어서 설정 정보로 사용함
- 핸들러 어댑터 호출
- 핸들러 어댑터를 통해 new-form이라는 논리 뷰 이름을 획득한다.
- ViewResolver 호출
- new-form이라는 뷰 이름으로 viewResolver를 순서대로 호출한다.
- BeanNameViewResolver는 new-form이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하는데 없다.
- InternalResourceViewResolver가 호출
- InternalResourceViewResolver : InternalResourceView 반환
- 뷰 - InternalResourceView
- JSP처럼 forward()를 호출해서 처리할 수 있는 경우에 사용
- view.render()
- view.render()가 호출된고 InternalResourceView는 forward()를 사용해서 JSP를 실행한다.
@RequestMapping
- RequestMappingHandlerMapping
- RequestMappingHandlerAdapter
@RequestMapping("/springmvc/v1/members/new-form")
public ModelAndView process() {
return new ModelAndView("new-form");
}
- 해당 URL이 호출되면 위의 메서드가 호출됌
MVC 실용적인 방식
/**
* v3
* Model 도입
* ViewName 직접 반환
* @RequestParam 사용
* @RequestMapping -> @GetMapping, @PostMapping
*/
@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@GetMapping("/new-form")
public String newForm() {
return "new-form";
}
@PostMapping("/save")
public String save(@RequestParam("username") String username, @RequestParam("age") int age,Model model) {
Member member = new Member(username, age);
memberRepository.save(member);
model.addAttribute("member", member);
return "save-result";
}
}
- @RequestParam := request.getParamter("username")
- @RequestMapping(value = "/new-form", method = RequestMethod.GET)
'Spring > MVC' 카테고리의 다른 글
[MVC] 요청 매핑 (0) | 2024.09.10 |
---|---|
[MVC] 프론트 컨트롤러 패턴 (0) | 2024.09.05 |
[MVC] MVC 패턴 (0) | 2024.09.05 |
[MVC] Servlet (0) | 2024.09.05 |