Search
Duplicate
🎾

ViewResolver

스프링의 Controller 클래스는 크게, @ResponseBody 어노테이션을 가지고 있는 @RestController와 View를 반환하는 일반적인 @Controller로 나뉜다.
@RestController가 적용된 클래스의 반환 값은 HttpMessageConverter에 의해 직렬화되어 반한된다.
@Controller가 적용된 클래스의 반환 값은 View의 이름으로 간주되어 ViewResolver가 어플리케이션 내의 적절한 View 파일을 찾아 처리한다.
핸들러 매핑이 URL로부터 컨트롤러를 찾아주는 것처럼 뷰 이름으로부터 사용할 뷰 객체를 찾아준다.
ViewResolver를 Bean으로 등록하지 않는다면 DispatcherServlet의 기본 ViewResolver인 InternalResourceViewResolver가 사용된다.
핸들러 매핑과 마찬가지로 뷰 리졸버도 하나 이상을 빈으로 등록해서 사용할 수 있는데, 이때 order 속성을 이용해 적용 순서를 지정해주는 것이 좋다.

종류

InternalResourceViewResolver
뷰 리졸버를 지정하지 않았을 때, 자동등록되는 디폴트 뷰 리졸버다. 주로 JSP를 뷰로 사용하고자 할때 사용한다.
디폴트 상태로 사용할 경우, /WEB-INF/view/hello.jsp를 뷰로 이용한다고 했을때, 전체 경로를 모두 적어주어야 한다.
이보다는 InternalResourceViewResolverprefix, suffix 프로퍼티를 이용해서 항상 앞뒤에 붙는 내용을 생략할 수 있다.
프로퍼티 설정을 해주려면 결국 InternalResourceViewResolver를 Bean으로 등록하는 수밖에 없다.
뷰와 관련된 DispatcherServlet의 전략 중에는 RequestToViewNameTranslator라는 것도 있다.
이 전략은 뷰 이름을 컨트롤러가 넘겨주지 않을 때, URL을 이용해 자동으로 뷰 이름을 만들어준다.
이로 인해서 이름 규칙을 잘 정해두고 지킨다면 컨트롤러에서 비슷한 패턴의 뷰 이름을 매번 리턴하지 않아도 된다.
VelocityViewResolver, FreeMarkerViewResolver
템플릿 엔진 기반의 뷰인 VelocityViewFreeMarkerView를 사용하게 해주는 뷰 리졸버다.
사용 방법은 InternalResourceViewResolver와 유사하다. 컨트롤러가 반환한 뷰 이름에 prefixsuffix를 붙여서 실제 템플릿 파일 이름을 생성한다.
다만 JSP는 다르게 템플릿의 경로를 만들 때 사용할 root 경로를 미리 VelocityConfigurerFreeMarkerConfigurer로 지정해주어야 한다.
ResourceBundleViewResolver, XmlViewResolver, BeanNameViewResolver
여러 가지 종류의 뷰를 혼용하거나 뷰의 종류를 코드 밖에서 변경해줘야하는 경우가 있다.
이때 단순히 뷰의 종류를 모두 JSP, Velocity, FreeMarker 등으로 변경하는 것이라면 기존 뷰 리졸버를 바꾸고 prefix, suffix를 활용하면 된다.
만약 컨트롤러마다 뷰의 종류가 달라질 수 있다면 한 가지 뷰만을 지원하는 뷰 리졸버를 사용할 수 없다.
이런 경우에는 외부 리소스 파일에 각 뷰 이름에 해당하는 뷰 클래스와 설정을 담아두고 이를 참조하는 ResourceBundleViewResolverXmlViewResolver를 사용하면 된다.