Deep Dive /Java Web /17-V3

17-V3. DispatcherServlet → ViewResolver: resolveViewName()

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


이번 단계의 역할 — 문자열 view name을 렌더링 가능한 View 객체로 해석한다

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


호출 흐름 요약 — render()가 viewName을 확인 → resolveViewName() → 리졸버가 처리

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

호출 흐름 다이어그램 — DispatcherServlet이 ViewResolver에게 View를 받아온다

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

핵심 코드 — resolveViewName(String, Locale)이 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);
}

코드 해설 — 템플릿 엔진을 모른 채 인터페이스로만 얻어 Thymeleaf·JSP를 같이 붙인다

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


설계 의도 — 뷰 이름 해석을 분리해 템플릿 엔진 교체와 리졸버 체인을 가능하게 한다

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


다음 단계 연결 — 17-V4 ThymeleafView를 만들어 반환하는 과정으로 이어진다

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

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