Handlebars.js: ํ•ธ๋“ค๋ฐ”๊ฐ€ ํ…Œ์ด๋ธ”์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

์— ๋งŒ๋“  2013๋…„ 08์›” 15์ผ  ยท  37์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: handlebars-lang/handlebars.js

http://jsfiddle.net/cwYhN/3/

ํ…Œ์ด๋ธ” ์™ธ๋ถ€์—์„œ ๋™์ผํ•œ ํ•ธ๋“ค๋ฐ” #each๊ฐ€ ์„ฑ๊ณตํ•จ์„ ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค. ๋‚ด jsfiddle์—๋Š” ์ด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋‘ ๊ฐœ์˜ ๊ฒฝ๊ณ„ ์ถœ๋ ฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ๊ฝค ์˜ค๋ž˜๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ตœ๊ทผ์— Sendgrid์˜ ์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ ํŽธ์ง‘๊ธฐ๊ฐ€ ์ด๋Ÿฌํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š์•„ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ Google์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ HTML ์ฃผ์„์— ํ•ธ๋“ค๋ฐ” ์ฝ”๋“œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

<table >
  <tbody>
    <!-- {{#each items}} -->
    <tr>
      <td>{{this.key}}</td>
      <td>{{this.value}}</td>
    </tr>
    <!-- {{/each}} -->
  </tbody>
</table>

๋‹ค์Œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

<table>
  <tbody>
    <!--  -->
    <tr>
      <td>my key</td>
      <td>my value</td>
    </tr>
    <!--  -->
    <!--  -->
    <tr>
      <td>my key 2</td>
      <td>my value 2</td>
    </tr>
    <!--  -->
  </tbody>
<table>

(์ฐธ๊ณ : Sendgrid์˜ ํ…œํ”Œ๋ฆฟ ํŽธ์ง‘๊ธฐ์—์„œ๋งŒ ์ง์ ‘ ํ•ธ๋“ค๋ฐ”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.)

๋ชจ๋“  37 ๋Œ“๊ธ€

๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— {{each}} ํƒœ๊ทธ๊ฐ€ ํ…Œ์ด๋ธ” ์™ธ๋ถ€์— ๋ฐฐ์น˜๋˜๋ฉด ๋‹ค๋ฅธ ํƒœ๊ทธ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌผ๋ก  ํ…Œ์ด๋ธ”์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ณต์ œํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ์ขํžˆ๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

http://jsfiddle.net/cwYhN/6/

์ด๊ฒƒ์€ jQuery๋‚˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค... console.log(frag); ํ•˜๋ฉด ํ•ธ๋“ค๋ฐ”๋กœ ์ปดํŒŒ์ผ์„ ์‹œ๋„ํ•˜๊ธฐ ์ „์—๋„ {{#each}} ๋„์šฐ๋ฏธ๊ฐ€ ํ…Œ์ด๋ธ” ์™ธ๋ถ€๋กœ ํ‘ธ์‹œ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ...

ํ…œํ”Œ๋ฆฟ์„ <script type="text/x-handlebars-template"></script> ํƒœ๊ทธ ์•ˆ์— ๋„ฃ๋„๋ก jsfiddle์„ ์—…๋ฐ์ดํŠธํ–ˆ๋Š”๋ฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

http://jsfiddle.net/doowb/6GdPy/1/

๋„ค, ์ €๋Š” ๋ฐฉ๊ธˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.
http://jsfiddle.net/cwYhN/10/

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ jquery ๊ฒฐํ•จ์ด ์•„๋‹ˆ๋ผ ์œ ํšจํ•˜์ง€ ์•Š์€ html๋กœ ๊ฐ„์ฃผ๋˜๋Š” ๊ฒƒ์„ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, jQuery๊ฐ€ ํ˜ธ์ถœํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด jQuery๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ์ธ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“ , tbody ์™€ tr ์‚ฌ์ด์˜ {{ }} ๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

<table>
  <tbody handlebars="{{each}}">
    ... these get iterated ...
  </tbody>
</table>

์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ค‘์š”ํ•œ ๊ฐ ๋ฌธ์žฅ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์†ํ•œ ๋‹ซ๋Š” ํƒœ๊ทธ(/tbody)๋ฅผ ํ”ผ๊ธฐ๋ฐฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์ด ์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด HTML ํŒŒ์„œ๋Š” ํ•ธ๋“ค๋ฐ” ๋งˆํฌ์—…์œผ๋กœ ์ธํ•ด ํ˜ผ๋™๋˜์–ด ํ•ธ๋“ค๋ฐ” ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๊ณ  ํ•˜๋Š” DOM ๊ตฌ์กฐ๋กœ ์ด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

            {{#each activity}}

            {{/each}}
        <table style="border:1px solid #ccc;">
        <thead>
            <tr><th>Month</th>
            <th>Imps</th>
            <th>Clicks</th>
            <th>Spend</th>
        </tr></thead>
        <tbody><tr>
                <th>{{month}}</th>
                <td>{{impressions}}</td><td>{{clicks}}</td><td>{{spend}}</td>
            </tr></tbody>
    </table>

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์œ„์˜ ์Šคํฌ๋ฆฝํŠธ ๋™์ž‘, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ์ž์—ด ๋˜๋Š” ์‚ฌ์ „ ์ปดํŒŒ์ผ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์€ ํ•ธ๋“ค๋ฐ” ์ž์ฒด์˜ ๋ฒ„๊ทธ๋ณด๋‹ค ๋ธŒ๋ผ์šฐ์ € ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

{{#each}}๊ฐ€ ํ…Œ์ด๋ธ”์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ธฐ ์ „์— ๋ฐ˜๋‚˜์ ˆ์„ ๋‚ญ๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‹จ์ˆœํžˆ ๋ฌธ์„œ์— ๋ช…์‹œ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ •๋ง ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ๊ฐ์€ ์ œ๋Œ€๋กœ ๋กœ๋“œ๋˜๋ฉด ํ…Œ์ด๋ธ”์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์„ ์–ด๋–ป๊ฒŒ ๋กœ๋“œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@preichelt ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ…Œ์ด๋ธ”์—์„œ {{#each}}๋ฅผ ์—‰๋ง์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ ๋‚ด์—์„œ ํ•ธ๋“ค๋ฐ”๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

http://stackoverflow.com/questions/15386276/why-should-we-wrap-our-templates-inside-script-blocks

์ด ๋ฒ„๊ทธ๋Š” ๋‚ด ์ธ์ƒ์˜ ๋‘ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ–ˆ๊ณ  ์ง€๊ธˆ์€ ํ† ์š”์ผ ์˜คํ›„ 10์‹œ 30๋ถ„์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•  ๋•Œ๊นŒ์ง€ ์ด ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ๋ฌด์‹ค์—์„œ ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  [Official Block Doc]
(http://handlebarsjs.com/builtin_helpers.html) ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์•„๋ฌด ๋ง๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•ธ๋“ค๋ฐ”์˜ ์ž˜๋ชป์ด ์•„๋‹ˆ๋ผ HTML ์ž‘๋™ ๋ฐฉ์‹์„ ๋ชจ๋ฅด๋Š” ๊ท€ํ•˜ ์˜ ์ž˜๋ชป์ž…๋‹ˆ๋‹ค. https://html.spec.whatwg.org/multipage/syntax.html#an -introduction-to-error - ํŒŒ์„œ์—์„œ ์ฒ˜๋ฆฌ ๋ฐ ์ด์ƒํ•œ ๊ฒฝ์šฐ

๋”ฐ๋ผ์„œ Handlebarsjs๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด HTML ํŒŒ์„œ์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ฌธ์„œ์˜ ๋ช…ํ™•์„ฑ์˜ ์ž˜๋ชป์ด ์•„๋‹ˆ๋ผ _์‚ฌ์šฉ์ž์˜ ์ž˜๋ชป_์ž…๋‹ˆ๊นŒ? ์ด ๊ฐ€์ •์€ ๋ง์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ๋ฌด๊ฒ๊ณ  ๋ณต์žกํ•œ ํ…œํ”Œ๋ฆฟ ์—”์ง„์ธ Angularjs๋Š” Html ํ˜ธํ™˜ ๊ตฌ๋ฌธ์„ ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ…Œ์ด๋ธ”์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<tr ng-repeat="dto in tableData">

๊ทธ๋ฆฌ๊ณ  Angularjs๋Š” Html ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฃจํ”„์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

<!-- ngRepeat: column in row -->
<tr ng-repeat="dto in tableData">

Angualrjs๋Š” Html์˜ ๊ตฌ๋ฌธ์„ ์ตœ๋Œ€ํ•œ ์กด์ค‘ํ•˜๊ณ  ๋”ฐ๋ฅด๊ณ  ๊ฐ€์ •์„ ์„ฑ๊ณต์ ์œผ๋กœ ํ”ผํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Handlebarsjs์˜ ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ์€ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฏ€๋กœ Html ํŒŒ์„œ ๋ฌธ์ œ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฌธ์ œ๋ฅผ ์˜†์—์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ์™€ ์ „ ์„ธ๊ณ„์˜ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ์ •๋ง๋กœ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ธ์‹ํ•˜๋„๋ก ์•Œ๋ฆด _์˜๋ฌด_๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์–ด์จŒ๋“ , ๋‚˜๋Š” ๋ฌธ์„œ ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹๊ฒƒ์ž…๋‹ˆ๋‹ค. _ ๋‚˜๋Š”์ด ๋‘ํ†ต ๋ฌธ์ œ๋ฅผ ์ฒ˜์Œ ์ ‘ํ•œ ์‚ฌ๋žŒ์ด ์•„๋‹ˆ๋ฉฐ ๋งˆ์ง€๋ง‰ ๋ฌธ์ œ๋„ ์•„๋‹ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. _

Angular๋Š” DOM์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ DOM์„ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ํ•ธ๋“ค๋ฐ”๋Š” ๋ฌธ์ž์—ด๋กœ๋งŒ ์ž‘๋™ํ•˜๋ฉฐ DOM ๊ฐœ๋…์ด ์—†์Šต๋‹ˆ๋‹ค.

@profullstack : @stevenvachon์ด ๋งํ–ˆ๋“ฏ์ด ํ•ธ๋“ค๋ฐ”๋Š” HTML์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ํ…์ŠคํŠธ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์˜ˆ์ œ๊ฐ€ HTML์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„œ์—์„œ๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ฐœ์ธ์ ์œผ๋กœ ๋งˆํฌ ๋‹ค์šด์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค ...

๋ฌธ์„œ์— ์–ด๋–ค ์ข…๋ฅ˜์˜ ํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ–ˆ๋Š”์ง€ ๋ง์”€ํ•ด ์ฃผ์‹œ๋ฉด ๊ธฐ๊บผ์ด ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์ง€์นจ( <script> -tag๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„ ํฌํ•จ)์€ ์ด๋ฏธ http://handlebarsjs.com/ ์˜ ๊ธฐ๋ณธ ํŽ˜์ด์ง€์—

@profullstack ๋‚˜๋Š” ๋‹น์‹ ์ด "์‹œ๊ฐ„ ๋‚ญ๋น„"๋ฅผ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ขŒ์ ˆ๊ฐ์„ ๋Š๋‚€๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ, ์ œ ์ƒ๊ฐ์—๋Š” ๋‹น์‹ ์€ ์ด๊ฒƒ์„ ์™„์ „ํžˆ ๊ฑฐ๊พธ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ง์ ‘ ์™€์„œ ์ด๋Ÿฐ ์–ด์กฐ๋กœ ๋Œ“๊ธ€์„ ์“ฐ๋Š” ๊ฒƒ์€ ์›ํ•˜๋Š” ํšจ๊ณผ์™€ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๋จผ์ € ๋ง์”€๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ๋‹น๊ทผ ๋Œ€ ์ฑ„์ฐ, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‹น์‹ ์„ ์œ„ํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•ด ์ฃผ๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ์นœ์ ˆํ•˜๊ฒŒ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๋” ๋‚˜์€ PR์„ ์˜ฌ๋ฆฌ๊ณ  ์Šค์Šค๋กœํ•˜์‹ญ์‹œ์˜ค.

@ErisDS ์กฐ์–ธ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ฒซ ๋ฒˆ์งธ ์˜๊ฒฌ์ด ๋„ˆ๋ฌด ๊ฐ•๋ ฅํ–ˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ท€ํ•˜์˜ ๋ง์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

to try to making other developers lives easier

๊ทธ๋ฆฌ๊ณ  ์™œ Handlebarsjs๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Angularjs๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๊นŒ? _ ๋‚˜๋Š” Handlebarsjs๊ฐ€ Angularjs๋ณด๋‹ค ๋‚ด ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ค„ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค._
๋”ฐ๋ผ์„œ ์ˆ˜์ฒœ ๋ช…์˜ ์˜คํ”ˆ ์†Œ์Šค ์‚ฌ์šฉ์ž๊ฐ€ "๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์˜ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š”" ๋‹น์‹ ์˜ ์˜์ง€์— ๋ฐ˜ํ•˜๋Š” ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๋ช…์„œ์— ์ฃผ์˜ ์‚ฌํ•ญ์„ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
์„์œ„ํ•œ:

No open source project nor contributor has any duty to you.

๊ทธ๋ž˜ ๊ทธ๊ฑด ์‚ฌ์‹ค์ด์•ผ. ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์„ฑ์žฅํ•˜๋ฉด ํ”„๋กœ์ ํŠธ์— ๋” ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ๋งˆ์Œ์„ ํ• ์• ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์‚ฌ๋ž‘ํ•˜๊ฒŒ ๋˜๋ฉฐ ์„ธ์ƒ๊ณผ ๊ณต์œ ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ _์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๊ด€์‹ฌ_๊ณผ _๋ฌธ์„œ์— ๋Œ€ํ•œ ๊ด€์‹ฌ_์„ ์‹œ์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Handlebarsjs๋Š” ์ด ๋‹จ๊ณ„์— ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ์€ ์ž‘์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ํ•œ๊ตญ, ์ค‘๊ตญ ๋“ฑ ์ „ ์„ธ๊ณ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์ธ๊ธฐ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, Github์˜ ๋Œ€๋ถ€๋ถ„์˜ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ์™€ README.md ํŒŒ์ผ์„ ์ž๋ž‘์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉฐ ์ ์  ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ๋„๊ตฌ์™€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋งŒ์•ฝ:

  • ์˜คํ”ˆ ์†Œ์Šค ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‚˜๋Š”์ด ๋ฌธ์ œ๋ฅผ ์ ‘ํ•  ๋งˆ์ง€๋ง‰ ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค
    ์ฒซ ๋ฒˆ์งธ ๋Œ“๊ธ€์˜ ๊ธฐ์ˆ ์  ๋ถ„์„๊ณผ ์ด ๋Œ“๊ธ€์˜ ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ํ† ๋ก ์„ ์™„์ „ํžˆ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๊ฒŒ๋‹ค๊ฐ€ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋Š” ๋‹น์‹ ์ด ์„ธ์ƒ์— ์ฃผ๋Š” _์ž์„ _๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹น์‹ ๊ณผ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ ์‚ฌ์ด์˜ _์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋ธŒ๋ฆฌ์ง€_์ž…๋‹ˆ๋‹ค.

@nknapp ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์ œ ์ฒซ ๋Œ“๊ธ€์ด ๋„ˆ๋ฌด ๊ฐ•ํ•ด์„œ ๊ทธ๋Ÿฐ ์ ๊ณผ ์ œ ๋Œ“๊ธ€์„ ์ฝ์–ด์ฃผ์‹  ๋ถ„๋“ค๊ป˜ ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
์ฒซ๋ˆˆ์— ํ•ธ๋“ค๋ฐ”๋Š” _ํ…์ŠคํŠธ ๋Œ€์ฒด ๋„๊ตฌ_์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋ฉฐ ์ดํ•ดํ•˜๊ธฐ ์ •๋ง ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์“ธ ๋•Œ :

{{#each myListData}}
                        <tr>{{name}}</tr>
{{/each}}

๋‹จ์ˆœํ•œ ๊ต์ฒด๋ผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

<tr>nameA</tr>
<tr>nameB</tr>

๊ทธ๋Ÿฌ๋‚˜ HTML์„ ์ ‘ํ–ˆ์„ ๋•Œ, ๊ทธ๊ฒƒ์€ ๋ญ”๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ณธ์„ฑ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ "๊ฐ ๋ธ”๋ก ๋„์šฐ๋ฏธ" ์„น์…˜ ์•„๋ž˜์—๋Š” ํ•œ ๋ฌธ์žฅ์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

WARNING: please use script block when you try to use #each block inside table, due to the know issue of [How HTML parse works(thanks for <strong i="18">@stevenvachon</strong>'s reference](https://html.spec.whatwg.org/multipage/syntax.html#an-introduction-to-error-handling-and-strange-cases-in-the-parser)

์˜๊ฒฌ์„ ๊ณต์œ ํ•ด ์ฃผ์‹œ๋ฉด ์ •๋ง ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด #each -helper์™€ ์•„๋ฌด ๊ด€๋ จ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ HTML์— ์ง์ ‘ ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ง„์ˆ ์€ ๋ฉ”์ธ ํŽ˜์ด์ง€์— ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์งˆ๋ฌธ์€: ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ฝ์—ˆ์Šต๋‹ˆ๊นŒ?

๋ฐฉ๋ฌธ ํŽ˜์ด์ง€์˜ ์˜ˆ ์•„๋ž˜์— ๊ท€ํ•˜์™€ ๊ฐ™์€ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ฐธ๊ณ  ์‚ฌํ•ญ:

ํ”„๋กœ๋•์…˜์—์„œ๋Š” ์Šคํฌ๋ฆฝํŠธ ๋ธ”๋ก ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  Webpack์ด๋‚˜ ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…œํ”Œ๋ฆฟ์„ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

@nknapp ๋„ค, ๊ท€ํ•˜์˜ ์˜๊ฒฌ์ด ๋งž๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์„ HTML์— ์ง์ ‘ ์ž‘์„ฑํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋žœ๋”ฉ ํŽ˜์ด์ง€์—์„œ ์ฒซ ๋ฒˆ์งธ "์‹œ์ž‘ํ•˜๊ธฐ" ์„น์…˜์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์˜ˆ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ ์•„๋ž˜ ํšŒ์ƒ‰ ๋ธ”๋ก์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

You **can** deliver a template to the browser by including it in a <script> tag.

์—๊ฒŒ

You **should always** deliver a template to the browser by including it in a <script> tag.

๋‚˜๋Š” ๋‹น์‹ ์˜ ์ œ์•ˆ์„ ์ถ”์ธกํ•ฉ๋‹ˆ๋‹ค :

**never** write a template directly into HTML

๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด๋ฅผ ๋”ฐ๋ฅด๊ณ  ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋žœ๋”ฉ ํŽ˜์ด์ง€์— ๊ฒŒ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์ƒ๊ฐ์ธ ๊ฒƒ ๊ฐ™์•„์š”, ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

<script type="text/x-handlebars">
  {{#each list as |item|}}
    <td>{{item}}</td>
  {{/each}}
</script>

@stevenvachon ์˜ˆ, ๊ท€ํ•˜์˜ ์˜ˆ์ œ์—์„œ๋Š” ์Šคํฌ๋ฆฝํŠธ ์•ˆ์— ํ…œํ”Œ๋ฆฟ์„ ๋„ฃ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฅผ ๋” ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ œ์•ˆ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํ˜น์‹œ:

๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๋•์…˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ํŒŒ์„œ ๋ฐ ๋ฌธ์ž์—ด ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „ ์ปดํŒŒ์ผ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

@stevenvachon ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ HTML ํŒŒ์„œ ๋งํฌ๋ฅผ ๊ท€ํ•˜์˜ ์˜๊ฒฌ๊ณผ ํ•จ๊ป˜ ๋„ฃ์œผ๋ฉด ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๋•์…˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ํŒŒ์„œ ๋ฐ ๋ฌธ์ž์—ด ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „ ์ปดํŒŒ์ผ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ํ…œํ”Œ๋ฆฟ์„ HTML์— ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ช‡ ๊ฐ€์ง€ ์•Œ๋ ค์ง„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด #each ๋ธ”๋ก ๋„์šฐ๋ฏธ๋Š” HTML ํŒŒ์„œ์˜ ์ž‘๋™ ๋ฐฉ์‹ ์œผ๋กœ ์ธํ•ด ํ…Œ์ด๋ธ” โ€‹โ€‹๋‚ด์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

์•„๋งˆ๋„

  1. <script> -tag ์˜ˆ์‹œ ๋ฐ”๋กœ ์•„๋ž˜

ํ…œํ”Œ๋ฆฟ์„ <script> -tag ์•ˆ์— ๋„ฃ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. HTML์— ์ง์ ‘ ๋„ฃ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด HTML ํŒŒ์„œ๊ฐ€ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ : ํ…Œ์ด๋ธ”์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ ).

  1. ์‚ฌ์ „ ์ปดํŒŒ์ผ์— ๋Œ€ํ•œ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ๋ฅผ ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ”„๋กœ๋•์…˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์„ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. [...]

์‚ฌ์‹ค ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋” ์ด์ƒ ๋ธŒ๋ผ์šฐ์ €์—์„œ Handlebars๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(Angular ๋ฐ React๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Vue ๋ฐ Ractive). ์ด ๋น„๋””์˜ค ๋Š” ๊ฝค ๋ฉ‹์ง€๊ณ  ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค ...

์ €๋Š” ํ•ธ๋“ค๋ฐ”๋ฅผ ์„œ๋ฒ„์™€ ์ •์  ํŽ˜์ด์ง€ ์ƒ์„ฑ๊ธฐ๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์˜ ๊ฒฝ์šฐ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@nknapp ๋‚˜๋Š” ์“ฐ๊ธฐ ์‹œ์ž‘ ํ•ธ๋“ค-HTML ํŒŒ์„œ๋ฅผ VDOMs์„ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €๋กœ ๊ฐ€์ ธ์— ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ €ํ•ญ์„ ๋งŒ๋‚ฌ๋‹ค .

@nknapp ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ…œํ”Œ๋ฆฟ์„ ๋‚ด๋ถ€์— ๋„ฃ๋Š” ๊ฒƒ์˜ ์ค‘์š”์„ฑ

@profullstack ์ €๋Š” ์ด ํ”„๋กœ์ ํŠธ์˜ ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

@nknapp ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ๋ถ„๋“ค์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ณ€ํ™”๋กœ ํ˜œํƒ์„ ๋ฐ›์„ ๊ฑฐ๋ผ ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ๊ฝค ์˜ค๋ž˜๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ตœ๊ทผ์— Sendgrid์˜ ์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ ํŽธ์ง‘๊ธฐ๊ฐ€ ์ด๋Ÿฌํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š์•„ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ Google์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ HTML ์ฃผ์„์— ํ•ธ๋“ค๋ฐ” ์ฝ”๋“œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

<table >
  <tbody>
    <!-- {{#each items}} -->
    <tr>
      <td>{{this.key}}</td>
      <td>{{this.value}}</td>
    </tr>
    <!-- {{/each}} -->
  </tbody>
</table>

๋‹ค์Œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

<table>
  <tbody>
    <!--  -->
    <tr>
      <td>my key</td>
      <td>my value</td>
    </tr>
    <!--  -->
    <!--  -->
    <tr>
      <td>my key 2</td>
      <td>my value 2</td>
    </tr>
    <!--  -->
  </tbody>
<table>

(์ฐธ๊ณ : Sendgrid์˜ ํ…œํ”Œ๋ฆฟ ํŽธ์ง‘๊ธฐ์—์„œ๋งŒ ์ง์ ‘ ํ•ธ๋“ค๋ฐ”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.)

@gurpreetatwal ํŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. SendGrid์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ •๋ณด๋กœ ์˜ค๋Š˜ ์ €๋… ๋””๋ฒ„๊น… ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค!

@gurpreetatwal ๊ทผ๋ฐ ์™œ?

@Lazarencjusz ์ˆ˜์ •์ด ์ž‘๋™ํ•˜๋Š” ์ด์œ  ๋˜๋Š” SendGrid ์ด๋ฉ”์ผ ํ…œํ”Œ๋ฆฟ ํŽธ์ง‘๊ธฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”! ํ…Œ์ด๋ธ” ๋Œ€์‹  div ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ๋ชจ๋“  ํ…Œ์ด๋ธ” ์š”์†Œ๋ฅผ div์— ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

@gurpreetatwal ์˜ ์†”๋ฃจ์…˜์€ ํ•ธ๋“ค๋ฐ”์šฉ Mailchimp/Mandrills ํ…œํ”Œ๋ฆฟ์—์„œ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ์ˆ˜๊ณ ๋ฅผ ๋œ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰