Search

Thymeleaf

Thymeleaf (νƒ€μž„λ¦¬ν”„)

νƒ€μž„λ¦¬ν”„λŠ” μ„œλ²„ μ‚¬μ΄λ“œ Java ν…œν”Œλ¦Ώ μ—”μ§„μž…λ‹ˆλ‹€. HTML, XML, JavaScript, CSS λ“±μ˜ λ§ˆν¬μ—… μ–Έμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ 동적 μ›Ή νŽ˜μ΄μ§€λ₯Ό μƒμ„±ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. νƒ€μž„λ¦¬ν”„λŠ” κ°„λ‹¨ν•˜κ³  직관적인 ꡬ문을 μ œκ³΅ν•˜λ©°, Spring Frameworkμ™€μ˜ 톡합이 μš©μ΄ν•©λ‹ˆλ‹€.
Spring Framework μ—μ„œμ˜ ν…œν”Œλ¦Ώ μ—”μ§„μœΌλ‘œ μ‚¬μš©ν•˜λ˜ JSP 및 JSP 라이브러리 κΈ°λŠ₯듀을 λͺ¨λ‘ λŒ€μ²΄ν•  수 μžˆλŠ” ν…œν”Œλ¦Ώ 엔진이닀.

ν…œν”Œλ¦Ώ μ—”μ§„μ΄λž€?

ν…œν”Œλ¦Ώ 엔진은 동적 μ›Ή νŽ˜μ΄μ§€λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” λ„κ΅¬μž…λ‹ˆλ‹€. ν…œν”Œλ¦Ώ 엔진은 미리 μ •μ˜λœ ν…œν”Œλ¦Ώκ³Ό 데이터λ₯Ό κ²°ν•©ν•˜μ—¬ μ΅œμ’…μ μœΌλ‘œ μ›Ή νŽ˜μ΄μ§€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 κ°œλ°œμžλŠ” λ™μΌν•œ ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•˜μ—¬ λ‹€μ–‘ν•œ 데이터λ₯Ό λ™μ μœΌλ‘œ 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν…œν”Œλ¦Ώ 엔진은 주둜 μ„œλ²„ μ‚¬μ΄λ“œμ—μ„œ μ‹€ν–‰λ˜λ©°, ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ™„μ„±λœ HTML을 μ œκ³΅ν•©λ‹ˆλ‹€.

νƒ€μž„λ¦¬ν”„ μ£Όμš” κΈ°λŠ₯

β€’
데이터 바인딩: νƒ€μž„λ¦¬ν”„λŠ” μ„œλ²„ μ‚¬μ΄λ“œμ—μ„œ 데이터λ₯Ό ν…œν”Œλ¦Ώμ— λ°”μΈλ”©ν•˜μ—¬ λ™μ μœΌλ‘œ μ›Ή νŽ˜μ΄μ§€λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.
β€’
쑰건문과 반볡문: νƒ€μž„λ¦¬ν”„λŠ” ifλ¬Έκ³Ό λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜μ—¬ ν…œν”Œλ¦Ώμ—μ„œ λ³΅μž‘ν•œ λ‘œμ§μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
β€’
κ΅­μ œν™” 지원: νƒ€μž„λ¦¬ν”„λŠ” λ‹€κ΅­μ–΄ 지원을 μœ„ν•œ κ΅­μ œν™” κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬ λ‹€μ–‘ν•œ μ–Έμ–΄λ‘œ μ›Ή νŽ˜μ΄μ§€λ₯Ό ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

νƒ€μž„λ¦¬ν”„ 문법

β€’
νƒ€μž„λ¦¬ν”„ 블둝
β—¦
th:block
β€’
νƒ€μž„λ¦¬ν”„ 좜λ ₯
β—¦
th:text
β—¦
th:html
β—¦
th:href
β€’
νƒ€μž„λ¦¬ν”„ μ œμ–΄λ¬Έ
β—¦
쑰건문
β–ͺ
th:if
β–ͺ
th:switch
β—¦
반볡문
β–ͺ
th:each
β€’
νƒ€μž„λ¦¬ν”„ th:object
β€’
νƒ€μž„λ¦¬ν”„ form
β€’
νƒ€μž„λ¦¬ν”„ μ„Έμ…˜ 정보 κ°€μ Έμ˜€κΈ°
β€’
νƒ€μž„λ¦¬ν”„ μžλ°” λ©”μ†Œλ“œ 호좜

νƒ€μž„λ¦¬ν”„ 블둝

νƒ€μž„λ¦¬ν”„ <th:block>

νƒ€μž„λ¦¬ν”„ th:block은 νƒ€μž„λ¦¬ν”„μ˜ 블둝 νƒœκ·Έλ‘œ, HTML μš”μ†Œλ₯Ό κ·Έλ£Ήν™”ν•˜κ³  쑰건문, 반볡문 등을 μ μš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. th:block νƒœκ·Έ λ‚΄λΆ€μ˜ μš”μ†Œλ“€μ€ 독립적인 λΈ”λ‘μœΌλ‘œ 처리되며, νƒ€μž„λ¦¬ν”„ ν‘œν˜„μ‹κ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ 동적인 μ›Ή νŽ˜μ΄μ§€λ₯Ό ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.
<th:block> ... </th:block>
HTML
볡사

νƒ€μž„λ¦¬ν”„ 좜λ ₯

νƒ€μž„λ¦¬ν”„ <th:text>

νƒ€μž„λ¦¬ν”„ th:textλŠ” νƒœκ·Έ λ‚΄λΆ€μ˜ ν…μŠ€νŠΈλ₯Ό λ™μ μœΌλ‘œ μ„€μ •ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ„œλ²„μ—μ„œ 받은 데이터λ₯Ό μ›Ή νŽ˜μ΄μ§€μ— 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
<th:text="${data}"></th:text>
HTML
볡사
μœ„μ˜ μ˜ˆμ‹œμ—μ„œλŠ” data λ³€μˆ˜μ˜ 값을 ν•΄λ‹Ή νƒœκ·Έμ˜ ν…μŠ€νŠΈλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.

νƒ€μž„λ¦¬ν”„ <th:html>

νƒ€μž„λ¦¬ν”„ th:html은 HTML μš”μ†Œ μ•ˆμ— HTML μ½”λ“œλ₯Ό λ™μ μœΌλ‘œ μ„€μ •ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ„œλ²„μ—μ„œ μƒμ„±λœ HTML을 μ›Ή νŽ˜μ΄μ§€μ— μ‚½μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
<th:html>${htmlData}</th:html>
HTML
볡사
μœ„μ˜ μ˜ˆμ‹œμ—μ„œλŠ” htmlData λ³€μˆ˜μ— μ €μž₯된 HTML μ½”λ“œλ₯Ό ν•΄λ‹Ή νƒœκ·Έ μ•ˆμ— λ™μ μœΌλ‘œ μ‚½μž…ν•©λ‹ˆλ‹€.

νƒ€μž„λ¦¬ν”„ <th:href>

νƒ€μž„λ¦¬ν”„ th:hrefλŠ” HTML μš”μ†Œμ˜ href 속성을 λ™μ μœΌλ‘œ μ„€μ •ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ„œλ²„μ—μ„œ μƒμ„±λœ 링크λ₯Ό μ›Ή νŽ˜μ΄μ§€μ— μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
<a th:href="@{/path/to/page}">Link</a>
HTML
볡사
μœ„μ˜ μ˜ˆμ‹œμ—μ„œλŠ” "/path/to/page" 경둜둜 μ΄λ™ν•˜λŠ” 링크λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
<a th:href="@{/path/to/page(param1=${value1}, param2=${value2}">Link</a>
HTML
볡사
μœ„μ™€ 같이 th:href μ†μ„±μœΌλ‘œ @{ } 기호λ₯Ό μ‚¬μš©ν•˜λ©΄,
(νŒŒλΌλ―Έν„°1=κ°’1, νŒŒλΌλ―Έν„°2=κ°’2) ν˜•μ‹μœΌλ‘œ μš”μ²­ νŒŒλΌλ―Έν„°λ₯Ό λ Œλ”λ§ν•  수 μžˆλ‹€.
ex) param1: 10, param2 : 20
<a th:href="/path/to/page?param1=10&param2=20">Link</a>
HTML
볡사

th:href="@{}"와 href="" 차이

th:href="@{}"λŠ” νƒ€μž„λ¦¬ν”„μ˜ 링크 ν‘œν˜„μ‹μœΌλ‘œ, νƒ€μž„λ¦¬ν”„κ°€ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ λ™μ μœΌλ‘œ 링크λ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 반면 href=""λŠ” 정적인 λ°©μ‹μœΌλ‘œ 링크λ₯Ό μ§€μ •ν•˜λŠ” HTML μ†μ„±μž…λ‹ˆλ‹€.
β€’
th:href="@{}" μ˜ˆμ‹œ: <a th:href="@{/path/to/page}">Link</a>
β€’
href="" μ˜ˆμ‹œ: <a href="/path/to/page">Link</a>
νƒ€μž„λ¦¬ν”„μ˜ th:hrefλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ²½λ‘œμ™€ μƒλŒ€κ²½λ‘œλ₯Ό μžλ™μœΌλ‘œ μ²˜λ¦¬ν•˜λ―€λ‘œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄λΆ€μ—μ„œ μ΄λ™ν•˜λŠ” 링크λ₯Ό νŽΈλ¦¬ν•˜κ²Œ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

νƒ€μž„λ¦¬ν”„ μ œμ–΄λ¬Έ

쑰건문

β€’
<th:if>
β€’
<th:switch>

νƒ€μž„λ¦¬ν”„ <th:if>

νƒ€μž„λ¦¬ν”„ th:ifλŠ” 쑰건문을 μ‚¬μš©ν•˜μ—¬ ν…œν”Œλ¦Ώμ—μ„œ νŠΉμ • 뢀뢄을 쑰건에 따라 λ³΄μ—¬μ£Όκ±°λ‚˜ 숨길 수 μžˆμŠ΅λ‹ˆλ‹€. 쑰건문은 νƒ€μž„λ¦¬ν”„ ν‘œν˜„μ‹μœΌλ‘œ μž‘μ„±λ˜λ©°, ν•΄λ‹Ή 쑰건이 참일 λ•Œλ§Œ ν•΄λ‹Ή μš”μ†Œκ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.
<th:if="${condition}"> ... </th:if>
HTML
볡사
μœ„μ˜ μ˜ˆμ‹œμ—μ„œλŠ” condition이 참일 λ•Œμ—λ§Œ ν•΄λ‹Ή μš”μ†Œκ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

<th:if> 쑰건문 μ˜ˆμ‹œ

1.
boolean νƒ€μž…μ˜ 쑰건식
2.
κ°’ 비ꡐ
3.
객체의 λ³€μˆ˜ 비ꡐ
4.
λ¬Έμžμ—΄ 비ꡐ

boolean νƒ€μž…μ˜ 쑰건식

boolean checked = true; // λ˜λŠ” false
Java
볡사
<th:if="${checked}"> <h1>checked 쑰건이 true μΌλ•Œ</h1> </th:if>
HTML
볡사

κ°’ 비ꡐ

int age = 20;
Java
볡사
<th:if="${ age >= 20 }"> <h1>age >= 20 쑰건이 λ§Œμ‘±ν•  λ•Œ</h1> </th:if>
HTML
볡사

객체의 λ³€μˆ˜ 비ꡐ

public class Person { String name = "ALOHA"; int age = 20; }
Java
볡사
<th:if="${ person.age >= 20 }"> <h1>age >= 20 쑰건이 λ§Œμ‘±ν•  λ•Œ</h1> </th:if>
HTML
볡사

λ¬Έμžμ—΄ 비ꡐ

public class Person { String name = "ALOHA"; int age = 20; }
Java
볡사
λ¬Έμžμ—΄ 비ꡐ도 == 기호둜 비ꡐ가 κ°€λŠ₯ν•˜λ‹€.
<th:if="${ person.name == 'ALOHA' }"> <h1>age >= 20 쑰건이 λ§Œμ‘±ν•  λ•Œ</h1> </th:if>
HTML
볡사
#strings μœ ν‹Έλ¦¬ν‹° 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ equlas() ν•¨μˆ˜λ₯Ό 비ꡐ할 수 μžˆλ‹€.
#strings.equals( λ¬Έμžμ—΄1, λ¬Έμžμ—΄2 )
<th:block th:if="${ person != null && #strings.equals( person.name, 'ALOHA' ) }"> <h1 th:text="${ person.name }"></h1> </th:block>
HTML
볡사
λ¬Έμžμ—΄ λ“± 객체의 λ³€μˆ˜ 비ꡐ μ‹œ, 객체가 null 인지 μ²΄ν¬ν•˜λŠ” 것이 μœ μ˜ν•œλ‹€.
<th:block th:if="${ person != null and person.name == 'ALOHA' }"> <h1 th:text="${ person.name }"></h1> </th:block>
HTML
볡사
AND 연산을 and λ˜λŠ” && 둜 μ μš©ν•  수 μžˆλ‹€.
<th:block th:if="${ person != null && #strings.equals( person.name, 'ALOHA' ) }"> <h1 th:text="${ person.name }"></h1> </th:block>
HTML
볡사
μ‚Όν•­ μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜μ—¬ null 체크λ₯Ό ν•  수 μžˆλ‹€.
<h1 th:text="${ person == null ? 'μ΄λ¦„μ—†μŒ' : person.name }"></h1>
HTML
볡사

νƒ€μž„λ¦¬ν”„ <th:switch>

νƒ€μž„λ¦¬ν”„ th:switchλŠ” switchλ¬Έκ³Ό λΉ„μŠ·ν•œ λ™μž‘μ„ μˆ˜ν–‰ν•˜μ—¬ ν…œν”Œλ¦Ώμ—μ„œ λ‹€μ–‘ν•œ κ²½μš°μ— 따라 λ‹€λ₯Έ λ™μž‘μ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 각 κ²½μš°λŠ” νƒ€μž„λ¦¬ν”„ th:case νƒœκ·Έλ‘œ μ •μ˜λ˜λ©°, 쑰건에 따라 ν•΄λ‹Ή κ²½μš°κ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.
<th:switch="${variable}"> <th:case="value1">...</th:case> <th:case="value2">...</th:case> <th:case="value3">...</th:case> ... </th:switch>
HTML
볡사
μœ„μ˜ μ˜ˆμ‹œμ—μ„œλŠ” variable의 값에 따라 ν•΄λ‹Ήν•˜λŠ” 경우의 μ½”λ“œ 블둝이 μ‹€ν–‰λ©λ‹ˆλ‹€.

반볡문

νƒ€μž„λ¦¬ν”„ <th:each>

νƒ€μž„λ¦¬ν”„ th:eachλŠ” λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜μ—¬ ν…œν”Œλ¦Ώμ—μ„œ λ™μΌν•œ μš”μ†Œλ₯Ό μ—¬λŸ¬ 번 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ°˜λ³΅λ¬Έμ€ νƒ€μž„λ¦¬ν”„ ν‘œν˜„μ‹μœΌλ‘œ μž‘μ„±λ˜λ©°, μ§€μ •λœ 데이터 μ»¬λ ‰μ…˜μ˜ 각 ν•­λͺ©μ— λŒ€ν•΄ λ°˜λ³΅ν•˜μ—¬ μš”μ†Œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
<th:block th:each="item : ${items}"> ... </th:block>
HTML
볡사
μœ„μ˜ μ˜ˆμ‹œμ—μ„œλŠ” items μ»¬λ ‰μ…˜μ˜ 각 ν•­λͺ©μ— λŒ€ν•΄ ν•΄λ‹Ή μš”μ†Œκ°€ 반볡적으둜 μƒμ„±λ©λ‹ˆλ‹€.
items 에 λ°°μ—΄ λ˜λŠ” μ»¬λ ‰μ…˜μ„ μ§€μ •ν•˜μ—¬ 전체 λ°˜λ³΅μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
1.
기본 반볡문
2.
반볡 객체 속성
3.
필터링 쑰건
4.
쀑첩 반볡문
5.
isEmtpy()

기본 반볡문

<th:block th:each="μš”μ†Œ, iterStat : ${λ°°μ—΄ or μ»¬λ ‰μ…˜}"> <th:block th:text="${ μš”μ†Œ }"></th:block> <th:block th:text="${ μš”μ†Œ.λ³€μˆ˜ }"></th:block> </th:block>
HTML
볡사
iterStat : 반볡 객체λ₯Ό μ‚¬μš©ν•΄μ„œ index, count λ“± μˆœμ„œ λ²ˆν˜Έμ™€ μ—¬λŸ¬ 필터링 쑰건값을 μ‚¬μš©

반볡 객체 속성

속성
μ„€λͺ…
iterStat.index
0λΆ€ν„° μ‹œμž‘ν•˜λŠ” 인덱슀
iterStat.count
1λΆ€ν„° μ‹œμž‘ν•˜λŠ” 순번
iterStat.size
μ»¬λ ‰μ…˜μ˜ 총 크기
iterStat.even
ν˜„μž¬ μΈλ±μŠ€κ°€ μ§μˆ˜μΈμ§€ (true λ˜λŠ” false)
iterStat.odd
ν˜„μž¬ μΈλ±μŠ€κ°€ ν™€μˆ˜μΈμ§€ (true λ˜λŠ” false)
iterStat.first
첫 번째 μš”μ†ŒμΈμ§€ (true λ˜λŠ” false)
iterStat.last
λ§ˆμ§€λ§‰ μš”μ†ŒμΈμ§€ (true λ˜λŠ” false)
<th:block th:each="item, iterStat : ${items}"> index : <th:block th:text=${iterStat.index}></th:block> count: <th:block th:text=${iterStat.count}></th:block> size: <th:block th:text=${iterStat.size}></th:block> ... </th:block>
HTML
볡사

필터링 쑰건

<th:block th:each="μš”μ†Œ, iterStat : ${λ°°μ—΄ or μ»¬λ ‰μ…˜}" th:if="${ 쑰건 }"> <th:block th:text="${ μš”μ†Œ }"></th:block> <th:block th:text="${ μš”μ†Œ.λ³€μˆ˜ }"></th:block> </th:block>
HTML
볡사
th:each 반볡 μ•ˆμ—μ„œ, th:if="${ 쑰건 }" 쑰건에 λ§Œμ‘±ν•˜λŠ” μš”μ†Œλ§Œ ν•„ν„°λ§ν•˜μ—¬ 좜λ ₯ν•  수 μžˆλ‹€.

쀑첩 반볡문

public class Users { public String username; public String password; public String name; public List<UserAuth> authList; }
Java
볡사
public class UserAuth { public String username; public String auth; }
Java
볡사
List<Users> userList;
Java
볡사
<th:block th:each="user, iterStat : ${userList}"> <th:block th:text="${user.name}"></th:block> ... <th:block th:each="auth, iterStat : ${user.authList}"> <th:block th:text="${auth.username}"></th:block> <th:block th:text="${auth.auth}"></th:block> ... </th:block> </th:block>
HTML
볡사

isEmtpy()

μ§€μ •ν•œ μ»¬λ ‰μ…˜μ΄ λΉ„μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” λ©”μ†Œλ“œ
<th:block th:if="${ μ»¬λ ‰μ…˜.isEmpty()}"> </th:block>
HTML
볡사
<th:block th:if=" #lists.isEmpty( μ»¬λ ‰μ…˜ ) "> </th:block>
HTML
볡사

th:classappend=”${ 쑰건 ? β€˜μ†μ„±1’ : β€˜μ†μ„±2’ }”

<th:block th:each=" item, iterStat : ${items}" > <tr class="row" th:classappend="${ iterStat.odd ? 'odd' : 'even' }"> <td><th:block th:text="${iterStat.index}"></th:block></td> <td><th:block th:text="${iterStat.count}"></th:block></td> <td><th:block th:text="${iterStat.size}"></th:block></td> <td><th:block th:text="${item}"></th:block></td> <td><th:block th:text="${iterStat.odd}"></th:block></td> <td><th:block th:text="${iterStat.even}"></th:block></td> <td><th:block th:text="${iterStat.first}"></th:block></td> <td><th:block th:text="${iterStat.last}"></th:block></td> </tr> </th:block>
HTML
볡사
th:classappend=’’ 쑰건을 λ§Œμ‘±ν•˜λŠ” κ²½μš°μ— 클래슀 속성을 μΆ”κ°€ν•œλ‹€.

νƒ€μž„λ¦¬ν”„ th:object

νƒ€μž„λ¦¬ν”„μ˜ th:objectλŠ” 폼 처리λ₯Ό κ°„μ†Œν™”ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” μ€‘μš”ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€. 이 속성을 μ‚¬μš©ν•˜λ©΄ 폼과 κ΄€λ ¨λœ 객체λ₯Ό μ§€μ •ν•˜μ—¬ ν•΄λ‹Ή 객체의 속성에 μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ£Όμš” νŠΉμ§•:

β€’
객체 바인딩: th:objectλ₯Ό μ‚¬μš©ν•˜μ—¬ 폼에 객체λ₯Ό λ°”μΈλ”©ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 폼 ν•„λ“œμ™€ 객체 속성을 μ‰½κ²Œ μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
β€’
*{...} 문법: th:object와 ν•¨κ»˜ *{...} 문법을 μ‚¬μš©ν•˜μ—¬ λ°”μΈλ”©λœ 객체의 속성에 직접 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
β€’
μ½”λ“œ κ°„μ†Œν™”: 반볡적인 객체 μ°Έμ‘°λ₯Ό 쀄여 μ½”λ“œλ₯Ό 더 κ°„κ²°ν•˜κ³  읽기 μ‰½κ²Œ λ§Œλ“­λ‹ˆλ‹€.
th:object="${객체}”
μƒμœ„ νƒœκ·Έμ—μ„œ 객체λ₯Ό λ“±λ‘ν•˜κ³ , ν•˜μœ„ νƒœκ·Έμ—μ„œ *{λ³€μˆ˜} ν˜•νƒœλ‘œ μ ‘κ·Ό κ°€λŠ₯
<div th:object="${user}"> <ul> <li th:text="*{no}"></li> <li th:text="*{id}"></li> <li th:text="*{username}"></li> <li th:text="*{password}"></li> <li th:text="*{name}"></li> <li th:text="*{ #dates.format( createdAt, 'yyyy-MM-dd HH:mm:ss' ) }"></li> <li th:text="*{ #dates.format( updatedAt, 'yyyy-MM-dd HH:mm:ss' ) }"></li> </ul> </div>
HTML
볡사

νƒ€μž„λ¦¬ν”„ form

th:field="*{λ³€μˆ˜}" id, name, value 속성을 μžλ™μœΌλ‘œ 생성
<form action="" method="post" th:object="${user}"> <input type="text" th:field="*{no}"> <br> <input type="text" th:field="*{id}"> <br> <input type="text" th:field="*{username}"> <br> <input type="text" th:field="*{password}"> <br> <input type="text" th:field="*{name}"> <br> </form>
HTML
볡사
μœ„μ™€κ°™μ΄ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ μ‹€μ œλ‘œλŠ” μ•„λž˜μ™€ 같이 λžœλ”λ§λœλ‹€.
<form action="" method="post"> <input type="text" id="no" name="no" value="1"> <br> <input type="text" id="id" name="id" value="c8f3ed9e-b16e-4d94-9c5c-1eaf1e5b17f1"> <br> <input type="text" id="username" name="username" value="ALOHA"> <br> <input type="text" id="password" name="password" value="123456"> <br> <input type="text" id="name" name="name" value="μ•Œλ‘œν•˜"> <br> </form>
HTML
볡사
λΌλ””μ˜€ λ²„νŠΌ (input type=”radio”) μ²΄ν¬ν•˜κΈ°
<form action="" method="post" th:object="${user}"> ... <input type="radio" id="male" value="λ‚¨μž" name="gender" th:checked="*{ gender == 'λ‚¨μž' }"> <label for="male">λ‚¨μž</label> <input type="radio" id="female" value="μ—¬μž" name="gender" th:checked="*{ gender == 'μ—¬μž' }"> <label for="female">μ—¬μž</label> ... </form>
HTML
볡사
선택 μƒμž (select) μ²΄ν¬ν•˜κΈ°
select 에 th:field="*{type}" λ₯Ό μ‚¬μš©ν•˜λ©΄, type κ°’κ³Ό μΌμΉ˜ν•˜λŠ” option 을 μžλ™μœΌλ‘œ 선택
<form action="" method="post" th:object="${user}"> ... <select th:field="*{type}"> <option value="μ‚¬μš©μž νƒ€μž…" disabled>μ‚¬μš©μž νƒ€μž…</option> <option value="μ‚¬μš©μž">μ‚¬μš©μž</option> <option value="κ΄€λ¦¬μž">κ΄€λ¦¬μž</option> </select> ... </form>
HTML
볡사
th:selected=”${ 쑰건 }”, th:selected=”*{ 쑰건 }” ν˜•νƒœλ‘œ selected μ—¬λΆ€λ₯Ό 지정할 수 도 있음
<form action="" method="post" th:object="${user}"> ... <select name="type"> <option value="μ„ νƒμ•ˆν•¨" th:selected="*{ type == null }">μ„ νƒμ•ˆν•¨</option> <option value="μ‚¬μš©μž" th:selected="*{ type == 'μ‚¬μš©μž' }">μ‚¬μš©μž</option> <option value="κ΄€λ¦¬μž" th:selected="*{ type == 'κ΄€λ¦¬μž' }">κ΄€λ¦¬μž</option> </select> ... </form>
HTML
볡사
λ‚ μ§œ (input type=”date”) 데이터λ₯Ό 값을 μ§€μ •ν•˜κΈ° β€˜yyyy-MM-dd’ 포맷을 값을 지정해주면 λ“€μ–΄κ°„λ‹€
<form action="" method="post" th:object="${user}"> ... <input type="date" th:value="*{ #dates.format( createdAt, 'yyyy-MM-dd' ) }" id="createdAt" name="createdAt"> <br> <input type="date" th:value="*{ #dates.format( updatedAt, 'yyyy-MM-dd' ) }" id="updatedAt" name="updatedAt"> <br> ... </form>
HTML
볡사

νƒ€μž„λ¦¬ν”„ μ„Έμ…˜ 정보 κ°€μ Έμ˜€κΈ°

// 둜그인 μœ μ € Users loginUser = new Uers(); loginUser.setNo(1L); loginUser.setId( UUID.randomUUID().toString() ); loginUser.setUsername("ALOHA"); loginUser.setPassword("123456"); loginUser.setName("μ˜€μŠΉμ›"); loginUser.setGender("μ—¬μž"); // λ‚¨μž μ—¬μž loginUser.setType("κ΄€λ¦¬μž"); // μ‚¬μš©μž κ΄€λ¦¬μž loginUser.setCreatedAt(new Date()); loginUser.setUpdatedAt(new Date()); loginUser.setAuthList(authList); session.setAttribute("loginUser", loginUser); model.addAttribute("loginUser", loginUser);
Java
볡사
@Data @NoArgsConstructor @AllArgsConstructor @Builder public class Users { private Long no; private String id; private String username; private String password; private String name; private String gender; private String type; private Date createdAt; private Date updatedAt; List<UserAuth> authList; // μ‚¬μš©μž κΆŒν•œ 확인 λ©”μ†Œλ“œ public boolean containsAuth(String auth) { for (UserAuth userAuth : authList) { if (userAuth.getAuth().equals(auth)) { return true; } } return false; } }
Java
볡사
<!-- μ„Έμ…˜ κ°€μ Έμ˜€κΈ° --> <h2>${session.loginUser}</h2> <h3 th:text="${session.loginUser.name}"></h3> <h3 th:text="${session.loginUser.username}"></h3> <h3 th:text="${session.loginUser.password}"></h3>
HTML
볡사

νƒ€μž„λ¦¬ν”„ μžλ°” λ©”μ†Œλ“œ 호좜

// κΆŒν•œ UserAuth roleUser = UserAuth.builder().auth("ROLE_USER").build(); UserAuth roleAdmin = UserAuth.builder().auth("ROLE_ADMIN").build(); List<UserAuth> authList = List.of( roleUser, roleAdmin ); // 둜그인 μœ μ € Users loginUser = new Uers(); loginUser.setNo(1L); loginUser.setId( UUID.randomUUID().toString() ); loginUser.setUsername("ALOHA"); loginUser.setPassword("123456"); loginUser.setName("μ˜€μŠΉμ›"); loginUser.setGender("μ—¬μž"); // λ‚¨μž μ—¬μž loginUser.setType("κ΄€λ¦¬μž"); // μ‚¬μš©μž κ΄€λ¦¬μž loginUser.setCreatedAt(new Date()); loginUser.setUpdatedAt(new Date()); loginUser.setAuthList(authList);
Java
볡사
@Data @NoArgsConstructor @AllArgsConstructor @Builder public class Users { private Long no; private String id; private String username; private String password; private String name; private String gender; private String type; private Date createdAt; private Date updatedAt; List<UserAuth> authList; // μ‚¬μš©μž κΆŒν•œ 확인 λ©”μ†Œλ“œ public boolean containsAuth(String auth) { for (UserAuth userAuth : authList) { if (userAuth.getAuth().equals(auth)) { return true; } } return false; } }
Java
볡사
@Data @Builder public class UserAuth { private String username; private String auth; }
Java
볡사
... <input type="checkbox" name="authList" id="role_user" th:checked="${ loginUser.containsAuth('ROLE_USER') }"> <label for="role_user">ROLE_USER</label> <input type="checkbox" name="authList" id="role_admin" th:checked="${ loginUser.containsAuth('ROLE_ADMIN') }"> <label for="role_admin">ROLE_ADMIN</label> <br>
HTML
볡사
Users 객체의 containsAuth() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ ν•΄λ‹Ή 객체가 νŠΉμ • κΆŒν•œ (’ROLE_USER’, β€˜ROLE_ADMIN’) 을 가지고 μžˆλŠ”μ§€ ν™•μΈν•΄λ΄…λ‹ˆλ‹€.