상세 컨텐츠

본문 제목

ViewResolver 인터페이스

프로그래밍/JAVA

by 라제폰 2012. 6. 13. 14:09

본문

ViewResolver 를 이용하여 View 를 적절히 설정하기 이전에, Spring MVC 원초적으로 View 를 렌더링하는 방법을 알아보자. 어떻게 하는 것이 가장 원초적이고 기본적인 Spring MVC 구조일까 ?

컨트롤러를 하나 작성한다. 이 컨트롤러는 AbstractController 를 상속받아 handleRequestIntarnal 메소드를 구현함으로써 완성될 것이다. 이 메소드는 ModelAndView 객체를 리턴하며, 생성자의 인자로 View 인터페이스 구현 객체와 출력을 위한 정보로써 Map 을 전달한다. 
View 인터페이스 구현 클래스는 render 메소드를 구현해야하며, 구현 코드는 HttpResponse 객체에 적절한 데이타를 쓰는 것으로써 마무리된다.
최종적으로 이러한 구성을 스프링에서 설정하게 될 것이다. 즉, 빈으로 컨트롤러와 뷰를 등록한다.( 등록하면 싱글톤으로 사용하겠다는 의미, 하지 않으면 매번 new 해서 생성해 줄 것이다).

여기까지 작업했다면 답답함을 느껴야할 것이다.

모든 뷰를 스프링 빈으로 작접 설정한다면 JSP페이지를 독립된 빈으로 설정해야한 할 것이다. 너무 불편하다.
간편하게 뷰를 정의하고 모든 작업을 스프링에게 위임할 수 있는 구조가 필요하다.

이러한 경우 필요한 것이 바로 ViewResolver 이다.

ViewResolver 는 이름과 로케일에 따라서 적절한 뷰를 찾아 인스턴스화하기 위해 스프링 MVC 가 사용하는 인터페이스이다. 이 인터페이스는 그 유명한 Strategy 패턴으로 작성되어 있단다(?)

스프링은 다양한 ViewResolver 인터페이스 구현체를 제공한다. 모두 resolveViewName(String viewName, Locale locale) 메소드를 구현하고 있다. 더불어 locale 파라메터를 통해서 이 값에 따라서 서로 다른 뷰를 반환하도록 할 수 있다. 즉 클라이언트 로케일에 따라서 뷰가 달라질 수 있다는 말이다.
스프링이 제공하는 ViewResolver 를 살펴보자

- BeanNameViewResolver
애플리케이션 컨텍스트에 설정된 빈을 View 로 사용하려고 시도.
뷰에 대한 정의를 외부 파일로 뺄 필요가 없는 작은 프로젝트에 유용.
제약사항 : 뷰를 애플리케이션 컨텍스트내에 스프링 빈으로 설정해야만 하며, i18n(국제화)를 지원하지 않는다.

- ResourceBundleViewResolver
위의 것보다 훨씬 복잡.
뷰 정의가 별도의 설정파일에 보관됨.
View 빈을 애플리케이션 컨텍스트에 설정할 필요가 없음.
국제화 지원.
예)
<bean id="viewResolver" class="....ResourceBundleViewResolver">
  <property name="basename" value="views" />
</bean>
위의 내용은 ResourceBundleViewResolver 를 사용한다는 선언과 동시에 클래스패스 안에 존재하는 views_<LID>.properties 파일을 뷰 정의 파일로 찾겠다는 의미이다. <LID> 는 로케일 식별자(EN, FR, ES, KO) 에 대응한다. ( views_KO.properties ). 머 아시는 이야기겠지만 views_KO.properties 파일이 없다면 views.properties 파일을 찾게 될 것이다.
프로퍼티 파일의 문법은 viewname.class=class-name 과 viewname.url=view-url 형태이다.
views.properties 내용
product-index.class=org.springframework.web.servlet.view.JstlView
products-index.url=/WEB-INF/views/en_GB/product/index.jsp

- UrlBasedViewResolver
URL 을 사용하여 적절한 뷰를 인스턴스화하며 URL 접두어/접미어를 설정할 수 있다.
국제화를 지원하지 않음.
규모가 큰 프로젝트에서는 뷰의 관리가 힘들어진다.

- XmlViewResolver
뷰에 대한 정의가 별도의 파일에 보관된다(ResourceBundleViewResolver 와 동일).
그러나 국제화가 지원되지 않음

- InternalResourceViewResolver
UrlBasedViewResolver 를 상속.
JstlView 와 TilesView 와 같은 서브클래스들과 InterResourceView (서블릿, JSP)를 지원.
이 리졸버에 의해 생성되어지는 모든 뷰들을 위한 뷰 클래스는 viewClass 속성을 통해 지정.
( 이 속성의 기본값은 InterResourceView 이거나 혹은 JSTL API 존재시 JstlView 가 된다. ).
수동으로 입력한 URL을 통한 직접적 접근으로부터 JSP파일들을 숨기기 위해서 WEB-INF 아래에 JSP를 뷰로써 제공하는데 실질적으로 사용된다. 이 위치는 오직 컨트롤러만이 접근할 수 있기 때문이다.
예) JstlView 와 함께 사용시..
<bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
  <property name="prefix" value="/WEB-INF/jsp/"/>
  <property name="suffix" value=".jsp"/>
</bean>
 
위의 예를 따른다면, "myView" 라는 뷰명은 "/WEB-INF/jsp/myView.jsp" JSP 리소스로 해석하며, JSTL 지원을 명시하기 위해 viewClass 를 JstlView 로 지정하였다.

관련글 더보기