Spring/실습 정리

Spring Boot 15강 - Thymeleaf 레이아웃과 Bootstrap으로 게시판 화면 꾸미기

코딩하는냥이 2025. 7. 3. 15:39
반응형

실제 서비스에서는 여러 화면에 공통 레이아웃(상단, 하단, CSS 등)을
템플릿으로 분리하여 코드 중복을 줄이고, 디자인 일관성을 유지합니다.
Thymeleaf의 레이아웃 기능과 Bootstrap CSS를 활용하면
적은 코드로도 전문적인 게시판 화면을 만들 수 있습니다.


📌 예제 코드

(1) 기본 레이아웃 템플릿 - layout.html

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport"
    content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" type="text/css" th:href="@{/bootstrap.min.css}">
<!-- sbb CSS -->
<link rel="stylesheet" type="text/css" th:href="@{/style.css}">

<title>게시판</title>
</head>
<body>
    <!-- 기본 템플릿 안에 삽입될 내용 시작 -->
    <th:block layout:fragment="content"></th:block>
    <!-- 기본 템플릿 안에 삽입될 내용 종료 -->
</body>
</html>

(2) 게시판 리스트 페이지 - question_list.html

<html layout:decorate="~{layout}">
<center layout:fragment="content">
    <h1>자유게시판</h1>
    <div class="container my-5">
        <table class="table">
            <thead class="table-dark">
                <tr>
                    <th align="center">번호</th>
                    <th align="center">제목</th>
                    <th align="center">작성일자</th>
                </tr>
            </thead>
            <tbody>
                <tr th:each="question, loop : ${questionList}">
                    <td th:text="${loop.count}" align="center"></td>
                    <td>
                        <a th:href="@{|/question/detail/${question.id}|}" th:text="${question.subject}"></a>
                    </td>
                    <td th:text="${#temporals.format(question.createDate, 'yyyy-MM-dd')}" align="center"></td>
                </tr>
            </tbody>
        </table>
        <div class="d-flex justify-content-end">
            <a class="btn btn-primary" th:href="@{/question/create}">글작성</a>
        </div>
    </div>
</center>

💬 코드 설명

  • layout.html
    : 전체 사이트에 적용할 공통 구조(머리글, CSS, 바디 등)를 정의합니다.
    <th:block layout:fragment="content"></th:block>는
    각 페이지별로 실제 내용이 삽입될 영역입니다.
  • question_list.html
    • layout:decorate="~{layout}"
      : 위에서 정의한 레이아웃 템플릿을 상속받습니다.
    • <center layout:fragment="content">
      : 본문 내용이 layout.html의 fragment 영역에 삽입됩니다.
    • Bootstrap 테이블버튼
      : 부트스트랩 클래스를 활용해 테이블을 예쁘게 꾸미고,
      글작성 버튼도 스타일이 적용됩니다.
    • th:each="question, loop : ${questionList}"
      : questionList를 반복 출력하며, loop.count로 번호를 표시합니다.
    • #temporals.format(question.createDate, 'yyyy-MM-dd')
      : 작성일을 '년-월-일' 형식으로 출력합니다.

💡포인트 정리

  • Thymeleaf 레이아웃(템플릿 상속)으로
    공통 구조와 디자인을 손쉽게 유지할 수 있다.
  • Bootstrap을 적용해
    별도 CSS 없이도 반응형, 세련된 화면을 만들 수 있다.
  • fragment와 decorate를 조합하면
    각 화면마다 필요한 내용만 추가하면 된다.

📌정리하자면, 공통 레이아웃 분리, 부트스트랩 적용, 리스트 반복 출력까지
실제 서비스에서 자주 쓰이는 화면 구조를
Thymeleaf와 Bootstrap을 이용해 구현했습니다.
이렇게 작업하면,
전체 사이트 디자인과 코드를 일관성 있게 유지할 수 있습니다.