Deep Dive /Java Web /17-V4

17-V4. ViewResolver → DispatcherServlet: ThymeleafView 반환

Thymeleaf를 쓰는 경우, ThymeleafViewResolver는 view name을 받아 ThymeleafView 인스턴스를 만들어 DispatcherServlet에 반환합니다.


이번 단계의 역할 — view name이 Thymeleaf 전용 View 객체로 구체화된다

문자열 view name을 Thymeleaf 전용 View 객체로 구체화하는 단계입니다.


호출 흐름 요약 — createView() 검사 → loadView() → 엔진·locale·contentType 주입

  1. ThymeleafViewResolver.createView(...)가 view name을 검사합니다.
  2. loadView(viewName, locale)를 호출합니다.
  3. ThymeleafView 인스턴스를 만들고 템플릿 엔진, locale, contentType 등을 주입합니다.
  4. 완성된 ThymeleafView를 DispatcherServlet에 반환합니다.

호출 흐름 다이어그램 — ThymeleafViewResolver가 ThymeleafView를 만들어 돌려준다

sequenceDiagram participant Resolver as ThymeleafViewResolver participant View as ThymeleafView participant DS as DispatcherServlet Resolver->>Resolver: createView(viewName, locale) Resolver->>View: loadView(viewName, locale) Resolver-->>DS: ThymeleafView

핵심 코드 — createView(String, Locale)이 loadView()로 인스턴스를 만든다

// ThymeleafViewResolver.java
protected View createView(final String viewName, final Locale locale) throws Exception {
    return loadView(viewName, locale);
}
// ThymeleafViewResolver.java
final AbstractThymeleafView viewInstance = BeanUtils.instantiateClass(getViewClass());
view.setTemplateEngine(getTemplateEngine());
view.setTemplateName(viewName);
return view;

코드 해설 — 이제 손에 남는 건 템플릿 이름이 아니라 실제 View 객체다

이 단계가 끝나면 DispatcherServlet은 더 이상 “템플릿 이름 문자열”이 아니라 실제 View 객체를 손에 쥐게 됩니다. 즉 이제부터는 해석이 아니라 렌더링 단계입니다.


설계 의도 — 엔진별 View 생성을 ViewResolver가 전담해 DispatcherServlet을 떼어놓는다

ViewResolver가 템플릿 엔진별 View 인스턴스 생성을 전담하게 해 DispatcherServlet을 템플릿 기술로부터 분리한 구조입니다.


다음 단계 연결 — 17-V5 render(model, request, response) 호출로 이어진다

다음 문서 17-V5에서는 DispatcherServlet이 반환받은 ThymeleafViewrender(model, request, response)를 호출하는 장면을 봅니다.

← 이전: 17-V3. DispatcherServlet → ViewResolver | 다음: 17-V5. DispatcherServlet → ThymeleafView