ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 02-2. ViewResolver 설정
    프로그래밍/Spring 2015. 9. 15. 22:57
    반응형

    SPRING 컨트롤러는 뷰에 의존적이지 않다.


    컨트롤러가 지정한 뷰 이름으로부터 응답 결과 화면을 생성하는 View 객체는 ViewResolver가 구한다. SPRING은 몇 가지 ViewResolver 구현 Class를 제공하고 있는데, 이중 주요 ViewResolver 구현 Class는 아래와 같다.


    InternalResourceViewResolver : 뷰 이름으로부터 JSP나 Tiles 연동을 위한 View 객체를 리턴한다.


    VelocityViewResolver : 뷰 이름으로부터 Velocity 연동을 위한 View 객체를 리턴한다.


    VelocityLayoutViewResolver : VelocityViewResolver와 동일한 기능을 제공하며, 추가로 Velocity의 레이아웃 기능을 제공한다.


    BeanNameViewResolver : 뷰 이름과 동일한 이름을 갖는 빈 객체를 View 객체로 사용한다.


    ResourceBundleViewResolver : 뷰 이름과 View 객체간의 Mapping정보를 저장하기 위해 Resource 파일을 사용한다.


    XmlViewResolver : 뷰 이름과 View 객체간의 Mapping정보를 저장하기 위해 XML 파일을 사용한다.


    * ViewResolver Interface

    - ViewResolver는 뷰 이름과 지역화를 위한 Locale을 파라미터로 전달받으며, Mapping되는 View 객체를 리턴한다. 만약, Mapping되는 View 객체가 존재하지 않으면 null을 리턴한다.


    * View 객체

    getContentType() 메서드는 "text/html"과 같은 응답 결과의 컨텐츠 타입을 리턴한다. render() 메서드는 실제로 응답 결과를 생성한다. render() 메서드의 첫 번째 파라미터인 model에는 컨트롤러가 리턴한 ModelAndView 객체의 모델 데이터가 전달된다. 각각의 View 객체는 이 모델 데이터로부터 응답 결과를 생성하는 데 필요한 정보를 구한다.


    * InternalResourceViewResolver 설정

    - InternalResourceViewResolver Class는 JSP나 HTML 파일과 같이 WEB Application의 내부 Resource을 이용하여 뷰를 생성하는 AbstractUrlBasedView 타입의 뷰 객체를 리턴한다. 기본적으로 사용하는 View Class는 InternalResourceView Class이다.

    - InternalResourceViewResolver는 컨트롤러가 지정한 뷰 이름으로부터 실제로 사용될 뷰를 선택하는데, 이 때 컨트롤러가 지정한 뷰 이름 앞뒤로 prefix 프로퍼티와 suffix 프로퍼티를 추가한 값이 실제로 사용될 Resource의 경로가 된다.


    * BeanNameViewResolver 설정

    - BeanNameViewResolver Class는 뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용한다. BeanNameViewResolver는 주로 커스텀 View Class를 뷰로 사용해야 하는 경우에 사용된다. 예를 들어, 파일 Download를 위한 정보를 읽어와 뷰에 전달하는 컨트롤러는 Download 관련 정보를 뷰에 전달할 것이다.


    * XmlViewResolver 설정

    - XmlViewResolver는 BeanNameViewResolver와 마찬가지로 뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용한다. 차이점이 있다면, XmlViewResolver는 별도의 Xml 설정 파일로부터 빈 객체를 검색한다는 것이다.

    - location 프로퍼티의 값을 지정하지 않을 경우 기본 값은 "/WEB-INF/views.xml" 이다. location 프로퍼티에 지정하는 파일은 SPRING XML 설정 파일이다.


    * ResourceBundleViewResolver 설정

    - ResourceBundleViewResolver는 리소스 번들(프로퍼티 파일)로 부터 뷰 이름과 Mapping되는 View Class를 구한다. ResourceBundleViewResolver는 ResourceBundleMessageSource와 마찬가지로 basename 프로퍼티나 basenames 프로퍼티를 이용해서 뷰 Class 정보를 저장한 Source경로를 명시한다.




    * 다수의 ViewResolver 설정하기

    - 하나의 DispatcherServlet은 한 개 이상의 ViewResolver를 설정할 수 있도록 하고 있다. 다수의 ViewResolver를 설정한 경우 "order" 프로퍼티를 이용하여 뷰 이름을 검사할 ViewResolver의 순서를 결정할 수 있다. "order" 프로퍼티의 값이 작은 ViewResolver가 높은 우선 순위를 갖는다. 만약, 우선순위를 명시하지 않으면 Integer.MAX_VALUE를 "order" 프로퍼티의 값으로 갖는다. (즉, 가장 낮은 우선순위를 갖게 된다.)

    ViewResolver 구현 Class가 org.springframework.core.Ordered Interface를 구현하지 않은 경우, 해당 ViewResolver 구현 Class 가장 낮은 우선 순위를 갖게 된다. 하지만, SPRING이 제공하는 ViewResolver 구현 Class는 모두 Ordered Interface를 구현하고 있다. DispatcherServlet은 "order" 프로퍼티의 값이 작은, 즉, 우선 순위가 높은 ViewResolver에게 뷰 객체를 요청한다. 만약, 우선순위가 높은 ViewResolver가 null을 리턴하면, 그 다음 우선순위를 갖는 ViewResolver에 뷰를 요청한다. 뷰 객체를 구하면, 해당 뷰 객체를 이용하여 응답 결과를 생성한다.




    - 우선 순위를 결정할 때 주의할 점은 InternalResourceViewResolver는 마지막 우선 순위를 갖도록 지정해야 한다는 점이다. 그 이유는 InternalResourceViewResolver는 항상 뷰 이름에 Mapping되는 뷰 객체를 리턴하기 때문이다. InternalResourceViewResolver는 null을 리턴하지 않기 때문에, InternalResourceViewResolver의 우선 순위가 높을 경우 우선순위가 낮은 ViewResolver는 사용되지 않게 된다.

    VelocityViewResolver와 (하위 Class인) VelocityLayoutViewResolver의 경우에도 우선순위를 지정할 때 주의해 주어야 한다. 이 두 ViewResolver는 뷰 이름에 Mapping되는 Velocity 템플릿 파일이 존재하지 않을 경우 null을 리턴하지 않고 예외를 발생시킨다. 따라서, VelocityViewResolver 역시 가장 낮은 우선순위를 갖도록 해야 한다. 

    반응형

    댓글 0

Designed by Tistory.