1son 2023. 4. 8. 16:48

1.Thymeleaf ๋ž€?

Thymeleaf๋Š” HTML, XML, JavaScript, CSS ๋ฐ ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”

์›น ๋ฐ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ํ™˜๊ฒฝ ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ์ตœ์‹  *์„œ๋ฒ„ ์ธก Java ํ…œํ”Œ๋ฆฟ ์—”์ง„์ž…๋‹ˆ๋‹ค.

 

Thymeleaf๋Š” spring MVC์—์„œ ๋ทฐ(View)๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ”ํžˆ ๋ทฐ ํ…œ๋ธ”๋ฆฟ(view template)์œผ๋กœ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.

    - > ๋ทฐ ํ…œํ”Œ๋ฆฟ์€ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

    ์ฆ‰, Thymeleaf๋Š” htmlํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์„œ ํŒŒ์‹ฑํ•ด์„œ ๋ถ„์„ํ›„

    ์ •ํ•ด์ง„ ์œ„์น˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์น˜ํ™˜ํ•ด์„œ ์›น ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

Thymeleaf๋Š” ์„œ๋ฒ„๋ฅผ ๊ฐ€๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ์ˆœ์ˆ˜ HTML์„,

์„œ๋ฒ„๋ฅผ ๊ตฌ๋™ํ•˜๋ฉด ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ๊ฑฐ์ณ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ๋œ HTML์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

JSP๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™ํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ํŒŒ์ผ์„ ์—ด๊ฒŒ ๋˜๋ฉด

-> JSP ์†Œ์Šค์ฝ”๋“œ์™€ HTML์ด ์„ž์—ฌ์žˆ์–ด์„œ ์ •์ƒ์ ์ธ ํ™•์ธ์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

    ์ฆ‰ ์˜ค์ง ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด์„œ JSP์„ ์—ด์–ด์•ผ JSP ํŒŒ์ผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๋ฐ˜๋ฉด์— ํƒ€์ž„๋ฆฌํ”„๋Š” ํ™”๋ฉด ๊ตฌ์„ฑ์„ ์„œ๋ฒ„ ๊ฐ€๋™์—†์ด ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด

๊ฐœ๋ฐœ์— ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„ ์žฌ๊ฐ€๋™์ด ํ•„์š” ์—†์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์— ์šฉ์ดํ•ด์ง‘๋‹ˆ๋‹ค.

 

์ถœ์ฒ˜ : https://jddng.tistory.com/223

์œ„ ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ฉด ํƒ€์ž„๋ฆฌํ”„๋Š” ์ˆœ์ˆ˜ HTMLํŒŒ์ผ์„ ์œ ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

์›น๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ™”๋ฉด์ด ์ž˜ ๋‚˜์˜จ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— JSP๋Š” ํ™”๋ฉด์ด ์•„๋‹Œ ๊ทธ๋ƒฅ ์ฝ”๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ค.

 

 

์™œ ? ๊ทธ๋Ÿด๊นŒ์š”? 

์„œ๋ฒ„ ๊ฐ€๋™์—†์ด ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ด์šฉํ•ด ํ•ด๋‹น ํŒŒ์ผ์„ ์—ด๊ฒŒ ๋˜๋ฉด ?

-> ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ํƒ€์ž„๋ฆฌํ”„๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์†์„ฑ์ธ th:์†์„ฑ์„ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ! HTML๋กœ๋งŒ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์ฃ , 

๋”ฐ๋ผ์„œ, ์•ž์— ์ถ”๊ฐ€ํ•ด์ค€ ํƒ€์ž„๋ฆฌํ”„ ์†์„ฑ์„ ์ œ์™ธํ•œ ์ˆœ์ˆ˜ HTML ์†์„ฑ์œผ๋กœ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜์—ฌ

-> ์ˆœ์ˆ˜ HTMLํŒŒ์ผ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ž˜ ๋ณด์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„๊ฐ€ ๊ฐ€๋™์ด ๋˜์–ด ํƒ€์ž„๋ฆฌํ”„ ๋ทฐ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด

์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ๋ Œ๋”๋ง ๋˜์–ด ๊ธฐ์กด HTML์˜ ์†์„ฑ์ด ์•„๋‹Œ ํƒ€์ž„๋ฆฌํ”„์˜ ์†์„ฑ์œผ๋กœ ๋Œ€์ฒด๋˜์–ด

๋™์  HTML ํŒŒ์ผ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค. 

 

Thymeleaf์ด์™ธ์— jsp๋ผ๋Š” HTML ์ฝ”๋“œ์— JAVA์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด ๋™์ ์›นํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š”

์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋„๊ตฌ๊ฐ€ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ 

spring boot๋Š” Thymeleaf์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

2.Thymeleaf ์˜ ์ฃผ์š” ๋ชฉํ‘œ๋Š”?

-> ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์šด ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ์ œ๊ณต

-> ์ด๋ฅผ ์œ„ํ•ด *Natural Templates ์˜ ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

-> ์ด๋ฅผ ํ†ตํ•ด ๋””์ž์ธ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ํ–ฅ์ƒ๋˜๊ณ , ๋””์ž์ธ ํŒ€๊ณผ ๊ฐœ๋ฐœ ํŒ€ ๊ฐ„์˜ ๊ฒฉ์ฐจ๊ฐ€ ํ•ด์†Œ๋ฉ๋‹ˆ๋‹ค ! 

 

 

*์„œ๋ฒ„ ์ธก Java ํ…œํ”Œ๋ฆฟ ์—”์ง„
์„œ๋ฒ„์—์„œ DB ํ˜น์€ API์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜๋œ ํ…œํ”Œ๋ฆฟ(Template)์— ๋„ฃ์–ด
HTML ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ค์–ด ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

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

 

*Natural Templates
HTML ์ฒ˜๋Ÿผ ๋ณด์ด๊ณ  HTML ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ! 

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด, Thymeleaf์˜ ๊ถ๊ทน์ ์ธ ๋ชฉ์ ์€
'๊ฐœ๋ฐœ์˜ workflow๋ฅผ natural templates๋กœ ๊ฐ€์ง€๊ณ  ์˜ฌ ์ˆ˜ ์žˆ๋‹ค'๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Thymeleaf ๋ฌธ๋ฒ•์œผ๋กœ ์“ฐ์—ฌ์ง„ HTML templates๋Š” ํ•ญ์ƒ ๋งˆํฌ์—… ์–ธ์–ด ์•ˆ์ชฝ์—
์†์„ฑ์œผ๋กœ ์“ฐ์—ฌ์ง€๊ธฐ ๋•Œ๋ฌธ์— HTML ํŽ˜์ด์ง€์ฒ˜๋Ÿผ ๋ณด์ด๊ณ 
์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š”๋ฐ ๊ทธ๊ฒƒ์„ natural templates๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์ฆ‰, ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ์ˆœ์ˆ˜ HTML์„,
์„œ๋ฒ„๋ฅผ ๊ตฌ๋™ํ•˜๋ฉด ๋™์ ์œผ๋กœ HTML์ด ์ƒ์„ฑ๋œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ,

-> ํƒ€์ž„๋ฆฌํ”„๋Š” ์ˆœ์ˆ˜ HTML์„ ์œ ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— natural templates์œผ๋กœ๋„ ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

3.Thymeleaf ์˜ ์ฃผ์š” ์žฅ์ ์€?

-> ํŽธ๋ฆฌํ•จ ! 

 

ํ…œํ”Œ๋ฆฟ ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ๊ทธ๋ƒฅ html ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ทฐ ํŒŒ์ผ์„ was ์—†์–ด๋„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ๋„์›Œ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ์กด์˜ ํ…œํ”Œ๋ฆฟ์œผ๋กœ๋Š” ํ•ญ์ƒ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™์‹œ์ผœ ๊ฒฐ๊ณผ๋ฌผ์„ ํ™•์ธํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค๋งŒ,

 

ํƒ€์ž„๋ฆฌํ”„์˜ ๊ฒฝ์šฐ static ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋“ฏ ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

-> ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ํƒ€์ž„๋ฆฌํ”„๊ฐ€ HTML์˜ ์†์„ฑ(Attribute)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์—

๊ธฐ์กด์˜ HTML๊ตฌ์กฐ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

 

 

4.Thymeleaf๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ธฐ!

ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ธฐ

 

ํƒ€์ž„๋ฆฌํ”„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”,,

thymeleaf ๋””ํŽœ๋˜์‹œ ์ถ”๊ฐ€

 

1) build.gradle์—  ํ•ด๋‹น ์ค„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

 

 

2) html_ํƒ€์ž„๋ฆฌํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” html ํŒŒ์ผ์—๋„ ํƒ€์ž„๋ฆฌํ”„๋ฅผ ์“ฐ๊ฒ ๋‹ค๊ณ  ์†์„ฑ์œผ๋กœ ์จ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

-> ํƒ€์ž„๋ฆฌํ”„๊ฐ€ HTML์˜ ์†์„ฑ(Attribute)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋•๋ถ„์—, ๊ธฐ์กด์˜ HTML๊ตฌ์กฐ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์ฃ ๐Ÿ˜Š

 

 

 

 

5.Thymeleaf ๋ฌธ๋ฒ•

 

 ๋Œ€๋ถ€๋ถ„์˜ HTML ์†์„ฑ์€ ํƒ€์ž„๋ฆฌํ”„์˜ ์†์„ฑ์œผ๋กœ ์“ฐ์ด๋Š” th:html ์†์„ฑ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

@{ URL ๋งํฌ } - URL ๋งํฌ ํ‘œํ˜„์‹
  • @{ URL ๋งํฌ } : ํƒ€์ž„๋ฆฌํ”„๋Š” URL ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ @{...}๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ)
    th:href="@{/css/bootstrap.min.css}"

 

| ๋ฆฌํ„ฐ๋Ÿด | - ๋ฆฌํ„ฐ๋Ÿด ๋Œ€์ฒด
  • ํƒ€์ž„๋ฆฌํ”„์—์„œ ๋ฌธ์ž์™€ ํ‘œํ˜„์‹ ๋“ฑ์€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋”ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌํ„ฐ๋Ÿด ๋Œ€์ฒด ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋”ํ•˜๊ธฐ ์—†์ด ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ! 
  • ์˜ˆ์‹œ)
    <span th:text="'welcome to our application, ' + ${user.name} + '!' ">
    <span th:text="|welcome to our application, ${user.name}!|">

${ ๋ณ€์ˆ˜๋ช… } - ๋ณ€์ˆ˜ ํ‘œํ˜„์‹
  • ๋ชจ๋ธ์— ํฌํ•จ๋œ ๊ฐ’์ด๋‚˜, ํƒ€์ž„๋ฆฌํ”„ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ ๊ฐ’์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ๋ฒ•์„ ์‚ฌ์šฉ ( item.getPrice() -> item.price )
  • ์˜ˆ์‹œ)
    <td th:text="${item.price}">10000</td> ( 10000 ๋Œ€์‹  item.price ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค. )

 

#{ ๋ณ€์ˆ˜๋ช… } - ์™ธ๋ถ€ ์ž์› ๋ณ€์ˆ˜ ํ‘œํ˜„์‹
  • ๋ฉ”์‹œ์ง€, properties์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์ž์›์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ
  • ์˜ˆ์‹œ)
    th:text="#{member.register}"

 

 

 

 

 

์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ :

 

Thymeleaf

Thymeleaf๋Š” spring MVC์—์„œ ๋ทฐ(View)๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ”ํžˆ ๋ทฐ ํ…œ๋ธ”๋ฆฟ(view template)์œผ๋กœ ๋ถˆ๋ฆฐ๋‹ค.

velog.io

 

 

Spring MVC - ํƒ€์ž„๋ฆฌํ”„(Thymeleaf)์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ •๋ฆฌ

๋”๋ณด๊ธฐ ํƒ€์ž„๋ฆฌํ”„ ๋ฉ”๋‰ด์–ผ ๊ธฐ๋ณธ ๋ฉ”๋‰ด์–ผ https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html Tutorial: Using Thymeleaf 1 Introducing Thymeleaf 1.1 What is Thymeleaf? Thymeleaf is a modern server-side Java template engine for both web a

jddng.tistory.com