◆ 템플릿 엔진(템플릿 프레임워크) - Tiles

일정 틀을 유지하면서 view를 꾸며야 할 때, 템플릿엔진(프레임워크)을 사용하면 쉽게 구현이 가능함.
스프링에 국한된 내용이 아니라, 굳이 스프링이 아니더라도 템플릿엔진은 사용이 가능함.

  • 스프링은 이 템플릿 프레임워크를 이용해서 view를 처리하는 것을 지원함
  • 다양한 종류의 템플릿엔진이 이는데, 그 중에서 Tiles라는 걸 이용해서처리


▶ 라이브러리 추가

https://tiles.apache.org/download.html로 접속하여 Tiles3.0버전 메이븐 3개중에 밑에 두개 받기


▶ 스프링 설정파일에 추가

2버전 3버전이 있지만 3버전으로 받도록 하자

<bean class="org.springframework.web.servlet.view.tiles3.TilesViewResolver"></bean>
<bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <property name="definitions">
        <array>
            <value>/WEB-INF/tiles/*-tiles.xml</value>
        </array>
    </property>
</bean>

definitions의 값을 array로 여러개의 tiles설정 파일을 등록할 수 있다.


▶ definitions파일 만들기

위에서 설정한 경로로 해당 이름의 xml파일을 만든다.
https://tiles.apache.org/framework/tutorial/basic/pages.html로 접속하여 아래와 비슷한 형태를 복사해서 붙여넣어준다.

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


▶ definitions파일 설정

위에서 만든 xml파일에서 아래와 같이 템플릿설계를 추가한다.

<tiles-definitions>
    <definition name="index" template="/WEB-INF/view/mainTemplate.jsp">
        <put-attribute name="title" value="Spring MVC"></put-attribute>
        <put-attribute name="side" value="/WEB-INF/view/side-01.jsp"/>
        <put-attribute name="main" value="/WEB-INF/view/login.jsp"/>
    </definition>
</tiles-definitions>
  • <definition name=”index” template=”/WEB-INF/view/mainTemplate.jsp”>
    컨트롤러에서 리턴 할 때 name에 설정한 ‘index’이름을 리턴하면 template의 경로로 이동하게 된다.
  • <put-attribute>
    사용되는 jsp페이지에서 문자열로 불러오거나, 해당 경로를 include하기 위해 사용하는 파라미터값


▶ 컨트롤러 경로 리턴 우선순위

Tiles의 definition name과 컨트롤러의 RequestMapping이름이 같을 때, TilesViewResolver와 InternalResourceViewResolver의 우선순위에 따라 어떤 경로로 이동할 것인지 설정할 수 있다.

  • TilesViewResolver설정
<bean
 class="org.springframework.web.servlet.view.tiles3.TilesViewResolver">
    <property name=order value=1> // 우선순위 1
</bean>
<bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <property name="definitions">
        <array>
            <value>/WEB-INF/tiles/*-tiles.xml</value>
        </array>
    </property>
</bean>
  • InternalResourceViewResolver설정
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/view/"></property>
    <property name="suffix" value=".jsp"></property>
    <property name="order" value="2"> // 우선순위 2
</bean>
  • InternalResourceViewResolver은 컨트롤러에서 경로를 리턴 할 때 해당 이름 앞(prefix)과 뒤(suffix)에 자동적으로 붙여질 이름을 설정하는 객체이다.
  • <property name=”order” value=”1”>을 적어주어 value의 숫자가 낮은 쪽이 우선순위가 높아진다. 따라서 Tiles의 우선순위가 높을 경우 RequestMapping과 Tiles name이 겹치지 않을때만 prefix와suffix를 붙인 경로로 이동된다.

단, 주의할 점으로는 InternalResouceViewResover를 먼저 등록 시키게 되면, 페이지 낫 파운드가 발생하므로 TilesViewResolver를 먼저 등록시켜야 한다.


▶ JSP뷰 파일 만들기

definitions파일에서 설정한 template경로의 jsp파일을 만들어 <%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>를 추가하여 Tiles에서 제공하는 기능을 JSTL태그를 통하여 사용할 수 있도록 한다.

  • <tiles:getAsString name=”title”></tiles:getAsString>
    타일즈 설정파일에 등록한 title이라는 name의 value를 문자열로 가져오기
  • <tiles:insertAttribute name=”side”></tiles:insertAttribute>
    타일즈 설정파일에 등록한 side라는 name의 value경로 jsp파일을 include


위 Definitions설정처럼 설정했을 시 아래와 같은 결과를 얻는다.

<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>

// => Spring MVC 반환
<tiles:getAsString name="title"/> 

// => /WEB-INF/view/side-01.jsp 를 include
<tiles:insertAttribute name="side">

Attribute를 Definitions파일에 등록해두고 문자열이나 경로로 반환받기 때문에 해당 경로에 파일이 존재하지 않아도 불러오지 않으면 에러가 발생하지 않는다.
또한 tiles에 의해 합쳐진 jsp파일 모두에서 해당 Attribute를 사용할 수 있으며, EL태그를 통해 템플릿을 좀 더 동적으로 사용할 수 있다.


▶ Tiles 중복처리

반복적으로 포함되는 일정한 패턴같은 경우는 extends옵션에 포함할 name을 적어 상속받아 사용하면 일일히 추가할 필요가 없다.

<definition name="t_default" template="/WEB-INF/view/mainTemplate.jsp">
    <put-attribute name="title" value="Spring MVC"/>
    <put-attribute name="side" value="/WEB-INF/view/side-01.jsp"/>    
</definition>

<definition name="index" extends="t_default">
    <put-attribute name="title" value="override"/>
    <put-attribute name="main" value="/WEB-INF/view/index.jsp"/>
</definition>

// title값은 override 된다.

템플릿을 상속받게 될 경우 중복되는 속성은 상속받은 쪽의 값이 우선으로 덮어씌워지고, 없는 값들은 추가된다.


◆ Tiles EL태그 지원

tiles에서는 EL태그를 지원해 주기 때문에 좀 더 동적으로 페이지를 설계할 수 있다.
타일즈에서 EL태그를 사용하기 위해서는 TILES EL SUPPORT 라이브러리가 필요하다


▶ 메이븐 추가

<!-- https://mvnrepository.com/artifact/org.apache.tiles/tiles-el -->
<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-el</artifactId>
    <version>3.0.8</version>
</dependency>


▶ 사용법

<put-attribute>태그의 값을 value가 아닌 expression으로 셋팅하면 EL태그의 값으로 설정할 수 있다.

컨트롤러에서 Map이나 Model객체를 통해 셋팅한 값을 파일명등에 셋팅시켜 동적인 페이지 변환이 가능하도록 구성할 수 있고,
Tiles설정파일의 등록할 개수를 최소화 시킬 수도 있다.

<definition name="t_el" extends="t_default">
    <put-attribute name="main" expression="/WEB-INF/view/${main}"/>
</definition>

Tiles사용 주의)
Tiles로 만들어진 페이지에서 해당 페이지를 제외한 include로 포함되는 페이지들은 <head>나 <body>등 공통적인 설정태그들은 모두 지워주어야 한다.
즉, 중간에 그대로 삽입된다고 생각하고 설계해야한다.