얼마전 백기선님의 "스프링 MVC에서 타일즈 2 사용하기" 포스팅을 참조로 스트라이프에서 스프링 MVC + 타일즈로 갈아탔었다. 당시에는 급박해서 그냥 그대로 하긴 했었는데 다음과 같이 페이지마다 definition 을 설정하는 것은 영 성가신게 아니다.

<definition name="cm/meta/meta.create" extends="tiles/cm">

<put-attribute name="title" value="메타 속성 등록" />

<put-attribute name="menu" value="/tiles/menu.cm.jsp" />

<put-attribute name="description" value="메타 속성을 등록합니다." />

<put-attribute name="body" value="/cm/meta/meta.create.spring.jsp" />

</definition>

<definition name="cm/meta/meta.modify" extends="tiles/cm">

<put-attribute name="title" value="메타 속성 수정" />

<put-attribute name="menu" value="/tiles/menu.cm.jsp" />

<put-attribute name="description" value="메타 속성을 수정합니다." />

<put-attribute name="body" value="/cm/meta/meta.modify.spring.jsp" />

</definition>

<definition name="cm/meta/meta.delete" extends="tiles/cm">

<put-attribute name="title" value="메타 속성 삭제" />

<put-attribute name="menu" value="/tiles/menu.cm.jsp" />

<put-attribute name="description" value="메타 속성을 삭제합니다. 이미 컨텐츠 유형이나 분류체계 유형에서 사용하고 있다면 삭제할 수 없습니다. 정말 삭제하시겠습니까?" />

<put-attribute name="body" value="/cm/meta/meta.delete.spring.jsp" />

</definition>


1. 기본 스프링 & 타일즈 설정


그래서 이런 노가다를 없앨 수 있는 방법을 타일즈에서는 여러가지 방법으로 제공하고 있다.

이번에 적용할 방법은 EL 표현식과 와일드카드를 이용하는 방법이다.

이런 방법을 사용하기 위해서는 타일즈 팩토리를 만들어 낼 때, 몇가지 설정이 추가되어야하는데 다행히 스프링에서 엄청 간단한 방법을 제공하고 있다.


<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">

<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"></property>

<property name="order" value="1" />

</bean>

<bean id="viewResolver2" class="org.springframework.web.servlet.view.BeanNameViewResolver" >

<property name="order" value="2"></property>

</bean>

<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/" />

<property name="suffix" value=".spring.jsp" />

<property name="order" value="3" />

</bean>

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">

<property name="completeAutoload"><value>true</value></property>

<property name="definitions">

<list>

<value>/WEB-INF/tiles2/tiles-*.xml</value>

</list>

</property>

</bean>


위 소스는 뷰리졸버로, 첫번째로 타일즈 뷰 그거없으면 빈네임으로, 그것도 없으면 jsp 렌더링으로 하라는 소스다. 요건 하든지 말든지 알아서 하시고 ㅎㅎ,

여튼, 중요한건 타일즈 속성의 completeAutoload 속성을 true 로 하면 여러가지 표현식을 사용할 수 있게 된다.

물론 이러한 기능을 사용하기 위해서는 tiles-core 가 아닌 tiles-extra 라이브러리가 필요하다.

메이븐 설정에 다음이 들어가 있어야한다.(물론 메이븐을 안 쓰면, 라이브러리만 구해다가 클래스 패스에 등록하면 된다)


<dependency>

<groupId>org.apache.tiles</groupId>

<artifactId>tiles-extras</artifactId>

<version>2.2.2</version>

</dependency>


자, 이제 필요한 설정은 전부 끝났다.

와일드카드와 EL 표현식을 적용한 샘플을 작성해보자.

우선 레이아웃 페이지를 작성한다.


/layout/admin-layout.xml

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %><%@ 

taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ 

taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %><%@

taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"

%><!doctype html>

<html lang="ko">

<head>

<meta charset="utf-8">

<meta name="description" content="타일즈 어플리케이션">

<meta name="keywords" content="">

<title><tiles:insertAttribute name="title" /></title>

</head>

<body>

<div id="header">

<h1><tiles:insertAttribute name="title" /></h1>

<nav id="main-menu"><tiles:insertAttribute name="menu" /></nav>

</div>

<div id="page-content">

<tiles:insertAttribute name="body" />

</div>

</body>


주의 깊게 볼 부분은 레이아웃에 넘겨줄 속성 부분이다. 위 샘플은 title, menu, body 를 넣도록 하고 있다.


그다음은 타일즈에서 해당 레이아웃을 사용하고, 각 속성을 넣을 방법을 정의하는 타일즈 deifnition 설정 부분이다.


/WEB-INF/tiles2/tiles-layout.jsp

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">

<tiles-definitions>

<!-- Default Layout -->

<definition name="default-layout" template="/layout/default-layout.jsp">

<put-attribute name="title" value="무제" />

<put-attribute name="menu" value="/layout/empty.jsp" />

<put-attribute name="body" value="/layout/empty.jsp" />

</definition>

<!-- Content -->

<definition name="tiles/admin/index" extends="default-layout">

<put-attribute name="title" value="관리자 페이지" />

<put-attribute name="menu" value="/layout/menu.admin.jsp" />

<put-attribute name="body" value="/admin/index.jsp" />

</definition>

</tiles-definitions>


일단은 definition 에서 수동으로 들어갈 값을 직접 입력해보았다. 이후에 el 표현식과 와일드 카드를 순차적으로 적용하는 것을 보여드릴테니, 조급해하지 마시길:)


그다음은 컨트롤러다.


import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.servlet.ModelAndView;


@Controller

public class AdminController {

@RequestMapping("/admin/index.do")

public ModelAndView adminIndex() {

ModelAndView mav = new ModelAndView("tiles/admin/index");

return mav;

}

}



위와 같이 작성하면 /admin/index.do 로 접근시에 다음과 같이 렌더링된다.

<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta name="description" content="타일즈 어플리케이션">
<meta name="keywords" content="">
<title>관리자 페이지</title>
</head>
<body>
<div id="header">
<h1>관리자 페이지</h1>
<nav id="main-menu">
<ul>
<li>전광판 관리</li>
<li>사용자 관리</li>
</ul>
</nav>
</div>
<div id="page-content">
<p>관리자 페이지입니다.</p>
</div>
</body>




자, 이제 노가다를 없애보자.


2. EL 적용


우선 타이틀을 타일즈 설정 파일에서 박는게 아니라 컨트롤러에서 값을 유동적으로 변경 가능하도록 해보자.

컨트롤러를 다음과 같이 title attirbutue 를 추가한다.

@Controller

public class AdminController {

@RequestMapping("/admin/index.do")

public ModelAndView adminIndex() {

ModelAndView mav = new ModelAndView("tiles/admin/index");

mav.addObject("title", "관리자 페이지");

return mav;

}

}


그리고 타일즈 설정파일에 해당 값을 el 표현식으로 바꾼다. value 속성이 아닌 expression 속성을 사용한다는 것을 명심하자.


<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">

<tiles-definitions>

<!-- Default Layout -->

<definition name="default-layout" template="/layout/default-layout.jsp">

<put-attribute name="title" value="무제" />

<put-attribute name="menu" value="/layout/empty.jsp" />

<put-attribute name="body" value="/layout/empty.jsp" />

</definition>

<!-- Content -->

<definition name="tiles/admin/index" extends="default-layout">

<put-attribute name="title" expression="${title}" />

<put-attribute name="menu" value="/layout/menu.admin.jsp" />

<put-attribute name="body" value="/admin/index.jsp" />

</definition>


</tiles-definitions>


끝이다. 

만약, template 속성에도 el 을 적용하고 싶을 경우에는 template 속성 대신, templateExpression 속성을 


3. 와일드 카드 적용


이번엔 와일드 카드를 이용해서, body 영역과 메뉴도 동적으로 변경해보자. (이부분도 el 표현식을 이용해도 상관은 없다. 이 글에선 샘플 작성을 위해 일부러 와일드 카드를 이용한다.)


<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">

<tiles-definitions>

<!-- Default Layout -->

<definition name="default-layout" template="/layout/default-layout.jsp" templateExpression="">

<put-attribute name="title" value="무제" />

<put-attribute name="menu" value="/layout/empty.jsp" />

<put-attribute name="body" value="/layout/empty.jsp" />

</definition>

<!-- Content -->

<definition name="WILDCARD:tiles/*/**" extends="default-layout">

<put-attribute name="title" expression="${title}" />

<put-attribute name="menu" value="/layout/menu.{1}.jsp" />

<put-attribute name="body" value="/{1}/{2}.jsp" />

</definition>

</tiles-definitions>


우선 와일드 카드를 사용하는 부분에 대해선 "WIDCARD:" 라고 prefix 코드를 넣어줘야한다. 

그러며 * 패턴에 대해 매칭되는 갑사을 순차적으로 {1}, {2} 등으로 사용할 수 있게 한다.


위 설정대로라면 "/tiles/admin/index" 라는 뷰네임은 다음과 같이 매핑된다.

  • {1} : admin
  • {2} : index
패턴중에 ** 라고 기입을 하면, '이하' 로 풀이한다. (앤트 표현식)
위와 같이 설정한 이유는 다음과 같은 방식에서도 유효하게 하기 위함이다.

예를 들어 "tles/admin/user/manage" 일 경우
  • {1} : admin
  • {2} : user/manage
이렇게 와일드 카드와 el 표현식을 이용해 노가다를 상당히 줄여줄 수 있을 것이다. 다만, 스트라이프처럼 jsp 에 레이아웃으로 값을 넘기는 방법에 대해서는 아직 모르겠다. (타일즈 3.x 에서는 있으려나 모르겠다.)


이 문서는 스프링 3.0.7, tiles 2.2.2 로 작성되었다.


참조링크

  • http://whiteship.me/?p=11657
  • http://tiles.apache.org/2.2/framework/tutorial/advanced/wildcard.html
  • http://tiles.apache.org/2.2/framework/tutorial/advanced/el-support.html
  • http://kaludin.egloos.com/2799009



  1. 죠니 2013.03.13 08:33

    이런글은 추천하라고 배웠습니다.

+ Recent posts