ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 핸들러 매핑, 핸들러 어댑터, 뷰 리졸버
    스프링 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를 처리할 수 있는 뷰를 반환한다.
    1. 핸들러 어댑터 호출 핸들러 어댑터를 통해 new-form 이라는 논리 뷰 이름을 획득한다.
    2.  ViewResolver 호출 new-form 이라는 뷰 이름으로 viewResolver를 순서대로 호출한다. BeanNameViewResolver 는 new-form 이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하는데 없다. InternalResourceViewResolver 가 호출된다.
    3.  InternalResourceViewResolver 이 뷰 리졸버는 InternalResourceView 를 반환한다.
    4.  뷰 - InternalResourceView
      1. InternalResourceView 는 JSP처럼 포워드 forward() 를 호출해서 처리할 수 있는 경우에 사용한다.
      2. viewResolve가 veiw를 반환해야 하는데 view는 인터페이스화 되어있다.
    5.  view.render() view.render() 가 호출되고 InternalResourceView 는 forward() 를 사용해서 JSP를 실행한다.
      1. 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

    댓글

Designed by Tistory.