본문 바로가기
Spring/Thymeleaf

Thymeleaf 페이지 레이아웃

by YoonJong 2022. 9. 14.
728x90

보통 웹사이트를 만드려면 header , footer, menu 등 공통적인 페이지 구성 요소들이 있다.

이런 공통 요소들을 모든 html 에 넣는다면 수정 시 전부다 찾아서 바꿔줘야 한다.

이러한 문제점을 해결하기 위해 페이지 레이아웃을 이용하여 공통 요소 관리를 쉽게 할 수 있다.


의존성 추가하기 - gradle

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'

 

예제를 위한 파일 생성

 

footer.html 와 header.html 에 th:fragment 를 이용하여 선언해준다.

 

footer.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

    <div th:fragment="footer">
        footer 영역입니다.
    </div>

</html>

 

header.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

<div th:fragment="header">
    header 영역입니다.
</div>

</html>

 

layout1.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
                xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    
    <th:block layout:fragment="script"></th:block>
    <th:block layout:fragment="css"></th:block>
</head>
<body>
<!--  fragments 폴더 아래의 header.html 파일의 th:fragment=header 영역을 가지고 온다 -->
    <div th:replace="fragments/header::header"></div>
<!--  layout 에서 변경되는 영역을 fragment 로 설정 -->
    <div layout:fragment="content">
        
    </div>
<!--  fragments 폴더 아래의 footer.html 파일의 th:fragment=footer 영역을 가지고 온다 -->
    <div th:replace="fragments/footer::footer"></div>


</body>
</html>

 

thymeleafEx07.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
                xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
                layout:decorate="~{layouts/layout1}">
<!-- layouts 폴더 아래에 있는 layout1.html 을 적용하기 위해서 네임스페이스 추가 -->

<!-- layout1.html 파일의 layout:fragment="content" 영역에 들어간다. -->
    <div layout:fragment="content">
        본문 영역입니다!
    </div>

</html>

 

출력 시

728x90

'Spring > Thymeleaf' 카테고리의 다른 글

th:href 예제  (0) 2022.09.13
th:switch & th:case 예제  (0) 2022.09.13
th:if & th:unless 예제  (0) 2022.09.13
th:each 예제  (0) 2022.09.13
th:text 예제  (0) 2022.09.13

댓글