[타임리프] 템플릿 조각

템플릿 조각

개요

웹 페이지 개발시, 공통 영역 다수 존재한다. (예를 들어, footer나 카테고리 와 같은 영역) 타임리프에서는 보다 편리하게 공통 영역을 처리하는 기능을 제공한다. 예시 코드를 통해 알아보자.



예시 코드

컨트롤러

이전에 작성한 게시글에서 사용한 BasicController 클래스가 아닌 새로운 클래스이다.

@Controller
@RequestMapping("/template")
public class TemplateController {

	@GetMapping("/fragment")
	public String template() {
		return "template/fragment/fragmentMain";
	}

}


템플릿 조각으로 사용될 HTML

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

	<footer th:fragment="copy">
		푸터 자리 입니다.
	</footer>

	<footer th:fragment="copyParam (param1, param2)">
		<p>파라미터 자리 입니다.</p>
		<p th:text="${param1}"></p>
		<p th:text="${param2}"></p>
	</footer>

</body>
</html>


메인 HTML

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

	<h1>부분 포함</h1>
	<h2>부분 포함 insert</h2>
	<div th:insert="~{template/fragment/footer :: copy}"></div>

	<h2>부분 포함 replace</h2>
	<div th:replace="~{template/fragment/footer :: copy}"></div>

	<h2>부분 포함 단순 표현식</h2>
	<div th:replace="template/fragment/footer :: copy"></div>

<!------------------------------------------------->

	<h1>파라미터 사용</h1>
	<div th:replace="~{template/fragment/footer :: copyParam ('데이터1', '데이터 2')}"></div>

</body>
</html>

상당히 복잡해보이지만, 한번 이해하고 나면 그리 어렵지 않다. 하나씩 살펴보자.



상세 설명

템플릿 조각으로 사용될 HTML

  • <footer th:fragment="copy"> ... </footer>
    • th:fragment="템플릿_조각_이름" 을 통해, 해당 태그와 하위 태그들이 모두 템플릿 조각으로 사용될 것 임을 나타낸다. 설정한 템플릿 조각 이름을 통해, 다른 HTML에서 해당 조각을 사용할 수 있다.


  • <footer th:fragment="copyParam (param1, param2)"> ... </footer>
    • th:fragment="copyParam (param1, param2)" 을 사용하여, 템플릿 조각으로 설정함과 동시에 ‘해당 조각을 사용할 메인HTML’으로부터 변수값을 전달받을 수 있다.
    • 매개변수는 (param1, param2) 과 같다. 즉, 2개의 매개변수가 존재한다.

계속해서 상세히 알아보자.


메인 HTML

  • <div th:insert="~{template/fragment/footer :: copy}"></div>
    • th:insert="~{template/fragment/footer :: copy}" 를 통해, ‘템플릿 조각이 존재하는 HTML의 경로’와 ‘전달받은 템플릿 조각의 이름’을 설정한다.
    • 즉, th:insert="~{전달받을_템플릿_경로 :: 템플릿_이름}" 형식으로 이해하면 된다.

      참고로, 상대 경로로 설정시 시작 디렉터리는 src\main\resources\templates 이다.

    • th:insert본인 태그 내부에 템플릿을 넣을 것임 을 의미한다.
    • 따라서, 메인HTML의 해당부분에 대한 결과는 다음과 같다.

        <div>
        	<footer>
        		푸터 자리 입니다.
        	</footer>
        </div>
      


  • <div th:replace="~{template/fragment/footer :: copy}"></div>
    • th:replace="~{template/fragment/footer :: copy}" 를 통해, ‘템플릿 조각이 존재하는 HTML의 경로’와 ‘전달받은 템플릿 조각의 이름’을 설정한다.
    • th:insert 와 유사해 보이지만, th:replace 는 본인 태그 자체와 템플릿을 교체하는 것이다.
    • 따라서, 메인HTML의 해당부분에 대한 결과는 다음과 같다.

        <footer>
        푸터 자리 입니다.
        </footer>
      


  • <div th:replace="template/fragment/footer :: copy"></div>
    • ~{...} 표현식을 사용하지 않고 단순하게 경로를 표현할 수도 있다.
    • 하지만, 복잡한 경로일 때는 ~{...} 을 사용하는 것이 좋다.


  • <div th:replace="~{template/fragment/footer :: copyParam ('데이터1', '데이터 2')}"></div>
    • ('데이터1', '데이터 2') 에 주목해보자. 해당 소괄호 안에는 템플릿 조각에 전달할 데이터 를 넣는다.
    • 이 데이터를 전달받은 템플릿 조각의 상태는 아래와 같다.

        <!-- 기존 템플릿 -->
        <footer th:fragment="copyParam (param1, param2)">
        	<p>파라미터 자리 입니다.</p>
        	<p th:text="${param1}"></p>
        	<p th:text="${param2}"></p>
        </footer>
        <!-------------------------------------------->
      
        <!-- 매개변수로 데이터를 전달받은 템플릿 ------->
        <footer th:fragment="copyParam (param1, param2)">
        	<p>파라미터 자리 입니다.</p>
        	<p th:text="'데이터1'"></p>
        	<p th:text="데이터 2"></p>
        </footer>
        <!--------------------------------------------->
      
    • th:replace 을 통해, 위와 같이 데이터를 넘겨받은 템플릿 조각이 메인HTML의 태그와 교체된다.
    • 따라서, 메인HTML의 해당부분에 대한 결과는 다음과 같다.

        <footer>
        	<p>파라미터 자리 입니다.</p>
        	<p>데이터1</p>
        	<p>데이터2</p>
        </footer>
      




  • 본 게시글은 김영한님의 강의를 토대로 정리한 글입니다.
  • 더 자세한 내용을 알고 싶으신 분들이 계신다면, 해당 강의를 수강하시는 것을 추천드립니다.