1. 핸들러조회 = 핸들러 매핑을 통해 요청 URL 에 매핑된 핸들러(컨트롤러)를 조회한다.
2. 핸들러 어댑터 조회 = 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
3. 핸들러 어댑터 실행 = 핸들러 어댑터를 실행한다.
4. 핸들러 실행 = 핸들러 어댑터가 실제 핸들러 를 실행한다.
5. ModelAndView반환 = 핸들러 어뎁터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
6. viewResolver 호출 = 뷰 리졸버를 찾고 실행한다.
- JSP의 경우 = InternalResourceViewResolver가 자동 등록되고, 사용된다.
7. View 반환 = 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다.
- JSP의 경우 = InternalResourceView(JstlView)를 반환하는데 forward() 로직이 있다.
8. 뷰 렌더링 = 뷰를 통해서 뷰를 렌더링 한다.
기본적으로 HandlerMapping 통해 Handler를 찾는다
이러한 우선순위를 가지게 되는데 현재는 @RequestMapping을 사용하지 않고 Controller interface를 구현한 후에 Bean으로 등록하고 이름을 특정 url ("/mynameis") 으로 등록해놓았으니
스프링 빈의 이름 으로 (@Component ="mynameis") 찾게된다.
이후에는 알맞은 어댑터를 찾게되는데
0 = RequestMappingHandlerAdapter = @RequestMapping기반 핸들러를 처리
1 = HttpRequestHandlerAdapter = HttpRequestHandler처리 = 이것을 상속받아 구현한 핸들러들을 처리
2 = SimpleControllerHandleAdapter = Controller 인터페이스 처리
이것 말고도 헨들러어뎁터가 더 있다. 알맞은 어뎁터를 찾게되면 DIspatcherServlet (FrontController) 에서 handle을 호출하고 그안에서 또 handleRequest (우리가 구현 한것) 을 호출하여서 최종적으로 ModelAndVIew를 받아온다.
ViewResolver
스프링 부트는 InternalResourceViewResolver 라는 뷰 리졸버를 자동으로 등록하는데 appliation.properties 에 있는 spring.mvc.view.prefix, spring.mvc.view.suffix 설정정보를 사용해서 등록한다.
@ServletComponentScan //서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {
public static void main(String[] args) {
SpringApplication.run(ServletApplication.class, args);
}
@Bean
ViewResolver internalResourceViewResolver() {
return new InternalResourceViewResolver("/WEB-INF/views/", "jsp");
}
}
Controller에서 ModelAndView에 viewName을 간단히 return 하면 prefix,suffix알아서 양쪽에 붙여준다.
@Bean ViewResolver를 알아서 작성해준셈이다.
ViewResolver에서 알맞은 View를 return한다. (타임리프 ViewResolver는 타임리프 View를 return함 , 다 매칭되는게 있다.)
Spring MVC 시작하기
@RequestMapping 이 의미하는것은 RequestMappingHanlder인 핸들러매핑을 쓰겠다는 것이고
이에 해당하는 RequestMappingHandler 핸들러어댑터를 쓰겠다는 이야기다.
RequestMappingHandler 은 스프링 빈 중에서 @RequestMapping 또는 @ Controller가 클래스 레벨에 붙어있는 경우를 매핑 정보로 인식한다.
Spring MVC 컨트롤러 통합
그냥 하나의 @Controller 가 적힌 클래스 밑에 함수형으로 다 떄려넣을 수 있다.
Spring MVC - 실용적인 방식
Annotation기반 매핑은 매우 유연하게 설계가되어 있어서 반환 값이 ModelAndView 말고 String이면 알아서 view를 반환하는 것임을 인식하고
인자값으로 Model , HttpServletRequest, HttpServletResponse , @RequestParam("key") 여러가지가 들어와도 다 잘 동작한다.
@RequestMapping 은 어떠한 Http request를 다 받기 떄문에 이것을 제약을 거는 것이 좋은 설계이다.
@Getmapping , @PostMapping 이러한 annotation 을 사용하는것이 훨씬 좋다.
'WEB > Spring MVC 1' 카테고리의 다른 글
스프링 MVC - 웹 페이지 만들기 (0) | 2022.07.08 |
---|---|
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(스프링 MVC - 기본기능) (0) | 2021.03.30 |
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(MVC 프레임워크 만들기) (0) | 2021.03.29 |
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(서블릿,JSP,MVC패턴) (0) | 2021.03.28 |
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(서블릿) (0) | 2021.03.27 |