
ViewResolver는 스프링 MVC에서 컨트롤러가 반환한 단순한 뷰 이름 (예: "home")을 실제 뷰 객체로 변환해 주는 핵심 인터페이스이다. 즉, 컨트롤러가 어떤 뷰 이름을 리턴하면, DispatcherServlet은 등록된 ViewResolver들을 통해 해당 이름에 맞는 템플릿 (HTML, JSP, FreeMarker 등)을 찾아서 렌더링하는데 사용된다.
ViewResolver는 뷰 이름을 실제 뷰 객체 (View 인터페이스를 구현한 객체)로 변환하는 역할을 하며 다음 인터페이스 메서드 하나만 정의되어 있다.
✍️ 작성
View resolveViewName(String viewName, Locale locale) throws Exception;
이 메서드는 뷰 이름과 Locale 정보를 받아서 해당하는 뷰 객체를 반환한다. 스프링 MVC의 DispatcherServlet이 컨트롤러로부터 뷰 이름을 전달받으면, 등록된 모든 ViewResolver들의 resolveViewName 메서드를 순서대로 호출해서 적절한 뷰 객체를 자동으로 찾아 반환해주기 때문에, 개발자가 따로 이 메서드를 직접 호출할 필요 없이 스프링이 저절로 처리해준다.
ViewResolver는 또한 여러 뷰 기술 (Thymeleaf, JSP, FreeMarker 등)을 지원하여, 애플리케이션에서 다양한 방식으로 화면을 렌더링할 수 있도록 돕는다.
스프링 MVC에서는 ViewResolver 인터페이스를 구현한 빈들이 여러 개 등록될 수 있는데, 이들에 대해 order (우선순위)를 설정할 수 있다. 과정을 설명하면 다음과 같다.
※ 우선순위 설정 후 ViewResolver 적용 과정
뷰리졸버는 다양한 방법으로 커스터마이징이 가능하다.
✍️ 예제 코드 작성
public class MyCustomViewResolver implements ViewResolver, Ordered {
private int order;
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
if(viewName.startsWith("my-prefix")) {
return new MyCustomView(); // 뷰 이름이 my-prefix로 시작한다면 MyCustomView 객체를 반환
}
return null;
}
@Override
public int getOrder() {
return this.order;
}
public void setOrder(int order) {
this.order = order;
}
}
해당 코드에서 구현된 Ordered 인터페이스는 여러 뷰 리졸버가 있을 때, 우선순위를 설정하여 어떤 뷰 리졸버가 먼저 호출될지를 결정하는 데 사용된다.
멋쟁이사자처럼 강의자료