개발영어공부

[Spring 공식문서 번역 프로젝트]Spring Web MVC (1.1.9)

robinjoon98 2022. 5. 22. 21:51

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 ConfigView 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")에서 결정할 수 있습니다.

 

내용 이해중.. 추후 추가 예정