>

TIL

decorators.xml 파일

ekdud 2025. 1. 17. 14:57

📑

     

    decorators.xml

    웹 어플리케이션을 구성하고 있는 웹 페이지들은 대부분은 페이지 레이아웃이 동일하게 구성되어 있다. 따라서 동일한 레이아웃을 여러 페이지에 적용하게 된다. 이를 쉽게 할 수 있게 해주는 것이 tiles, velocity, siteMesh 등의 기술이다.

    Apache Tiles(프레임워크) - <jsp.include>, <%include%>와 비슷한 역할. 하지만 tiles의 성능이 더 우수.

    Apache Velocity(템플릿 엔진) - Java 코드에 정의된 객체를 참조하는 템플릿 언어를 제공함. 웹 애플리케이션에서 프레젠테이션 계층과 비즈니스 계층 MVC 패턴에 맞게 분리하는 것을 목표로 함.

     

    Tiles나 Velocity 방식이 전체 페이지 중 내용 부분에 해당하는 코드만을 생성하는 방식이라면, SiteMesh는 완전한 HTML 페이지를 생성한 뒤 Decorator라는 패턴을 사용하여 데코레이터 HTML 페이지에 레이아웃을 입히는 방식이다.

     

     

    Sitemesh

    Sitemesh프레임워크는 Decorator Tag, Page Tag 2개의 tag 라이브러리를 제공한다. Decorator Tag는 decorator page를 생성할 때 사용되는 tag이고, Page Tag는 decorator 페이지 내에서 다른 decorator를 포함할 때 사용된다.

     

    일단 이번에는 decorator를 공부해보자.

     

    ∘ sitemesh 설정  

    참고 -  https://github.com/sitemesh/sitemesh2?tab=readme-ov-file

    spring maven의 라이브러리를 의존성 설정을 해준다.
    (maven을 사용하기 때문에 pom.xml에 작성해주었지만 Gradle의 경우에는 build.gradle에 작성한다.)
    이때, 그룹 아이디는 opensymphony, 아티팩트 아이디는 sitemesh.

    pom.xml 예시
    ...
    
    <!-- sitemesh -->
    <dependency>
        <groupId>opensymphony</groupId>
        <artifactId>sitemesh</artifactId>
        <version>2.4.2</version>
    </dependency>
    <!-- sitemesh 끝 -->
    
    ...

     



    이제 sitemesh.xml과 decorator.xml을 생성한다.

    sitemesh.xml
    기본적인 sitemesh의 설정 및 사용할 decorators.xml 파일을 호출하는 역할
    <?xml version="1.0" encoding="UTF-8"?>
    <sitemesh>
    	<!--decorator 결정-->
    	<property name="decorators-file" value="/WEB-INF/decorators.xml" /> 
    	<!-- 데코레이터 파일을 불러온다.  -->
    	<excludes file="${decorators-file}" />
    
    	<!--parse 설정. 해당 페이지의 content-type이 뭐라고 쓰여있는지에 따라 데코레이터 결정 -->  
    	<page-parsers>
    		<parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
    		<parser content-type="text/html;charset=UTF-8" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
    	</page-parsers>
        
    	<decorator-mappers>
            <mapper class="kr.co.경로.framework.sitemesh.UriDecoratorMapper"> <!-- 커스텀 데코레이터매퍼 -->
        	</mapper>
    		<mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
    			<param name="decorator" value="printable" />
    			<param name="parameter.name" value="printable" />
    			<param name="parameter.value" value="true" />
    		</mapper>
    		<mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper" >
    			<param name="property" value="meta.decorator" />
    		</mapper>
    		<!-- mapper결정 : 설정파일 사용하여 decorator정하기-->  
    		<mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
    			<param name="config" value="${decorators-file}" />
    		</mapper>
    	</decorator-mappers>
    </sitemesh>

     




    decorators.xml 파일은 스프링(Spring) 프레임워크에서 웹 페이지 레이아웃 처리를 위해 사용되는 XML 파일이다. 

    프로젝트 내에 decorators.xml 파일을 생성하여 사용한다. (일반적으로 WEB-INF 디렉토리 내에 위치.)









    decorators.xml 예시

    <?xml version="1.0" encoding="UTF-8"?>
    
    <decorators defaultdir="/WEB-INF/jsp/decorator">
    	<decorator name="defaultPage" page="default.jsp">
    		<pattern>*/main.do</pattern>
    	</decorator>
    	
    	<excludes>
    		<pattern>/remote_auth.do*</pattern>
    	</excludes>
    	
    	<decorator-mappers>
    		<mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
    		</mapper>
    	</decorator-mappers>
    </decorators>

    excludes element 내에는 sitemesh를 사용하지 않을 url패턴을 넣는다.
    decorator element 내에는 실제 적용 될 jsp 레이아웃과 템플릿을 포함시킨다.


    decorator엘리먼트는 스프링 컨트롤러를 타고 리턴된 페이지(view)가 생성되고
    /WEB-INF/jsp/decorator/default.jsp에 붙여넣게 된다.

     



     web.xml에 사이트메쉬 필터를 정의해준다.

    <jsp-config>
        <taglib>
            <taglib-uri>/tags/sitemesh-decorator</taglib-uri>
            <taglib-location>/WEB-INF/tlds/sitemesh-decorator.tld</taglib-location>
        </taglib>
        <taglib>
            <taglib-uri>/tags/sitemesh-page</taglib-uri>
            <taglib-location>/WEB-INF/tlds/sitemesh-page.tld</taglib-location>
        </taglib>
    </jsp-config>
    
    <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>


    *클라이언트의 요청이 sitemesh filter에 진입하면 decorators.xml에서 해당 요청 패턴을 찾는데
    만약 decorators.xml에 패턴을 정의하지 않으면 요청을 빨리 처리하지 못하고 느려지므로 필터를 타는 요청을 꼭 패턴에 정의하자. - <decorator>, <excludes>


    */main.do 패턴의 view 페이지는 이제 sitemesh에 의해 default.jsp에 들어가게 된다.

    이제 데코레이터 페이지인 default.jsp를 작성해주면 된다.

    <%@ taglib uri="/tags/sitemesh-decorator" prefix="decorator"%>

     

    <decorator:head />
    view페이지의 head태그 구문을 가져온다.
    <decorator:body />
    view페이지의 body태그 안의 구문을 가져온다.
    <decorator:title default=" " /> view페이지의 title태그 구문을 가져온다.(title을 찾을 수 없다면 value값을 default로 지정할 수 있다.
    <decorator:getProperty property=" " default=" " writeEntireProperty=" " /> 원래 페이지의 속성을 가져온다. 
    property: 추가할 속성의 이름.
    default: 속성을 발견하지 못했을 때 default로 지정될 값.
    writeEntireProperty: 1, yes, true, t, y로 지정했을 때, 이름을 포함한 속성값이 그대로 쓰여진다.
    <decorator:usePage id=" " />
    decorator 페이지에서 사용할 page object id를 지정한다.

     

     

    DecoratorMapper에는 다양한 종류가 있고 그 외에도 커스텀하여 사용할 수 있는데,

    예를 들어 UriDecoratorMapper라는 DecoratorMapper를 만들어 사용하고자 한다면

    UriDecoratorMapper.java파일을 sitemesh파일 내에 만들고 아래 예시 코드처럼 다른 Mapper를 extend 해서 사용하거나 하면 된다.

    ...
    import java.util.Properties;
    
    ...
    import com.opensymphony.module.sitemesh.Config;
    import com.opensymphony.module.sitemesh.Decorator;
    import com.opensymphony.module.sitemesh.DecoratorMapper;
    import com.opensymphony.module.sitemesh.Page;
    import com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper;
    import com.opensymphony.module.sitemesh.mapper.ConfigLoader;
    
    public class UriDecoratorMapper extends ConfigDecoratorMapper {
    	private static final Logger LOGGER = LoggerFactory.getLogger(UriDecoratorMapper.class);
    	
    	...

     

     

     

    참고 [spring에서 sitemesh설정]

    참고 [sitemesh 매뉴얼 번역본]