Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Thymeleaf 기본 문법 정리

Table of contents

  1. 1. 텍스트 출력
  2. 2. 객체 및 컬렉션 멤버 출력하기
  3. 3. 세션 데이터 출력 (model에서 전달하는 것이 아님)
  4. 4. 날짜 출력
  5. 5. URL
  6. 6. 조건식
  7. 7. 체크 처리
  8. 8. 반복
  9. 9. 블록 태그
  10. 10. 자바 스크립트 인라인
  11. 11. 템플릿 조각
  12. 12. 템플릿 조각
  13. 13. ENUM 타입 사용


1. 텍스트 출력


  • model로 넘긴 데이터 출력
<p th:text="${data}"></p>


  • 문자열에 html 태그가 포함되어있는 경우
<p th:utext="${data}"></p


image-20230125011442336

그냥 th : text 를 사용하면 태그가 위의 경우처럼, 그냥 출력된다.

하지만 th : utext 를 사용하면, 태그가 적용된 상태로 출력된다.


2. 객체 및 컬렉션 멤버 출력하기


<!--User라는 객체에 username, age 필드가 있는 경우-->

<p th:text="${user.username}"></p>
<p th:text="${user.age}"></p>

<!--List<User> 가 전달되었을 때-->

<p th:text="${userList[0].username}"></p>
<p th:text="${userList[0].age}"></p>

<!--Map<String,User> 가 전달되었을 때-->

<p th:text="${userMap['userA'].username}"></p>
<p th:text="${userMap['userA'].age}"></p>

<!--  지역 변수로 선언-->

<div th:with="person=${user}">
    <p th:text="${person.username}"></p>
</div>

<p th:text="${person.username}"></p> -> 지역변수를 선언한 태그 밖에서 사용하면 에러 발생


3. 세션 데이터 출력 (model에서 전달하는 것이 아님)


<!-- session.setAttribute("sessionData", "세션 데이터"); -->
<!-- 세션 데이터, 접근 -->
<p th:text="${session.sessionData}"></p>


4. 날짜 출력


<!-- model.addAttribute("localDateTime", LocalDateTime.now()); 로 넘어왔을 때-->

<ul>
    <li>default = <span th:text="${localDateTime}"></span></li>
<!--    default = 2023-01-25T23:59:43.527748100-->
    
    <li>yyyy-MM-dd HH:mm:ss = <span th:text="${#temporals.format(localDateTime,'yyyy-MM-dd HH:mm:ss')}"></span></li>
<!--    yyyy-MM-dd HH:mm:ss = 2023-01-25 23:59:43-->
    
    <li>${#temporals.day(localDateTime)} = <span th:text="${#temporals.day(localDateTime)}"></span></li>
<!--    ${#temporals.day(localDateTime)} = 25  (몇 일인지)-->
    
    <li>${#temporals.month(localDateTime)} = <span th:text="${#temporals.month(localDateTime)}"></span></li>
<!--    ${#temporals.month(localDateTime)} = 1  (몇 월인지)-->
    
    <li>${#temporals.monthName(localDateTime)} = <span th:text="${#temporals.monthName(localDateTime)}"></span></li>
<!--    ${#temporals.monthName(localDateTime)} = 1월 (몇 월인지 월까지)-->
    
    <li>${#temporals.year(localDateTime)} = <span th:text="${#temporals.year(localDateTime)}"></span></li>
<!--    ${#temporals.year(localDateTime)} = 2023 (년도)-->
    
    <li>${#temporals.dayOfWeek(localDateTime)} = <span th:text="${#temporals.dayOfWeek(localDateTime)}"></span></li>
<!--    ${#temporals.dayOfWeek(localDateTime)} = 3 (몇째주인지)-->
    
    <li>${#temporals.dayOfWeekName(localDateTime)} = <span th:text="${#temporals.dayOfWeekName(localDateTime)}"></span></li>
<!--    ${#temporals.dayOfWeekName(localDateTime)} = 수요일 (무슨요일인지 요일까지)-->
    
    <li>${#temporals.dayOfWeekNameShort(localDateTime)} = <span th:text="${#temporals.dayOfWeekNameShort(localDateTime)}"></span></li>
<!--    ${#temporals.dayOfWeekNameShort(localDateTime)} = 수 (무슨요일인지)-->
    
    <li>${#temporals.hour(localDateTime)} = <span th:text="${#temporals.hour(localDateTime)}"></span></li>
<!--    ${#temporals.hour(localDateTime)} = 23 (시간 24 단위로)-->
    
    <li>${#temporals.minute(localDateTime)} = <span th:text="${#temporals.minute(localDateTime)}"></span></li>
<!--    ${#temporals.minute(localDateTime)} = 59 (몇분인지) -->
    
    <li>${#temporals.second(localDateTime)} = <span th:text="${#temporals.second(localDateTime)}"></span></li>
<!--    ${#temporals.second(localDateTime)} = 43 (몇초인지)-->
    
    
</ul>


5. URL


<!-- 쿼리 파라미터 url-->
<!-- 
model.addAttribute("param1", "data1");
model.addAttribute("param2", "data2");
-->

<a th:href="@{/(param1=${param1},param2=${param2})}">안녕</a>

<!-- 위 링크 클릭 시 /?param1=data1&param2=data2 경로로 이동 -->

<a th:href="@{/{param1}(param1=${param1},param2=${param2})}">안녕</a>

<!-- 위 링크 클릭 시 /data1?param2=data2 경로로 이동 -->


6. 조건식


<a th:text="(10%2==0)?'짝수':'홀수'"></a>
<!-- 자바의 3항 조건식과 유사하다. -->

<a th:text="${nullData}?:'데이터가 없습니다.'"></a>
<!-- model로 넘겨진 데이터가 null이 아니면, 해당 데이터가 출력되고, null 이면 '데이터가 없습니다.' 가 출력 -->

<a th:text="${nullData}?:_">타임리프 태그 무효화</a>
<!-- 언더 스코어가 있으면, no-operation 되어, 타임리프 태그가 무효화 된다. -->

<div th:each="user : ${userList}">
    <span th:text="|'미성년자' ${user.username}|" th:if="${user.age <= 20}"></span>
</div>
<!-- if문을 만족해야만 태그가 유효해진다. -->


<div th:each="user : ${userList}">
    <td th:switch="${user.age}">
        <span th:case="10">10살</span>
        <span th:case="20">20살</span>
        <span th:case="*">기타</span>
    </td>
</div>
<!-- switch 문법과 유사하다. -->


7. 체크 처리


<!-- 체크 처리-->

- checked o <input type="checkbox" name="active" th:checked="true" /><br/>
- checked x <input type="checkbox" name="active" th:checked="false" /><br/>
- checked=false <input type="checkbox" name="active" checked="false" /><br/>

<!-- 타임리프 구문이 없으면, false로 표시해도 디폴트가 항상 체크되어 있다.-->


8. 반복


<!-- 컬렉션 형태로 userList가 넘어왔을 때-->
<div th:each="user : ${userList}">
    <p th:text="${user.age}"></p>
    <p th:text="${user.username }"></p>
</div>


9. 블록 태그


<!-- 여러개의 태그를 제어하고 싶을 때 타임리프의 블록테그를 사용한다.-->
<th:block th:if="${session.MENU_LIST !=null}">
    <div th:each="testList : {session.test}">
        <div th:text="${testList.name}"></div>
    </div>
</th:block>


10. 자바 스크립트 인라인


<!-- 스크립트에 변수로 할당할때는, [[${변수}]] 와 같은 형식으로 입력한다. -->
<script th:inline="javascript">
 var username = [[${user.username}]];
 var age = [[${user.age}]];
    
<!--자바스크립트 내추럴 템플릿 (주석 처리  것이 렌더링 된다.) -->
 var username2 = /*[[${user.username}]]*/ "test username";
    
<!--객체 (json 형태로 변경된다.) -->
 var user = [[${user}]];
    
</script>


11. 템플릿 조각


<!-- copy 라는 이름dml fragment가 /templates/fragment/footer 위치에 있을 때-->
<footer th:fragment="copy">
 푸터
</footer>


<!-- insert의 경우, 해당 문법이 있는 태그에 감싸진다.-->
<div th:insert="~{template/fragment/footer :: copy}"></div>

<!-- replace의 경우, 해당 문법이 있는 태그에 덮어씌워진다..-->
<div th:replace="~{template/fragment/footer :: copy}"></div>
<div th:replace="template/fragment/footer :: copy"></div>


12. 템플릿 조각


<div th:each="region : ${regions}" class="form-check form-check-inline">
    <input type="checkbox" th:field="*{regions}" th:value="${region.key}"
           class="form-check-input">
    <label th:for="${#ids.prev('regions')}"
           th:text="${region.value}" class="form-check-label">서울</label>
</div>

루프로 타임리프 변수가 생성되는 경우, th:field를 사용하면 , 해당 블록의 id를 순차적으로 1부터 붙여서 명명해준다.

th:field 로 명시하면, model 로 넘긴 객체의 변수명으로 id와 name을 생성해준다.


<input type="checkbox" value="SEOUL" class="form-check-input" id="regions1"
name="regions">
<input type="checkbox" value="BUSAN" class="form-check-input" id="regions2"
name="regions">
<input type="checkbox" value="JEJU" class="form-check-input" id="regions3"
name="regions">

위와 같은 결과가 나오고,

따라서, label과 같은 태그에 ${#ids.prev('regions')} 를 붙여주면 동적으로 변하는 id 값을 반영한다.


13. ENUM 타입 사용


<div th:each="type : ${T(hello.itemservice.domain.item.ItemType).values()}">

스프링 EL 문법으로 Enum 타입의 위치를 명시해서 사용한다.