(10) 공통 템플릿

오류 메시지 공통으로 적용하기


시작하기 전에

개요 : 질문과 답변을 할 수 있는 게시판 서비스를 스프링부트를 통해 만들어 본다.

학습사이트 : https://wikidocs.net/book/7601

예제 코드 : https://github.com/pahkey/sbb


공통 템플릿

이전에 만들었던 오류들은 앞으로 만들 페이지에도 해당되는 사항들이다.

따라서 반복적으로 사용하는 기능들은 공통 템플릿으로 만들어 놓고 필요할 때마다 사용하는 것이 편한다.


공통 템플릿 작성하기

  • 오류 메시지를 표시하는 공통 템플릿 작성
  • form_errors.html
<!-- 경로 : /sbb/src/main/resources/templates/form_errors.html -->

<div th:fragment="formErrorsFragment" class="alert alert-danger" 
    role="alert" th:if="${#fields.hasAnyErrors()}">
    <div th:each="err : ${#fields.allErrors()}" th:text="${err}" />
</div>

출력할 오류 메시지 부분에 th:fragment="formErrorsFragment" 속성 추가


질문 등록 템플릿에 적용하기

  • question_form.html 수정
<!-- 경로 : sbb/src/main/resources/templates/question_form.html -->
<html layout:decorate="~{layout}">
<div layout:fragment="content" class="container">
    <h5 class="my-3 border-bottom pb-2">질문등록</h5>
    <form th:action="@{/question/create}" th:object="${questionForm}" method="post">
        <!-- 추가부분 -->
        <div th:replace="form_errors :: formErrorsFragment"></div>
        <div class="mb-3">
            <label for="subject" class="form-label">제목</label>
            <input type="text" th:field="*{subject}" id="subject" class="form-control">
        </div>
        <div class="mb-3">
            <label for="content" class="form-label">내용</label>
            <textarea th:field="*{content}" id="content" class="form-control" rows="10"></textarea>
        </div>
        <input type="submit" value="저장하기" class="btn btn-primary my-2">
    </form>
</div>
</html

타임리프의 th:replace속성을 사용하면 공통 템플릿을 템플릿 내에 삽입할수 있다. 

<div th:replace="form_errors :: formErrorsFragment"></div>의 의미는

div 엘리먼트를 form_errors.html 파일의 th:fragment속성명이formErrorsFragment인 엘리먼트로 교체하라는 의미이다.


질문 상세 템플릿에 적용하기

  • question_detail.html 수정
<!-- 경로 : sbb/src/main/resources/templates/question_detail.html -->
<html layout:decorate="~{layout}">
<div layout:fragment="content" class="container my-3">

    (... 생략 ...)

        <!-- 답변 등록 from태그 : post방식 -->
        <form th:action="@{|/answer/create/${question.id}|}" th:object="${answerForm}" method="post" class="my-3">
        <!-- 추가부분 -->
        <div th:replace="form_errors :: formErrorsFragment"></div>
        <textarea th:field="*{content}" rows="10" class="form-control"></textarea>
        <input type="submit" value="답변등록" class="btn btn-primary my-2">
    </form>
</div>
</html>






Leave a comment