MapleStory Cookie With Halo

โœจ UI/๐Ÿ–ค View Templates

[Thymeleaf]ํƒ€์ž„๋ฆฌํ”„ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์‚ฌ์šฉ๋ฒ• ์ด์ •๋ฆฌ

๋‰ด์ด NUEY 2025. 3. 9. 19:45
๋ฐ˜์‘ํ˜•



์ด ํฌ์ŠคํŠธ๋Š” ๋‚ด์šฉ์ด ๊น๋‹ˆ๋‹ค.
๋ฐ”์˜๊ฑฐ๋‚˜ ๋ง›๋ณด๊ธฐ๋งŒ ๋ณด์‹ค ๋ถ„๋“ค์€ ์•„๋ž˜ ํฌ์ŠคํŠธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

2025.03.03 - [โœจ UI/๐Ÿ–ค View Templates] - [Thymeleaf]ํƒ€์ž„๋ฆฌํ”„ ์‚ฌ์šฉ๋ฒ• ๊ฐ„๋‹จ์ •๋ฆฌ

 

 


 

 

  • ์„ ์–ธ
    •  <html xmlns:th="http://www.thymeleaf.org"> ๋งŒ HTMLํŒŒ์ผ์— ์ ์–ด์ฃผ๋ฉด ๋ฐ”๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.
  • text
    • code
    • ๊ฒฐ๊ณผ
    •  <span th:text="${data}"> 
      โ†’ ํƒœ๊ทธ ์†์„ฑ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์น˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ.

    •  [[${data}]] 
      โ†’ ์ปจํ…์ธ  ์•ˆ์—์„œ ์ง์ ‘ ์ถœ๋ ฅ.

    • ํƒ€์ž„๋ฆฌํ”„๋Š” ๋‹ค์Œ ๋‘ ๊ธฐ๋Šฅ ์ œ๊ณตํ•œ๋‹ค.
      • th:text โ†’ th:text

      • [[...]] โ†’ [(...)]


  • Unescape
    • code
      java๋กœ์ง
      thymeleaf
    • ๊ฒฐ๊ณผ
    • escape๋ž€ ์ž๋ฐ”์—์„œ html๋กœ ๋„˜์–ด์˜ฌ ๋•Œ ์•Œ์•„์„œ ํŠน์ˆ˜ ๊ธฐํ˜ธ<, / ๋“ฑ์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
      ๋ฐ˜๋Œ€๋กœ unscape๋ž€ ๊ธฐํ˜ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

      ๐ŸŒž ์ตœ๋Œ€ํ•œ ๊ธฐ๋ณธ์ธ escape๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž. 

    • th:text โ†’ th:utext

    • [[...]] โ†’ [(...)]


  • SpringEL ํ‘œํ˜„์‹
    • ์Šคํ”„๋ง์ด ๋‚ด๋ถ€์—์„œ ๊ฐ์ฒด๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๋ฌธ๋ฒ•์œผ๋กœ ํƒ€์ž„๋ฆฌํ”„๋Š” ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•œ๋‹ค.

    • code
      java
      thymeleaf
    • ๊ฒฐ๊ณผ
    • Object
      • user.username
      • user['username']
      • user.getUsername()

    • List
      • users[0].username
      • users[0]['username']
      • users[0].getUsername()

    • Map
      • userMap['userA'].username
      • userMap['userA']['username']
      • userMap['userA'].getUsername()

    • ์ง€์—ญ๋ณ€์ˆ˜ <div th:with="first=${users[0]}">
      • ์˜ˆ์‹œ
        div ํƒœ๊ทธ์— ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— div ๋ฒ”์œ„ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.


  • ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ฐ์ฒด์™€ ๋‚ ์งœ
    • tutorial
      ๐ŸŒž ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ์ด๋Ÿฐ ๊ฒŒ ์žˆ๋‹ค๋Š” ์ •๋„๋งŒ ์•Œ๊ณ , ํ•„์š”ํ•  ๋•Œ ์ฐพ์•„์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

    • ๋‚ ์งœ ์˜ˆ์‹œ ์ฝ”๋“œ
      java
      thymeleaf


    • ๊ฒฐ๊ณผ
    • ๊ทธ ์™ธ ์ข…๋ฅ˜
      • #message : ๋ฉ”์‹œ์ง€, ๊ตญ์ œํ™” ์ฒ˜๋ฆฌ
      • #uris : URI ์ด์Šค์ผ€์ดํ”„ ์ง€์›
      • #dates : java.util.Date ์„œ์‹ ์ง€์›
      • #calendars : java.util.Calendar ์„œ์‹ ์ง€์›
      • #temporals : ์ž๋ฐ”8 ๋‚ ์งœ ์„œ์‹ ์ง€์›
      • #numbers : ์ˆซ์ž ์„œ์‹ ์ง€์›
      • #strings : ๋ฌธ์ž ๊ด€๋ จ ํŽธ์˜ ๊ธฐ๋Šฅ
      • #objects : ๊ฐ์ฒด ๊ด€๋ จ ๊ธฐ๋Šฅ ์ œ๊ณต
      • #bools : boolean ๊ด€๋ จ ๊ธฐ๋Šฅ ์ œ๊ณต
      • #arrays : ๋ฐฐ์—ด ๊ด€๋ จ ๊ธฐ๋Šฅ ์ œ๊ณต
      • #lists , #sets , #maps : ์ปฌ๋ ‰์…˜ ๊ด€๋ จ ๊ธฐ๋Šฅ ์ œ๊ณต
      • #ids : ์•„์ด๋”” ์ฒ˜๋ฆฌ ๊ด€๋ จ ๊ธฐ๋Šฅ ์ œ๊ณต

  • ํŽธ์˜ ๊ฐ์ฒด
    • ํƒ€์ž„๋ฆฌํ”„์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

    • code
      ๐ŸŒž ํƒ€์ž„๋ฆฌํ”„๊ฐ€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๋ฉด์„œ model์— ๋‹ด์€ session, request ๋“ฑ์„ ๊ธฐ๋ณธ ๊ฐ์ฒด๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
      session์€ ๋ฌด์‹œํ•ด์ฃผ์„ธ์š”
    •  ${param} 
      โ†’ param์ด๋ž€ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

    •  ${@helloBean}
      โ†’ ํ•ด๋‹น ํ•จ์ˆ˜์— ๋‹ด์ง€ ์•Š์€ ๊ฒƒ์ด์–ด๋„ ๋นˆ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•จ์ˆ˜๊นŒ์ง€ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.


  • URL ๋งํฌ  @{๊ฒฝ๋กœ} 
    • code
    • ๊ฒฐ๊ณผ
      ์•„๋ž˜ ์„ค๋ช… ์ฐธ๊ณ 
    • ๋‹จ์ˆœ URL
      @{/hello} โ†’ http://localhost:8080/hello

    • ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ
      @{/hello(param1=${param1}, param2=${param2})} โ†’ http://localhost:8080/hello?param1=data1&param2=data2
    • ๊ฒฝ๋กœ ๋ณ€์ˆ˜(path variable) ์‚ฌ์šฉํ•˜๊ธฐ
      @{/hello/{param1}(param1=${param1}, param2=${param2})}
      โ†’ http://localhost:8080/hello/data1/data2
    • ๊ฒฝ๋กœ ๋ณ€์ˆ˜ + ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ
      @{/hello/{param1}(param1=${param1}, param2=${param2})}
      โ†’ http://localhost:8080/hello/data1?param2=data2


  • ๋ฆฌํ„ฐ๋Ÿด Literal
    • : ์†Œ์Šค ์ฝ”๋“œ์ƒ ๊ณ ์ •๋œ ๊ฐ’์„ ๋งํ•œ๋‹ค.
      โ†’ ํƒ€์ž„๋ฆฌํ”„ th:text=๋ณ€์ˆ˜ ๊ฐ€ ์™€์•ผํ•˜๋Š”๋ฐ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ ์–ด๋„ฃ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      โ€ป ํƒ€์ž„๋ฆฌํ”„์—์„œ ๋ฌธ์ž ๋ฆฌํ„ฐ๋Ÿด์€ ํ•ญ์ƒ ์ž‘์€ ๋”ฐ์˜ดํ‘œ' ๋กœ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค.

    • code
    • ๊ฒฐ๊ณผ
    • ๐ŸŒž ๋ฆฌํ„ฐ๋Ÿด ๋Œ€์ฒด Literal substitutions
      • <span th:text="|hello ${data}|">

      • ์ด๊ฑธ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•  ๊ฒƒ ๊ฐ™๋‹ค. '๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ | ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋‹ค.


  • ์—ฐ์‚ฐ
    • ์ž๋ฐ”์™€ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Œ. HTML์—”ํ‹ฐํ‹ฐ(&gt ๋“ฑ)์„ ์ฃผ์˜.
    • code
    • Elvis ์—ฐ์‚ฐ์ž : null์ฒ˜๋ฆฌ

      • ${nullData}?:์‹คํ–‰์ฝ”๋“œ

    • No-operation : ๋ฐ์ดํ„ฐ๊ฐ€ null์ผ ๊ฒฝ์šฐ, ํƒ€์ž„๋ฆฌํ”„๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
      ${nullData}?: _


  • ์†์„ฑ ๊ฐ’ ์„ค์ •
    • <input type="text" name="mock" th:name="userA" />
      โ†’ ํƒ€์ž„๋ฆฌํ”„๋Š” ๊ธฐ์กด HTLM์˜ ์†์„ฑ์ธ name์„ mock์—์„œ userA๋กœ ์น˜ํ™˜ํ•ด๋ฒ„๋ฆฐ๋‹ค.

    • code
    • ๊ฒฐ๊ณผ
    •  th:classappend="large  โ†’ class="text large"
      • ํด๋ž˜์Šค๋ช… ๋’ค์— ํ•œ์นธ ๋„๊ณ  ์†์„ฑ๋ช…์ด ์ถ”๊ฐ€๋œ๋‹ค.

      • th:attrappend์™€ th:attrprepend๋Š” ์ž˜ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

    •  th:checked="true โ†’ ์ฒดํฌ๋ฐ•์Šค๊ฐ€ checked์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
      •  th:checked="false" โ†’  checked ์†์„ฑ ์ž์ฒด๋ฅผ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.


  • ๋ฐ˜๋ณต
    • code
    • ํ™”๋ฉด

    •  <tr th:each="user : ${users}">  โ†’ for๋ฌธ์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

    • ํƒ€์ž„๋ฆฌํ”„ ์ œ๊ณต ๊ธฐ๋Šฅ Stat
      •  <tr th:each="user, userStat : ${users}">  โ†’ ์ง€์ •ํ•œ ๋ณ€์ˆ˜๋ช… + Stat ์œผ๋กœ ์ƒ๋žตํ•ด๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค. th:each="user : ${users}"

      • index : 0๋ถ€ํ„ฐ์‹œ์ž‘ํ•˜๋Š” ๊ฐ’.

      • count : 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฐ’.

      • size : ์ „์ฒด ์‚ฌ์ด์ฆˆ.

      • even, odd : ํ™€์ˆ˜, ์ง์ˆ˜ (Boolean).

      • first, last : ์ฒ˜์Œ ๋งˆ์ง€๋ง‰ ์—ฌ๋ถ€ (Boolean).

      • current : ํ˜„์žฌ ๊ฐ์ฒด.

  • ์กฐ๊ฑด๋ถ€ ํ‰๊ฐ€  if  unless
    • code
    • ํ™”๋ฉด
    •  <span th:text="'๋ฏธ์„ฑ๋…„์ž'" th:if="${user.age lt 20}"> 
      โ†’ ์ž๋ฐ”์˜ if๋ฌธ๊ณผ ๋™์ผํ•˜๋‹ค.
      lt๋Š” HTML์—”ํ‹ฐํ‹ฐ๋กœ < ์ด๋‹ค.  10๋Œ€์ด๋ฉด <span>ํƒœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

    •  <span th:text="'๋ฏธ์„ฑ๋…„์ž'" th:unless="${user.age ge 20}">
      โ†’ unless๋Š” false์ผ ์‹œ ์‹คํ–‰๋œ๋‹ค.
      ge๋Š” 10 >= 20์€ false์ด๋ฏ€๋กœ ์‹คํ–‰๋œ๋‹ค.


    • ๐ŸŒž th:if์™€ th:unless๋Š” ์กฐ๊ฑด์ด ๋งž์ง€ ์•Š์œผ๋ฉด ํƒœ๊ทธ ์ž์ฒด๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค.
      spanํƒœ๊ทธ ๊ฐฏ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋‹ค.
    •  <td th:switch="${user.age}"> 
      โ†’ java์˜ switch๋ฌธ๊ณผ ๋™์ผํ•˜๋‹ค. 
      ๋‹น์—ฐํžˆ case๋ฌธ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.
      <span th:case="10">10์‚ด</span>
      <span th:case="20">20์‚ด</span>
      <span th:case="*">๊ธฐํƒ€</span>


  • ์ฃผ์„
    • code
    • ๊ฒฐ๊ณผ

      1. HTML์ฃผ์„  <!--  --> 
        โ†’ ๊ฐœ๋ฐœ์ž๋„๊ตฌ์— ํ‘œ๊ธฐ๋œ๋‹ค.

      2. ๐ŸŒžํƒ€์ž„๋ฆฌํ”„ ํŒŒ์„œ ์ฃผ์„  <!--/* -->  ์ฃผ์„์ฒ˜๋ฆฌ ๋จ <!-- */--> 
        โ†’ ๊ฐœ๋ฐœ์ž๋„๊ตฌ์— ํ‘œ๊ธฐ๋˜์ง€ ์•Š๋Š”๋‹ค.
        ์ฃผ์„ ์‚ฌ์ด์˜ ํƒœ๊ทธ๋Š” ๋ Œ๋”๋ง ์‹œ ์ฃผ์„์ฒ˜๋ฆฌ๋œ๋‹ค.

      3. ํƒ€์ž„๋ฆฌํ”„ ํ”„๋กœํ† ํƒ€์ž… ์ฃผ์„  <!--/*/    ํ™”๋ฉด์— ์ถœ๋ ฅ๋จ    /*/--> 
        โ†’ ์ฃผ์„์ด์ง€๋งŒ ๋ Œ๋”๋ง ์‹œ ์‹ค์ œ ํƒœ๊ทธ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์ถœ๋ ฅ๋œ๋‹ค.
        (์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ)


  • ๋ธ”๋ก <th:block> ํƒ€์ž„๋ฆฌํ”„ ์ž์ฒด ํƒœ๊ทธ
    • code
    • ๊ฒฐ๊ณผ
    • <div>ํƒœ๊ทธ๋ฅผ ๋ธ”๋ก์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
      (์›ฌ๋งŒํ•˜๋ฉด ์•ˆ ์“ฐ๋Š” ๊ฒŒ ์ข‹์ง€๋งŒ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€๋” ์žˆ๋‹ค)

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ธ๋ผ์ธ   <script th:inline="javascript"> 
    • code
    • ๊ฒฐ๊ณผ
    • ํƒ€์ž„๋ฆฌํ”„ ์ธ๋ผ์ธ ์‚ฌ์šฉ์ „
      • ํƒ€์ž„๋ฆฌํ”„ ์ธ๋ผ์ธ ์—†์ด ์‚ฌ์šฉํ•˜๋ฉด ์œ„์™€ ๊ฐ™์ด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ๋ณต์žกํ•˜๊ฒŒ ์ ์–ด์•ผ ํ•œ๋‹ค.
      • ๋˜ํ•œ user = BasicController.User()์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ํž˜๋“ค๋‹ค.

    • ํƒ€์ž„๋ฆฌํ”„ ์‚ฌ์šฉ ํ›„
      •  [[${user.username}]];  ์™€ ๊ฐ™์ด ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

      •  /*[[${user.username}]]*/  ๋ Œ๋”๋ง ํ•˜๋ฉด์„œ ์ฃผ์„ ์•ˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‚ด์ถ”๋Ÿด ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

      • user ๋ฐ์ดํ„ฐ๊ฐ€ json์œผ๋กœ ๋ณ€ํ™˜ํ•ด ๋“ค์–ด์˜จ๋‹ค.

    • for๋ฌธ ์‚ฌ์šฉํ•˜๊ธฐ
      •  [# th:each="user, stat : ${users}"]          [/
      • ์ด๋ ‡๊ฒŒ for๋ฌธ์„ ๋Œ๋ฆฌ๋ฉด json์œผ๋กœ ํŽธํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


  • ํ…œํ”Œ๋ฆฟ ์กฐ๊ฐ th:fragment & th:replace
    • code
      footer
      ์ ์šฉํ™”๋ฉด
    • ํ™”๋ฉด
    •  <footer th:fragment="copy">  โ†’ ํ‘ธํ„ฐ๋ช…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    •  <div th:insert="~{template/fragment/footer :: copy}">  โ†’ <div>ํƒœ๊ทธ ์•ˆ์— <footer>ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

    • <div th:replace="~{template/fragment/footer :: copy}">  โ†’ <div>ํƒœ๊ทธ๋ฅผ <footer>ํƒœ๊ทธ๋กœ ๋ฐ”๊ฟ”๋ฒ„๋ฆฐ๋‹ค.

    • footer๋ช…์„ ์ง€์ •ํ•  ๋•Œ param์„ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      <footer th:fragment="copyParam (param1, param2)"> 
      <div th:replace="~{template/fragment/footer :: copyParam ('๋ฐ์ดํ„ฐ1', '๋ฐ์ดํ„ฐ2')}"></div>
    • ๋ถ€๋ถ„ ํฌํ•จ ๋‹จ์ˆœ ํ‘œํ˜„์‹
       <div th:replace="template/fragment/footer :: copy"> 
      โ†’ ~{...} ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์›์น™์ด์ง€๋งŒ ํ…œํ”Œ๋ฆฟ ์กฐ๊ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•˜๋ฉด ์ด ๋ถ€๋ถ„์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.


  • ํ…œํ”Œ๋ฆฟ ๋ ˆ์ด์•„์›ƒ 1
    • ๊ณตํ†ต <head>์— ์‚ฌ์šฉํ•˜๋Š” css, javascript ๊ฐ™์€ ์ •๋ณด๋“ค์ด ์žˆ๋Š”๋ฐ, ๊ฐ ํŽ˜์ด์ง€๋งˆ๋‹ค ์ •๋ณด๋ฅผ ๋” ์ถ”๊ฐ€ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ. 
    • code
      java
    • ํ™”๋ฉด

      1. @GetMapping("layout") โ†’ http://localhost:8080/template/layout ์œผ๋กœ ๊ฐ€๋ฉด layoutMain.html์ด ์—ด๋ ค์•ผ ํ•œ๋‹ค.

      2. <head th:replace="template/layout/base :: common_header(~{::title},~{::link})">
        th:replace๋กœ base.html๋กœ ๊ต์ฒดํ•ด๋ฒ„๋ฆฐ๋‹ค. 
        ์ด ๋•Œ   common_header(~{::title},~{::link}  ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. common_header๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ <title>๊ณผ <link>๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

      3. base.html์—์„œ <headth:fragment="common_header(title,links)">๋กœ ์ „๋‹ฌ๋ฐ›์€ title๊ณผ links๋ฅผ  <th:block th:replace="${links}" /> ๋กœ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


  • ํ…œํ”Œ๋ฆฟ ๋ ˆ์ด์•„์›ƒ 2
    • <html>ํƒœ๊ทธ์— ํƒ€์ž„๋ฆฌํ”„ ์†์„ฑ์„ ๋งŒ๋“ค์–ด ํŽ˜์ด์ง€ ์ž์ฒด๋ฅผ ๊ต์ฒดํ•ด ๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ. ์ค‘๋ณต ํŽ˜์ด์ง€๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
    • ํ™”๋ฉด
    • <html th:fragment="layout (title, content)"
      โ†’ <html> ํƒœ๊ทธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ layout()์ด๋ž€ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

    • <html th:replace="~{template/layoutExtend/layoutFile :: layout(~{::title},~{::section})}"
      โ†’ layoutFile์„ ๊ฐ€์ ธ์™€ ๊ต์ฒดํ•˜๊ณ  layout์ด๋ž€ ์ด๋ฆ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.



โ€ป ์ฐธ์กฐ : https://www.inflearn.com/roadmaps/373E

๋ฐ˜์‘ํ˜•