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