[Spring Boot/Thymeleaf] Thymeleaf layout 설정
본문 바로가기

Web 개발/게시판 만들기

[Spring Boot/Thymeleaf] Thymeleaf layout 설정

728x90
반응형

Thymeleaf layout

머리글, 바닥글, 메뉴 등의 공통 페이지 구성요소를 공유하여, 페이지의 컨텐츠에 집중할 수 있습니다.

 


 

개발 환경

Spring Boot : 2.5.2
Java 11
Thymeleaf
Gradle

 

 

 

1. Dependency 추가

 

Gradle의 경우

dependencies {
    implementation group: 'com.github.zhanhb', name: 'thymeleaf-layout-dialect', version: '2.4.1'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

 

Maven의 경우

<dependency>
    <groupId>com.github.zhanhb</groupId>
    <artifactId>thymeleaf-layout-dialect</artifactId>
    <version>2.4.1</version>    
</dependency>

 

필독!!
Java 11 이상 사용시에는 groovy 관련 된 것을 제거한
implementation group: 'com.github.zhanhb', name: 'thymeleaf-layout-dialect', version: '2.4.1'
을 사용한다. (3.0.0은 X)

JDK 1.8 이하를 사용하는 경우
implementation group: 'nz.net.ultraq.thymeleaf', name: 'thymeleaf-layout-dialect', version: '2.4.1'
을 사용한다.

 

 

 

2. 레이아웃 구성

상단(Header), 하단(Footer)은 모든 페이지에서 공통으로 사용하며, 본문(Contents)은 각 페이지 마다 변경한다.

 

 

 

3. 파일 생성

다음과 같이 templates 패키지 내에 fragments 패키지와 html 파일을 생성한다.

config, header, footer는 레이아웃에서 공통으로 사용할 구성요소이며

layout은 위 프레그먼트들을 어떻게 조합할지 나타낸 레이아웃이다.

 

 

 

4. config.html

공통으로 사용할 css, js 선언

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<th:block th:fragment="configFragment">
    <head>
        <!-- Bootstrap CSS -->
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous"/>

        <!-- Option 1: jQuery and Bootstrap Bundle (includes Popper) -->
        <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-Fy6S3B9q64WdZWQUiU+q4/2Lc9npb8tCaSX9FK7E8HnRr0Jz8D6OP9dO5Vg3Q9ct" crossorigin="anonymous"></script>

        <link rel="stylesheet" th:href="@{/css/boardstyle.css}"/>

    </head>
</th:block>
</html>

 

 

 

5. header.html

페이지 상단

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
    <header th:fragment="headerFragment">
        <div>
            <h2>Header</h2>
        </div>
    </header>
</html>

 

 

 

5. footer.html

페이지 하단

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
    <footer th:fragment="footerFragment">
        <div>
            <h2>Footer</h2>
        </div>
    </footer>
</html>

 

 

 

6. layout.html

fragments들의 조합

<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
    <th:block th:replace="board2/fragments/config :: configFragment"> </th:block>
</head>
<body>
    <!-- top -->
    <header th:replace="board2/fragments/header :: headerFragment"></header>

    <!-- content -->
    <div layout:fragment="content"></div>

    <!-- footer -->
    <footer th:replace="board2/fragments/footer :: footerFragment"></footer>
</body>
</html>

 

 

 

7. new.html

페이지마다 변경되는 콘텐츠

<!DOCTYPE html>
<html lang="en"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{board2/fragments/layout}">
<div layout:fragment="content">
    <div id="box">
        hello world !!
    </div>
</div>
</html>

 

 

 

8. Controller.java

Controller를 통해 페이지 보여주기

@Controller
public class Board2Controller {

    @GetMapping("/")
    public String index() {
        return "board2/new";
    }
    
}

 

 

 

참고사이트:

https://dev-jwblog.tistory.com/34

https://www.hanumoka.net/2020/05/21/springBoot-20200521-springboot-thymeleaf-layout-dialect/

 

728x90
반응형