Spring

Thymeleaf ํƒ€์ž„๋ฆฌํ”„ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์ •๋ฆฌ [ํ…์ŠคํŠธ/๋ณ€์ˆ˜/๋ฐ˜๋ณต/์†์„ฑ]

DAHLIA CHOI 2021. 10. 15. 17:28

 

ํƒ€์ž„๋ฆฌํ”„๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋‹ค.

์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค!

์—ฌ๊ธฐ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ณณ์„ ํ†ตํ•ด์„œ ํ”„๋กœ์ ํŠธ๋Š” ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” Dependencies์— ํƒ€์ž„๋ฆฌํ”„๋ฅผ ์„ ํƒํ•˜๋ฉด๋œ๋‹ค.

 

ํ˜น์‹œ ์„ ํƒํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด build.gradle์— ๋“ค์–ด๊ฐ€์„œ 

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
}

dependencies์•ˆ์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€์‹œ์ผœ ์ฃผ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค!!

 

 

๊ทธ๋Ÿผ ํƒ€์ž„๋ฆฌํ”„ ๊ฐœ๋…์„ ์ •๋ฆฌํ•ด๋ด์•ผ๊ฒ ๋‹ค๐Ÿ™ƒ

 

 

 


ํƒ€์ž„๋ฆฌํ”„ (Thymeleaf)

ํƒ€์ž„๋ฆฌํ”„๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ์ž๋ฐ” ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋‹ค.

 

โ—พ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ HTML ๋ Œ๋”๋ง

๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ HTML์„ ๋™์ ์œผ๋กœ ๋ Œ๋”๋ง ํ•˜๋Š” ์šฉ๋„์ด๋‹ค.

 

โ—พ ๋‚ด์ถ”๋Ÿด ํ…œํ”Œ๋ฆฟ

ํƒ€์ž„๋ฆฌํ”„๋Š” HTML์„ ์ตœ๋Œ€ํ•œ ์œ ์ง€์‹œํ‚ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.
th๋ฅผ ์‚ฌ์šฉํ•ด์„œ HTML ์ฝ”๋“œ ์•ˆ์— ์ž‘์„ฑํ•œ๋‹ค.
ํƒ€์ž„๋ฆฌํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ ๊ทธ๋Œ€๋กœ ์›น๋ธŒ๋ผ์šฐ์ €์— ์—ด์–ด๋„ ์ •์ƒ์ ์ธ HTML์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋™์  ๊ฒฐ๊ณผ๋Š” ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๋Š”๋‹ค
์ˆœ์ˆ˜ HTML์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž„๋ฆฌํ”„์˜ ํŠน์ง•์„ ๋‚ด์ถ”๋Ÿด ํ…œํ”Œ๋ฆฟ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

โ—พ ์Šคํ”„๋ง ํ†ตํ•ฉ ์ง€์›

 

 

 

ํƒ€์ž„๋ฆฌํ”„๋Š” HTML์— ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— HTML๋ฌธ์— ํƒ€์ž„๋ฆฌํ”„๋ฅผ ์„ ์–ธํ•ด์ค˜์•ผ ํ•œ๋‹ค.

<html xmlns:th="http://www.thymeleaf.org">

 

 

[ ๊ธฐ๋ณธ ํ‘œํ˜„์‹ ]

 

 

Tutorial: Using Thymeleaf

1 Introducing Thymeleaf 1.1 What is Thymeleaf? Thymeleaf is a modern server-side Java template engine for both web and standalone environments, capable of processing HTML, XML, JavaScript, CSS and even plain text. The main goal of Thymeleaf is to provide a

www.thymeleaf.org

์ด ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๋ฉด ํ‘œํ˜„์‹ ์ •๋ฆฌ๊ฐ€ ์ž˜ ๋˜์–ด์žˆ๋‹ค!

 

 

 

[ ํ…์ŠคํŠธ ]

 

ํƒ€์ž„๋ฆฌํ”„์—์„œ ํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด th:text๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

<sapn th:text=${data}">

 

HTML ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด [[${data}]]๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

โญ ๊ทผ๋ฐ html ์†์„ฑ ์ค‘์— ๊ธ€์”จ๋ฅผ ๊ตต๊ฒŒ ํ•œ๋‹ค๊ฑฐ๋‚˜ ์ค‘๊ฐ„์— <> ํƒœ๊ทธ๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ํ•  ์ผ์ด ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿด ๋•Œ๋Š” ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์†Œ์Šค๋ณด๊ธฐ์—์„œ ์ด์ƒํ•œ ํ‘œํ˜„์ด ๋‚˜์˜จ๋‹ค.

 

 

Hello <b>Spring!</b>๋ฅผ ๋ณด๋‚ธ ๊ฒƒ์ด๋‹ค.

 

  • <  ๐Ÿ‘‰ &lt
  • > ๐Ÿ‘‰ &gt

์œ„์ฒ˜๋Ÿผ ํ‘œ์‹œ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ html์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ˆ˜๋ฌธ์ž๋ฅผ html์—”ํ„ฐํ‹ฐ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์ด์Šค์ผ€์ดํ”„๋ผ๊ณ  ํ•œ๋‹ค.

ํƒ€์ž„๋ฆฌํ”„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด์Šค์ผ€์ดํ”„๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

๋งŒ์•ฝ ์œ„์ฒ˜๋Ÿผ ํ‘œํ˜„ํ•˜๊ธฐ ์‹ซ๋‹ค๋ฉด unescape๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

  • th:text ๐Ÿ‘‰ th:utext
  • [[...]] ๐Ÿ‘‰ [(...)]

๋กœ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ƒฅ <>์ด ํƒœ๊ทธ๊ฐ€ ๋ณด์ธ๋‹ค!

 

 

 

๐Ÿ“ ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” escape๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ๋งŒ unescape๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค!!!!

 

 

 

[ ๋ณ€์ˆ˜ ]

๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ณ€์ˆ˜ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

${...}

์œ„์™€ ๊ฐ™์€ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

๊ทธ๋Ÿผ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด์ž

 

@Data
static class Person{
	
    private String name;
    private int age;
    
    public User(String name, int age){
    	
        this.name = name;
        this.age = age;
        }
}
public String variable(Model model){
	
    Person person = new Person("user1", 10);
    
    List<Person> list = new ArrayList<>();
    list.add(user1); //๋ฆฌ์ŠคํŠธ๋กœ ์ ‘๊ทผ ํ•  ๋•Œ
    
    Map<String, Person> map = new HashMap<>();
    map.put("user1", user1);
    
    model.addAttribute("user", user1);
    model.addAttribute("userList", list);
    model.addAttribute("userMap",map);
    
    return [html๋กœ~~];  
}

 

 

 

๋ณ€์ˆ˜ ์ถœ๋ ฅํ•˜๋Š” ๋ฐ์—๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

  • ${key์ด๋ฆ„.๋ณ€์ˆ˜์ด๋ฆ„}
  • ${key์ด๋ฆ„['๋ณ€์ˆ˜์ด๋ฆ„']}
  • ${key์ด๋ฆ„.getter๋ฉ”์„œ๋“œ ์ด๋ฆ„}

 

<!-- ๊ฐ์ฒด๋กœ ๋„˜๊ฒผ์„ ๊ฒฝ์šฐ -->
<span th:text="${user.name}"></span>
<span th:text="${user['name']}"></span>
<span th:text="${user.getName()}"></span>

<!--๋ฆฌ์ŠคํŠธ๋กœ ๋„˜๊ฒผ์„ ๊ฒฝ์šฐ -->
<span th:text="${userList[0].name}"></span>
<span th:text="${userList[0]['name']}"></span>
<span th:text="${userList[0].getName()}"></span>

<!--๋งต์œผ๋กœ ๋„˜๊ฒผ์„ ๊ฒฝ์šฐ -->
<span th:text="${userMap['user1'].name}"></span>
<span th:text="${userMap['user1']['name']}"></span>
<span th:text="${userMap['user1'].getName()}"></span>

 

 

โž• ์ง€์—ญ ๋ณ€์ˆ˜ ์„ ์–ธ

 

th:with๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€์—ญ๋ณ€์ˆ˜๋Š” ์„ ์–ธํ•œ ํƒœ๊ทธ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

<div th:with="fist=${userList[0]}">
    <span th:text="${first.name}"></span>
</div>

 

 

 

[ url ๋งํฌ ]

ํƒ€์ž„๋ฆฌํ”„์—์„œ url์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š”@{...} ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

์˜ˆ๋ฅผ ๋“ค์–ด

@{/hello}

๋ผ๊ณ  ๊ฒฝ๋กœ ์„ค์ •์„ ํ•ด ๋†“์œผ๋ฉด "/hello"๋ผ๋Š” ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ด์šฉํ•œ url ์ž…๋ ฅ์€ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

โญ"/"๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. url ๊ฒฝ๋กœ์ƒ์— ๋ณ€์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด () ๋ถ€๋ถ„์ด ๊ฒฝ๋กœ ๋ณ€์ˆ˜๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. (? A=b ์ด๋Ÿฐ ์‹)

 

 

๐Ÿ‘‰ ๊ฒฝ๋กœ ๋ณ€์ˆ˜

@{/hello/{param1}/{param2}(param1=${param1}, param2=${param2})

์ด๋Ÿฐ ์‹์„ ์ž…๋ ฅํ•˜๋ฉด ์ž…๋ ฅ ๊ฒฐ๊ณผ๋Š”

/hello/(param1 value๊ฐ’)/(param2 vaule๊ฐ’)

์œผ๋กœ url๊ฒฝ๋กœ๊ฐ€ ์„ค์ •๋œ๋‹ค. 

 

 

๐Ÿ‘‰ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ

์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” ()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

@{/hello(param=${param})

์ด๋Ÿฐ ์‹์„ ์ž…๋ ฅํ•˜๋ฉด ์ž…๋ ฅ ๊ฒฐ๊ณผ๋Š”

/hello?param=(param value๊ฐ’)

์œผ๋กœ url์ด ์ž…๋ ฅ๋œ๋‹ค!! ์ฆ‰ () ์•ˆ์— ์žˆ๋Š” ๊ฑด ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ?~~~ ์ด ๋’ค์— ์žˆ๋Š” ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

๐Ÿ‘‰ ๊ฒฝ๋กœ ๋ณ€์ˆ˜ + ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ

๊ฒฝ๋กœ ๋ณ€์ˆ˜์™€ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ฐ™์ด ํ™œ์šฉ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

@{hello/{param1}(param1=${param1}, param2=${param2})

/{}์—ฌ๊ธฐ๊นŒ์ง€๋Š” param1๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— param1๊นŒ์ง€๊ฐ€ ๊ฒฝ๋กœ ๋ณ€์ˆ˜๋กœ ์„ค์ •๋˜๊ณ , ์ €๊ธฐ์— ์—†๊ณ  () ์—ฌ๊ธฐ ์•ˆ์— ์กด์žฌํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ž…๋ ฅ๋œ๋‹ค.

 

/hello/(param1 value๊ฐ’)?param2=(param2 value๊ฐ’)

๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

 

 

 

[ ๋ฆฌํ„ฐ๋Ÿด ]

๋ฆฌํ„ฐ๋Ÿด์€ ์†Œ์Šค ์ฝ”๋“œ์ƒ์— ๊ณ ์ •๋œ ๊ฐ’์„ ๋งํ•˜๋Š” ์šฉ์–ด์ด๋‹ค.

๋”ฐ๋ผ์„œ ๊ผญ!!! ์ž‘์€๋”ฐ์˜ดํ‘œ๋กœ ๋ฌธ์ž๋ฅผ ๊ฐ์‹ธ์•ผํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ณต๋ฐฑ์ด ์—†์œผ๋ฉด ๊ฐ์‹ธ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. (๊ทธ๋ž˜๋„ ๊ผญ!!! ํ•˜๊ธฐ)

 

 

๐Ÿ‘‰ hello world ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ

<span th:text ="'hello' + ' world'"></span>
<span th:text="'hello world'"></span>

์ด๋Ÿฐ ์‹์œผ๋กœ ๊ผญ ์•ˆ์— ์ž‘์€๋”ฐ์˜ดํ‘œ๋ฅผ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ผ์ผ์ด ๋ถ™์ด๊ธฐ ๊ท€์ฐฎ์„ ๋•Œ!! ์ข‹์€ ํƒ€์ž„๋ฆฌํ”„ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

||์ด๊ฑฐ๋กœ ๊ฐ์‹ธ๋ฉด ๋œ๋‹ค.

 

 

<span th:text="|hello world|"></span>

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊น”๋”ํ•˜๊ฒŒ ์ถœ๋ ฅ ๊ฐ€๋Šฅ๐Ÿ™ƒ

 

 

 

 

[ ์†์„ฑ ์„ค์ • ]

 

th:* ์†์„ฑ์„ ์ด์šฉํ•˜๋ฉด ๊ธฐ์กด ์†์„ฑ์„ ํƒ€์ž„๋ฆฌํ”„๊ฐ€ ์ง€์ •ํ•œ th:* ์†์„ฑ์œผ๋กœ ๋Œ€์ฒดํ•˜๊ฒŒ ๋œ๋‹ค!!

name="A" th:name="B"

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ํƒ€์ž„๋ฆฌํ”„์˜ ์†์„ฑ์ด ์šฐ์„ ์‹œ๋˜์–ด์„œ ์ด๋ฆ„์ด B๊ฐ€ ๋œ๋‹ค!!

 

โž• ์†์„ฑ ์ถ”๊ฐ€

  • th:attrappend : ์†์„ฑ ๊ฐ’์˜ ๋’ค์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • th:attrprepend : ์†์„ฑ ๊ฐ’์˜ ์•ž์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • th:classappend : class ์†์„ฑ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

class="hello" th:attrappend="class=' world'" <!-- class ์†์„ฑ ๋’ค์— world ์ถ”๊ฐ€ํ•˜๊ธฐ -->
class="hello" th:attrpreapend="class='world '" <!-- class ์†์„ฑ ์•ž์— world ์ถ”๊ฐ€ํ•˜๊ธฐ -->
class="hello" th:classappend="' world'" <!-- class ์†์„ฑ์— world ์ถ”๊ฐ€ํ•˜๊ธฐ-->

์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿผ ๊ฒฐ๊ณผ๋Š”

hello world
world hello
hello world

์ด๋ ‡๊ฒŒ ๋‚˜์˜จ๋‹ค!

 

 

 

โž• ์ฒดํฌ๋ฐ•์Šค

<input type="checkbox" name="active" checked="false"/>

์ฒดํฌ๋ฐ•์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด check๋ฐ•์Šค๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์ฒ˜๋Ÿผ ์ฒดํฌ๋ฅผ ์•ˆ ํ•˜๊ณ  ์‹ถ์ง€๋งŒ, checked๋ผ๋Š” ์†์„ฑ์ด ์ž…๋ ฅ๋˜๋ฉด true, false์˜ ์—ฌ๋ถ€์™€๋Š” ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ์ฒดํฌ๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค. 

 

์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ํƒ€์ž„๋ฆฌํ”„ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

<!-- check ๋ฐ•์Šค ์ฒดํฌ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ -->
<input type="checkbox" name="active" th:checked="true"/>

<!-- check ๋ฐ•์Šค ์ฒดํฌ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ -->
<input type="checkbox" name="active" th:checked="false"/>
์ฐธ๊ณ ๋กœ th:checked="false"๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด false์ผ ๊ฒฝ์šฐ์—๋Š” ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ณผ ๋•Œ th:checked์˜ ์ฝ”๋“œ๋Š” ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

 

 

 

[ ๋ฐ˜๋ณต ]

 

ํƒ€์ž„๋ฆฌํ”„์—์„œ ๋ฐ˜๋ณต์€ th:each๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

๋ฆฌ์ŠคํŠธ๋กœ ๊ฐ’์„ ๋„ฃ์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ !

<tr th:each="user : ${userList}">
    <td th:text="${user.name}">name</td>
    <td th:text="${user.age}">0</td>
</tr>

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๋ชจ์–‘์€ ์ž๋ฐ” ๋ฐ˜๋ณต๋ฌธ for( : )์ด๊ฑฐ๋ž‘ ๋น„์Šทํ•œ ๊ฒƒ ๊ฐ™๋‹ค!!

 

 

 

 

[ ์กฐ๊ฑด๋ถ€ ํ‰๊ฐ€ ]

 

ํƒ€์ž„๋ฆฌํ”„์—์„œ ์กฐ๊ฑด๋ถ€ ํ‰๊ฐ€๋Š” if, unless, switch๋กœ ํ•œ๋‹ค!

 

๐Ÿ‘‰ if, unless ์‚ฌ์šฉ

<span th:text="'๋ฏธ์„ฑ๋…„์ž'" th:if="${user.age lt 20}"></span>
<span th:text="'๋ฏธ์„ฑ๋…„์ž'" th:unless="${user.age ge 20}"></span>
์—ฌ๊ธฐ์„œ ์ฐธ๊ณ ๋กœ lt๋Š” <์„ ๋œปํ•˜๊ณ , ge๋Š” >=๋ฅผ ๋œปํ•œ๋‹ค.

์กฐ๊ฑด์ด false์ธ ๊ฒฝ์šฐ์—๋Š” ํƒœ๊ทธ ์ž์ฒด๋ฅผ ๋ Œ๋”๋ง ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ํŽ˜์ด์ง€ ์†Œ์Šค๋ณด๊ธฐ๋ฅผ ํ•˜๋ฉด false ์ฝ”๋“œ๊ฐ€ ๋ณด์ด์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

 

 

๐Ÿ‘‰ switch ์‚ฌ์šฉ

<td th:switch="${user.age}">
    <span th:case="10">10์‚ด</span>
    <span th:case="20">20์‚ด</span>
    <span th:case="*">๊ธฐํƒ€</span>
</td>

switch~case๋ฌธ์ด๋ž‘ ๋น„์Šทํ•˜๋‹ค.

ํ•œ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ ์ด ์žˆ๋‹ค๋ฉด *์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’์ด ์—†์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋””ํดํŠธ ๊ฐ’์ด๋‹ค.

10์‚ด, 20์‚ด์ด ์•„๋‹ˆ๋ผ๋ฉด ๋ชจ๋‘ ๊ธฐํƒ€๋กœ ๋ Œ๋”๋ง ๋œ๋‹ค.

 

 

 

 

[ ์ฃผ์„ ]

HTML ์—๋„ ์ฃผ์„์ด ์žˆ์ง€๋งŒ HTML ์ฃผ์„์€ ์›น ๋ธŒ๋ผ์šฐ์ € ์†Œ์Šค๋ณด๊ธฐ์—์„œ ๊ทธ๋Œ€๋กœ ๋ณด์ธ๋‹ค.

 

๐Ÿ‘‰ ํ‘œ์ค€ HTML ์ฃผ์„

<!-- HTML ์ฃผ์„์ฒ˜๋ฆฌ -->

HTML ์ฃผ์„ ์ฒ˜๋ฆฌ๋Š” ์‰ฝ๊ฒŒ ์ €๋ ‡๊ฒŒ ํ‘œ์‹œํ•œ๋‹ค. HTML ์ฃผ์„์€ ํƒ€์ž„๋ฆฌํ”„๊ฐ€ ๋ Œ๋”๋ง ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋‚จ๊ฒจ๋‘”๋‹ค.

 

 

๐Ÿ‘‰ ํƒ€์ž„๋ฆฌํ”„ ํŒŒ์„œ ์ฃผ์„

<!--/* ์ฃผ์„ */-->

<!--/*-->
<span ~~></span>
<!--*/-->

๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ์ฃผ์„์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

/* */ ์—ฌ๊ธฐ ์‚ฌ์ด์— ๋“ค์–ด๊ฐ„ ๊ฒƒ์€ ๋ชจ๋‘ ์ฃผ์„์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

๐Ÿ‘‰ ํƒ€์ž„๋ฆฌํ”„ ํ”„๋กœํ† ํƒ€์ž… ์ฃผ์„

<!--/*/
<span th:text="${data}">data</span>
/*/-->

์ด๊ฑด ์ข€ ํŠน๋ณ„ํ•œ ์ฃผ์„์ด๋‹ค. 

๊ทธ๋ƒฅ html ํŒŒ์ผ๋กœ ์—ด์–ด๋ณด๋ฉด ์ฃผ์„์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ์ง€๋งŒ, ํƒ€์ž„๋ฆฌํ”„๋ฅผ ๋ Œ๋”๋ง ํ–ˆ์„ ๋•Œ ์›น๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋ณด๋ฉด span ํƒœ๊ทธ๋Š” ์ฃผ์„์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค!

 

 

 

[ ๋ธ”๋ก ]

๋ฐ˜๋ณต๋ฌธ์„ ์“ฐ๋ฉด์„œ ํ•ด๋‹น ๊ฐ์ฒด ์ •๋ณด๋ผ๋ฆฌ๋งŒ ๋ฌถ์–ด์„œ ๋ฐ˜๋ณต์œผ๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๋ธ”๋ก์€ th:block์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ , th:each๋ฅผ ์“ฐ๋Š” ๊ณณ์— ์ž‘์„ฑํ•œ๋‹ค. 

์ค‘์š”ํ•œ ์ ! ๋ธ”๋ก์œผ๋กœ ๋ฌถ๊ณ  ์‹ถ์€ ๊ฒƒ๋ผ๋ฆฌ divํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ค€๋‹ค.

 

<th:block th:each="user : ${userList}">
    <div>
        ์ด๋ฆ„ <span th:text="${user.name}></span>
        ๋‚˜์ด <span th:text="${user.age></span>
    </div>
</th:block>

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฆ„๊ณผ ๋‚˜์ด๋กœ ๋ฌถ์—ฌ์„œ ์ถœ๋ ฅ๋œ๋‹ค.

โญ th:block์€ ๋ Œ๋”๋ง ์‹œ์— ์‚ฌ๋ผ์ง€๊ณ , ๋ฌถ์ธ ์ •๋ณด๋งŒ ์ถœ๋ ฅ๋œ๋‹ค!!

 

 

 

 


๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ ํƒ€์ž„๋ฆฌํ”„์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•  ๊ฒƒ ๊ฐ™์€ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•๋งŒ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค!

์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ๊นŒ ์€๊ทผํžˆ ๋งŽ๊ณ  ์ž์ฃผ ์“ฐ๋ฉด์„œ ์ต์ˆ™ํ•ด์ ธ์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค๐Ÿ˜ƒ

 

์ด ํฌ์ŠคํŒ…์€ ์ธํ”„๋Ÿฐ ๊น€์˜ํ•œ ๋‹˜์˜ ์Šคํ”„๋งmvc 2ํŽธ์„ ๋ณด๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.