[Spring] Tiles로 페이지 조각하기
Tiles란?
- 반복적으로 사용되는 header, footer와 같은 정보를 한 곳에 모아둔 프레임워크를 말한다.
- 화면의 기본 레이아웃 템플릿을 정의하고 상속을 통하여 대부분 구조를 재사용할 수 있는 기능 및 설정파일을 통한 통합 관리를 통해서 확장성 있고 일관되게 페이지 구성을 관리한다.
Tiles 사용하기
1. gradle에 의존성 추가
2. View Resolver 등록
tilesViewResolver메서드는 TilesUrlBasedViewResolver 빈을 정의하여 아파치 타일즈를 사용하여 뷰를 설정하고 해석하는 역할을 한다. 이 빈은 Tiles 정의를 기반으로 뷰를 해석하여 적절한 JSP나 템플릿 파일을 렌더링한다.
tilesUrlBasedViewResolver.setOrder(1);
뷰 리졸버의 순서를 결정한다. 스프링 MVC는 여러 뷰 리졸버를 가질 수 있으며, 이 순서는 각 리졸버의 우선순위를 결정한다. 숫자가 낮을수록 높은 우선순위를 가지기 때문에 '1'로 설정하여 높은 우선순위를 부여한다.
tilesUrlBasedViewResolver.setViewClass(DynamicTilesView.class);
사용될 뷰 클래스('DynamicTilesView)를 설정한다.
이 설정을 통해 DynamicTilesView가 뷰로 사용된다. 이는 Tiles 뷰를 확장한 사용자 정의 클래스이다.
tilesUrlBasedViewResolver.setPrefix("/WEB-INF/views/");
뷰 파일 경로의 접두사를 설정한다. 이 경로를 기준으로 해석되고 예를 들어, 뷰 이름이 'home' 이라면 실제 뷰 파일 경로는 '/WEB-INF/views/home.jsp'가 된다.
tilesUrlBasedViewResolver.setTilesDefinitionName("none");
기본 Tiles 정의 이름을 설정한다. "none"으로 설정되어 있어, 명시적으로 지정된 정의가 없을 경우에는 기본적으로 none정의를 사용한다.
tilesUrlBasedViewResolver.setTilesBodyAttributeName("body");
타일의 body 속성 이름을 설정한다. Tiles는 여러 속성으로 구성되는데, 'body'속성은 주로 컨텐츠 영역을 정의하는 데 사용한다.
tilesUrlBasedViewResolver.setTilesDefinitionDelimiter(".");
타일 정의 이름의 구분자를 설정한다. 정의 이름을 구성할 때, 이 구분자를 사용하여 여러 부분을 결합한다.
이 코드에는 DynamicTilesView와 TilesUrlBasedViewResolver와 같이 사용자 정의 클래스가 포함되어 있다. 이는 타일즈를 더 유연하게 사용하고, 동적으로 구성하며, 특정 요구사항에 따라 타일을 커스터마이징하기 위함이다. 각각의 클래스의 코드를 전부 이해하기는 어렵지만.. 이를 통해 웹 애플리케이션의 유연성, 유지보수성, 확장성을 높일 수 있다고 한다.
일반적으로 뷰리졸버를 등록하는 코드는 다음과 같다.
import org.apache.tiles.extras.complete.CompleteAutoloadTilesInitializer;
import org.apache.tiles.factory.BasicTilesContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesView;
import org.springframework.web.servlet.view.tiles3.TilesViewResolver;
@Configuration
public class TilesConfiguration {
@Bean
public TilesConfigurer tilesConfigurer() {
TilesConfigurer tilesConfigurer = new TilesConfigurer();
tilesConfigurer.setDefinitions("/WEB-INF/tiles/tiles.xml"); // Tiles 설정 파일 경로
tilesConfigurer.setCheckRefresh(true); // 설정 파일 변경 시 자동으로 반영
return tilesConfigurer;
}
@Bean
public TilesViewResolver tilesViewResolver() {
TilesViewResolver viewResolver = new TilesViewResolver();
viewResolver.setViewClass(TilesView.class); // 기본 뷰 클래스를 설정
viewResolver.setOrder(1); // 우선순위를 설정, 숫자가 낮을수록 높은 우선순위
return viewResolver;
}
}
3. Tiles 정의 파일 작성
TilesConfigurer에서 참조한 Tiles정의 파일을 작성해야 한다. 이 파일은 페이지의 템플릿과 레이아웃을 정의한다.
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<definition name="base.template" template="/WEB-INF/views/layouts/defaultLayout.jsp">
<put-attribute name="header" value="/WEB-INF/views/common/header.jsp" />
<put-attribute name="footer" value="/WEB-INF/views/common/footer.jsp" />
<put-attribute name="menu" value="/WEB-INF/views/common/menu.jsp" />
<put-attribute name="body" value="" />
</definition>
<definition name="home" extends="base.template">
<put-attribute name="body" value="/WEB-INF/views/home.jsp" />
</definition>
<definition name="about" extends="base.template">
<put-attribute name="body" value="/WEB-INF/views/about.jsp" />
</definition>
</tiles-definitions>
4. JSP 파일 작성
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<html>
<head>
<title>My Application</title>
</head>
<body>
<header>
<tiles:insertAttribute name="header" />
</header>
<nav>
<tiles:insertAttribute name="menu" />
</nav>
<main>
<tiles:insertAttribute name="body" />
</main>
<footer>
<tiles:insertAttribute name="footer" />
</footer>
</body>
</html>
5. Controller에서 호출
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/")
public class HomeController {
@GetMapping
public String home() {
return "home"; // Tiles definition name
}
@GetMapping("/about")
public String about() {
return "about"; // Tiles definition name
}
}