Deep Dive /Java Web /17-V3

17-V3. DispatcherServlet → ViewResolver: resolveViewName()

ModelAndView에 view name이 들어 있으면, DispatcherServlet은 실제 View 객체를 얻기 위해 resolveViewName(...)을 호출합니다.


이번 단계의 역할

문자열 view name을 실제 렌더링 가능한 View 객체로 해석하는 단계입니다.


호출 흐름 요약

  1. DispatcherServlet.render(...)viewName 존재 여부를 확인합니다.
  2. resolveViewName(...)를 호출합니다.
  3. 등록된 ViewResolver 중 하나가 view name을 처리합니다.
  4. 결과로 View 객체가 반환됩니다.

호출 흐름 다이어그램

sequenceDiagram participant DS as DispatcherServlet participant Resolver as ViewResolver participant View DS->>Resolver: resolveViewName(viewName, locale) Resolver-->>DS: View

핵심 코드

// DispatcherServlet.java
String viewName = mv.getViewName();
if (viewName != null) {
    view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
}
// AbstractCachingViewResolver.java
public @Nullable View resolveViewName(String viewName, Locale locale) throws Exception {
    view = createView(viewName, locale);
    return (view != UNRESOLVED_VIEW ? view : null);
}

코드 해설

DispatcherServlet은 특정 템플릿 엔진을 직접 알지 않고, ViewResolver 인터페이스만 통해 View 객체를 얻습니다. 그래서 Thymeleaf, JSP, FreeMarker 같은 여러 뷰 기술을 같은 방식으로 연결할 수 있습니다.


설계 의도

뷰 이름 해석 전략을 분리해서 템플릿 엔진 교체와 다중 ViewResolver 체인을 지원하려는 구조입니다.


다음 단계 연결

다음 문서 17-V4에서는 Thymeleaf 환경에서 ViewResolver가 실제로 ThymeleafView를 어떻게 만들어 반환하는지 봅니다.

← 이전: 17-V2. DispatcherServlet → HandlerInterceptor | 다음: 17-V4. ViewResolver → DispatcherServlet: ThymeleafView 반환