-
핸들러 매핑, 핸들러 어댑터, 뷰 리졸버스프링 2022. 12. 26. 16:22
스프링은 Controller라는 인터페이스가 있다.
public interface Controller { ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception; }
핸들러 매핑단계에서 이 Controller를 찾아와야 한다.
또한 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요하다.
HandlerMapping
0 = RequestMappingHandlerMapping : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1 = BeanNameUrlHandlerMapping : 스프링 빈의 이름으로 핸들러를 찾는다.RequestMappingHandlerMapping을 통하여 먼저 찾고, 해당 사항이 없으면 BeanNameUrlHandlerMapping을 통하여 핸들러를 찾아오게 된다.
이후 어댑터를 찾게 되는데
HandlerAdapter
0 = RequestMappingHandlerAdapter : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1 = HttpRequestHandlerAdapter : HttpRequestHandler 처리
2 = SimpleControllerHandlerAdapter : Controller 인터페이스(애노테이션X, 과거에 사용) 처리위와 마찬가지로 단계적으로 어댑터를 찾도록 한다.
1번은 HttpRequestHandler의 인터페이스가 존재하는지 확인을 하는 것이고,
2번은
@Override public boolean supports(Object handler) { return (handler instanceof Controller); }
Controller를 implements했는지에 대하여 찾게 된다.
뷰 리졸버
스프링 부트는 InternalResourceViewResolver 라는 뷰 리졸버를 자동으로 등록하는데, 이때 application.properties 에 등록한 spring.mvc.view.prefix , spring.mvc.view.suffix 설정 정보를 사용해서 등록한다
application.properties
spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.js
원래 수동으로 빈등록을 하여
@Bean ViewResolver internalResourceViewResolver() { return new InternalResourceViewResolver("/WEB-INF/views/",".jsp"); }
를 해야 하는데, 스프링 부트가 설정 정보로 이를 자동으로 해준다.
동작방식
ModelAndView를 반환한 후, 논리적인 이름으로 viewResolver가 호출된다.
이때 스프링 부트가 자동으로 여러 viewResolver를 등록해주는데,
1 = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다. (예: 엑셀 파일 생성 기능에 사용)
2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.- 핸들러 어댑터 호출 핸들러 어댑터를 통해 new-form 이라는 논리 뷰 이름을 획득한다.
- ViewResolver 호출 new-form 이라는 뷰 이름으로 viewResolver를 순서대로 호출한다. BeanNameViewResolver 는 new-form 이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하는데 없다. InternalResourceViewResolver 가 호출된다.
- InternalResourceViewResolver 이 뷰 리졸버는 InternalResourceView 를 반환한다.
- 뷰 - InternalResourceView
- InternalResourceView 는 JSP처럼 포워드 forward() 를 호출해서 처리할 수 있는 경우에 사용한다.
- viewResolve가 veiw를 반환해야 하는데 view는 인터페이스화 되어있다.
- view.render() view.render() 가 호출되고 InternalResourceView 는 forward() 를 사용해서 JSP를 실행한다.
- JSP의 경우 forward() 통해서 해당 JSP로 이동(실행)해야 렌더링이 된다. JSP를 제외한 나머지 뷰 템플릿들은 forward() 과정 없이 바로 렌더링 된다.
728x90'스프링' 카테고리의 다른 글
ModelAttribute (0) 2023.01.01 스프링 MVC의 사용 (0) 2022.12.26 스프링 MVC (0) 2022.12.26 MVC 만들어보기 (0) 2022.12.25 MVC 이해해보자 (0) 2022.12.24