캠핑과 개발


Tiles는 기존에 UI Layout에서 인기있었던 라이브러리였다. 비록 각각의 뷰 파일을 만들어야 하는 번거러움이 있음에도 불구하고, include를 제거할수 있는 좋은 대안으로 인기가 있었다. 그후 Sitemesh 라는게 유행했는데 뷰마다 각각의 파일을 만들필요가 없어서 인기가 있었다. 최근까지도 나는 이걸 이용했었다. 다시또 유행하는게 Tiles 2 인데 이놈은 Spring Reference에 나올 정도로 인기가 급상승 중이다. 이런 Layout 라이브러리(또는 프레임웍)는 왼만해서는 새로 변경하지 않는데, Sitemesh의 불편한점(누구나 처음 쓸때 겪은 Sitemesh의 곤란함)을 털어보고자 Tiles2에 도전해 본다.

일반적인 Controller 를 이용한 매핑 예제를 알아본다.(Tiles는 Annotaion과 무관함으로 annotation 기반이라고 해서 특별히 설정할것은 없다.)

Spring MVC 설정에서 ViewResolver는 보통 아래와 같다.

 <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/jsp/" />
  <property name="suffix" value=".jsp" />  
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
 </bean>

이것은 Controller를 Annotation기반으로 할때도 변함없다. 그러나 Tiles2는 UrlBasedViewResolver를 사용하고 뷰클래스도 TilesView를 사용한다.

 <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
 </bean>

물론 Sitemesh처럼 설정파일도 있다.
Sitemesh와 설정의 차이점은 설정이 Spring Bean으로 Integration되었다는것이다. TilesConfigurer를 아래와 같이 설정한다.

 <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
  <property name="definitions">
   <list>
    <value>/WEB-INF/tiles-defs/templates.xml</value>
   </list>
  </property>
 </bean>

이것이 Spring과 연동하는 끝이다. 두개의 Bean 설정만으로 연동이 끝이다.

나머지 Tiles2 사용법은 Sitemesh를 사용해봤다면 크게 다를만한 것이 없다. 간단히 개념만 정리한다면 Controller View Name만 Tiles2 definition과 일치하면 해당 layout으로 랜더링된다. 이해하기 쉽게 순서적으로 나열해 보면 먼저 Controller를 다음과 같이 만든다.

 @RequestMapping("/index.do")
 public void index(ModelMap model){
  model.addAttribute("msg","Donkey!!");
 }

이것은 index.do를 요청하면 index() 메서드를 호출하고 msg변수를 model에 담아 index viewName과 매핑한다. 만약 Tiles2 설정파일(templates.xml)이 아래와 같다면,

 <definition name="default" template="/WEB-INF/templates/layout1.jsp">
  <put-attribute name="header" value="/WEB-INF/templates/header.jsp" />
  <put-attribute name="footer" value="/WEB-INF/templates/footer.jsp" />
  <put-attribute name="body" value="/WEB-INF/templates/body.jsp" />
 </definition>
 <definition name="index" extends="default">
  <put-attribute name="body" value="/WEB-INF/jsp/index.jsp" />
 </definition>


definition name이 index인것과 매핑되여 해당 /WEB-INF/jsp/index.jsp 파일과 랜더링 된다. 물론 default definition을 상속했으니 해당 layout의 특성을 가져오고 body속성(attribute)만 index.jsp로 바뀐다.

이렇게 일일히 모든 view를 definition 테그로 만든다는것은 별로 좋은생각이 아닌것 같다. 이런 설정을 줄여줄수 있는 방법이 있다. 거기에 대해서 다음글에 포스트하기로 한다.

출처 : http://yunsunghan.tistory.com/258