1.1.9. View Resolution
Spring MVC는 ViewResolver, View 인터페이스를 정의하여 개발자가 모델을 브라우저에서 렌더링할 때 특정 랜더링 기술(view technology 는 랜더링 기술로 번역했습니다.)에 얽메이지 않도록 하였습니다. ViewResolver 는 View의 이름과 실제 View를 대응시키는 기능을 제공합니다. View는 특정한 랜더링 기술로 넘어가기 전에 데이터를 미리 준비합니다.
아래 표는 ViewResolver의 계층구조에 대해 자세히 설명한 표입니다.
ViewResolver 종류 | 설명 |
AbstractCachingViewResolver | 이 클래스의 하위 클래스는 자신이 처리한 view 인스턴스를 캐싱합니다. 캐싱은 랜더링 기술의 퍼포먼스를 향상시킵니다.cache 속성을 false로 설정하여 캐싱을 끌 수 있습니다. 나아가 실행시간에 특정 뷰를 반드시 새로고침해야 하는 경우(예를 들어 마크업이 변경된 경우), removeFromCache(String viewName, Locale loc) 메서드를 이용할 수 있습니다. |
UrlBasedViewResolver | 논리적인 View의 이름의 URL로의 명시적인 매핑없이 직접 해결하는 ViewResolver 인터페이스의 간단한 구현입니다. 별도의 특별한 매핑 없이 간단한 방식으로 뷰의 논리적 이름과 실제 이름이 대응되는 경우에 사용하기 적절합니다. |
InternalResourceViewResolver | UrlBasedViewResolver 의 하위클래스로, InternalResourceView(사실상 Servlets, JSPs),그리고 이의 하위클래스인 JstlView 을 지원합니다. 자세한 사항은 UrlBasedViewResolver Javadoc 문서를 참조하세요. |
FreeMarkerViewResolver | UrlBasedViewResolver 의 하위클래스로 FreeMarkerView 와 그 하위클래스들을 지원합니다. |
ContentNegotiatingViewResolver | 요청 파일이름이나 Accept 헤더를 기반으로 view를 해결하는 ViewResolver 인터페이스의 구현체입니다. |
BeanNameViewResolver | 현재 application context 내부의 bean 이름을 view 이름으로 해석하는 ViewResolver 인터페이스의 구현체입니다. 이것은 별개의 view 이름에 기반을 둔 다양한 view 타입을 혼합하고 매칭시킬 수 있는 아주 유연한 변종입니다. 이러한 각 View는 설정클래스나 XML에서 bean으로 정의될 수 있습니다. |
Handling
한개 이상의 ViewResolver bean을 정의하여 chain을 만들 수 있고, 필요하다면 order 속성을 이용해 순서를 지정할 수 있습니다. order 속성의 값이 높을수록 chain의 끝에 위치하는 점을 기억하세요.
ViewResolver 계약에 따르면 null을 반환할 수 있고, 이는 적절한 View를 찾을수 없음을 의미합니다. 하지만, JSPs와 InternalResourceViewResolver의 경우에는, JSP가 존재하는지 알아내는 유일한 방법은RequestDispatcher을 통하는 것 뿐입니다. 그러므로, InternalResourceViewResolver 는 항상 모든 ViewResolver 체인의 마지막에 설정되어야만 합니다.
View resolution을 설정하는 것은 스프링 설정에 ViewResolver bean을 추가하는것 만큼 간단합니다. MVC Config 은 View Resolvers 를 위한 설정 api를 제공하고, 컨트롤러 로직 없이 HTML을 렌더링하기에 유용한 logic-less View Controllers 를 추가하기 위한 설정 api를 제공합니다.
Redirecting
View 이름에 redirect: 라는 특별한 접두어를 사용하면 redirect를 수행하게 됩니다. UrlBasedViewResolver와 그 하위 클래스들은 이 접두어를 redirect 가 필요하다는 명령으로 인식합니다. 접두어를 제외한 나머지 뷰 이름이 redirect할 URL입니다.
이는 컨트롤러가 RedirectView 를 반환한 것과 같은 결과를 보이지만, 컨트롤러 자신은 논리적인 View 이름으로 동작할 수 있습니다. 논리적인 View 이름( redirect:/myapp/some/resource 과 같은) 현재 Servlet context를 기준으로 redirect 하지만, redirect:https://myhost.com/some/arbitrary/path 와 같은 이름이라면 URL을 절대경로로 인식하여 리다이렉트됩니다.
컨트롤러 메서드에 @ResponseStatus 어노테이션이 붙어있다면, 어노테이션 값이 RedirectView에서 설정한 응답값보다 더 우선됩니다.
Forwarding
UrlBasedViewResolver 및 서브 클래스에 의해 최종적으로 해결되는 뷰 이름에 특별한 forward: 접두사를 사용할 수도 있습니다. 그러면 RequestDispatcher.forward()를 실행하는 InternalResourceView가 만들어집니다. 따라서 이 접두사는 InternalResourceViewResolver 및 InternalResourceView (JSP의 경우)에서는 도움이되지 않지만 다른 뷰 기술을 사용하면서도 리소스 전송을 서블릿 / JSP 엔진에서 처리하도록 강제 할 때 유용합니다.
Content Negotiation
ContentNegotiatingViewResolver 는 자신이 직접 View를 처리하는 대신 다른 ViewResolver에 처리를 위임합니다. 그리고 클라이언트가 요청한 View와 가장 유사한 View를 선택합니다. 보기 형식은 Accept 헤더 또는 쿼리 매개변수(예: "/path?format=pdf")에서 결정할 수 있습니다.
내용 이해중.. 추후 추가 예정
'개발영어공부' 카테고리의 다른 글
[Spring 공식문서 번역 프로젝트]Spring Web MVC (1.1.5 ~1.1.8) (0) | 2022.05.08 |
---|---|
[Spring 공식문서 번역 프로젝트] Spring Web MVC (~1.1.4) (0) | 2022.04.07 |
[JVM 공식문서 번역프로젝트] 1. Introduction (0) | 2022.03.29 |