반응형

Spring 3.0 기반의 MVC 에서는 여러가지 Resolver를 통해서 각 페이지를

 

호출할 수 있도록 지원해주고 있다. 하지만, Resolver를 2개 이상 사용하기 위해서는

 

여러가지 번거로움이 있다. 특히 eGov (전자정부 F/W)을 활용하여 개발하였을때에는

 

Mulit Resolver를 구현하기 위해서는 별도 Java파일로 Custom Resolver를 구현해주어야 한다.

 

(1) Multi Resolver를 구현하기 위해 별도 Java File 생성함.

package com.bizdebn.common.resolver;

import java.util.Locale;
import org.springframework.core.Ordered;
import org.springframework.web.servlet.view.AbstractUrlBasedView;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.view.UrlBasedViewResolver;

/**
 * <pre>
 *   CustomViewResolver 구현체 Class
 *   UrlBasedViewResolver 에서는 특정 surfix에 매칭되는 URL Pattern이 아니면 Exception을 발생하는 문제가 있음.
 *   다중 View Resolver를 구현하기 위해서 Exception이 아닌 null을 반환하여 p:order값에 따른 여러
 *   ViewResolver를 호출할 수 있도록 Customizing함.
 * </pre>
 *
 * @author sungrangkong
 * @since 2013. 10. 16.
 * @version 1.0
 */
public class CustomViewResolver extends UrlBasedViewResolver implements Ordered {

 /**
  * <pre>
  * UrlBasedViewResolver의 loadView 를 오버라이딩 함.
  * 기존 loadView에서는 surfix의 확장자에 매칭되는 URL이 없으면 Exception 호출하기 때문에
  * 타 Resolver가 호출되지 않음. 따라서, null을 리턴하도록 수정함.
  *
  * 해당 코딩기법은 e-gov framework Q&A 에서 권고하는 사항을 확인함.
  * </pre>
  *
  * @author sungrangkong
  * @since 2013. 10. 16
  * @version 1.0
  */
 protected View loadView(String viewName, Locale locale) throws Exception {
  AbstractUrlBasedView view = buildView(viewName);
  View viewObj = (View) getApplicationContext().getAutowireCapableBeanFactory().initializeBean(view, viewName);
  if (viewObj instanceof JstlView) {
   JstlView jv = (JstlView) viewObj;
   if (jv.getBeanName().indexOf(".jsp") != -1) {
    return null;
   }
  }
  return viewObj;
 }
} 

 

설명 : 위코드를 보고 잠시 설명하도록 하자. 기존에 eGov에서 많이 사용하는 UrlBasedViewResolver는

InternalResourceViewResolver 를 상속받아 구현한 Resolver이다.

InternalResourceViewResolver의 특징은 만약 prefix와 surfix에 매칭되는 URL이 아닌경우에는 Exception

을 발생시키게 된다. 이러한 문제때문에 multi resolver를 선언하였을 경우에는 우선순위에 따라 아래의

Resolver가 실행이 안되는 문제점이 발생된다. 위 소스에서는 Exception을 발생시키는 해당 메소드인

loadView 메소드를 단순 null값을 반환하는 로직으로 오버라딩 한 것이다.

 

(2) Spring MVC 설정파일 수정

  <!-- CustomView Resolver 설정(다중View를 사용하기 위해, 확장자가 JSP인경우 NULL을 리턴하도록 구현함) -->
    <bean class="com.bizdebn.common.resolver.CustomViewResolver" p:order="1"
      p:viewClass="org.springframework.web.servlet.view.JstlView"
      p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
    
<!-- UrlBasedViewResolver 설정(확장자가 html인 데이터도 보여줄 수 있도록 다중 뷰 구현함) -->  
    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="2"
      p:viewClass="org.springframework.web.servlet.view.JstlView"
      p:prefix="/WEB-INF/jsp/" p:suffix=".html"/>

 

설명 : 위 설정파일을 보게 되면 우선순위 값인 p:order 값이 1인 CustomViewResolver가 먼저 동작하게 된다.

만약 매칭되는게 없다면 (1) 에서 오버라딩한 메소드 내부에서 null을 반환하기 때문에 p:order가 2인 UrlBasedViewResolver

가 구동되게 된다.

 

 

실제 삼성에서 만든 Anyframework 또한, 위와 같은 작업을 해주어야 한다고 guide에 나와있는것을 확인하였다.

eGov또한 Q&A게시판을 통해 조회한 결과 위와 같은 작업을 해주어야 한다고 한다.

 

Spring MVC가 편한건 사실이지만, 저러한 잡다한 설정으로 인해 결국, Struts2로 마음이 가게되는게 사실이다.

 

그럼 이상 랑이의 공부는 끝!!

 

 

- 2013.10.20 밤에 공부중인 랑이의 글 -

반응형

+ Recent posts