View Resolver

YH·2023년 4월 22일
0

✅ View Resolver

  • 핸들러에서 반환된 ModelAndView를 알맞는 View로 전달하기 위해 DispatcherServlet에서 View Resolver를 실행한다.
  • View Resolver는 ModelAndView에 들어있는 View 이름(논리적 뷰 이름)을 가지고 해당되는 View 컴포넌트를 찾는 역할을 한다.

✔️ Spring Boot는 InternalResourceViewResolver 라는 View Resolver를 자동으로 등록하는데, 이 때 application.yaml에 등록한 spring.mvc.view.prefixspring.mvc.view.suffix 설정 정보를 사용해서 등록한다.

🔽 핸들러에서 반환하는 ModelAndView 예시

@Component("/springmvc/old-controller")
public class OldController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("OldController.handleRequest");
        return new ModelAndView("new-form");
    }
}

🔽 InternalResourceViewResolver에서 사용하기 위한 application.yaml 설정 정보

spring:
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp

✔️ 스프링 부트에서 제공하는 View Resolver

(숫자는 우선 순위이며, 이 외에도 여러가지가 더 있다.)
1 = BeanNameViewResolver → 빈 이름으로 뷰를 찾아서 반환한다. (엑셀 파일 생성 기능 등에 사용)
2 = InternalResourceViewResolver → JSP를 처리할 수 있는 뷰를 반환한다.

✅ View Resolver 동작 방식

  1. 핸들러 어댑터 호출
    • 핸들러 어댑터를 통해 ModelView에 들어있는 논리 뷰 이름을 얻는다.
  2. ViewResolver 호출
    • 얻은 논리 뷰 이름으로 viewResolver를 순서대로 호출하여 찾는다.
    • BeanNameViewResolver가 먼저 호출되어 논리 뷰 이름의 스프링 빈으로 등록된 뷰를 찾고, 만약 없으면 InternalResourceViewResolver가 호출되어 뷰를 찾는다.
  3. 선택된 ViewResolver에서 뷰를 찾아서 view.render()를 호출하고 뷰를 렌더링한다.
    • JSP의 경우 viewResolver가 forward()를 호출해서 JSP를 실행한다.

✔️ 참고

  • InternalResourceViewResolver는 만약 JSTL 라이브러리가 있으면 InternalResourceView를 상속받은 JstlView를 반환한다.
  • 다른 뷰는 실제 뷰를 렌더링 하지만, JSP의 경우 forward()를 통해서 JSP로 실행해야 렌더링된다. 나머지 뷰 템플릿들은 forward() 과정 없이 바로 렌더링 된다.
  • Thymleaf 뷰 템플릿을 사용하면 ThymleafViewResolver를 등록해야 한다. 최근에는 라이브러리만 추가하면 스프링 부트가 자동으로 등록해준다.
profile
하루하루 꾸준히 포기하지 말고

0개의 댓글