Mustache.js: ์ƒ์œ„ ๋ฒ”์œ„ ์•ก์„ธ์Šค

์— ๋งŒ๋“  2014๋…„ 12์›” 11์ผ  ยท  18์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: janl/mustache.js

์ƒ์œ„ ๋ฒ”์œ„ ์•ก์„ธ์Šค

๊ณ ๋ คํ•˜๋ฉด :

node = {
  id: 1,
  children : [
      { id : 2 },
      { id : 3 }
  ]
}

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ํ…œํ”Œ๋ฆฟ:

{{ id }} {# will output node.id #}
{{#children}}
    {{children.id}}  {# will output node.children[i].id #}
    {{id}}  {# will also output node.children[i].id #}
{{/children}}

์žˆ๋Š” ๊ทธ๋Œ€๋กœ, ๋•Œ๋•Œ๋กœ ์ƒ์œ„ ์†์„ฑ์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ์ค‘์ฒฉ ๋…ธ๋“œ ๋ชจ๋ธ์—์„œ).
์ƒ์œ„ ๋ฒ”์œ„๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด "../"๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „ :

{{ id }} {# will output node.id #}
{{#children}}
    {{children.id}}  {# will output node.children[i].id #}
    {{id}}  {# will also output node.children[i].id #}
    {{ ../id }}  {# will output node.id #}
{{/children}}

์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

  Context.prototype.lookup = function (name) {
    var cache = this.cache;

    var value;
    if (name in cache) {
      console.log(name + ' found');
      value = cache[name];
    } else {
      var context = this, names, index;

      while (context) {
        if (name.indexOf('.') > 0) {
          value = context.view;
          names = name.split('.');
          index = 0;

          while (value != null && index < names.length)
            value = value[names[index++]];
        } else if(name.match(/^\.\.\//)) {
          name = name.replace(/^\.\.\//, '');
        } else {
          value = context.view[name];
        }

        if (value != null)
          break;

        context = context.parent;
      }

      cache[name] = value;
    }

    if (isFunction(value))
      value = value.call(this.view);

    return value;
  };
Future Plugin

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

์˜ค๋ฅธ์ชฝ. ํ•ธ๋“ค๋ฐ”๋ฅผ ๊นŒ๋งฃ๊ฒŒ ์žŠ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ธ๋“ค๋ฐ”์— ์‚ฌ์šฉ์ž๋ฅผ ์žƒ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋Š” ๋””์ž์ธ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ mustache ์˜ ์‚ฌ์–‘์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์—†๋‚˜์š”? ์ „์—๋Š” ์•„๋ฌด๋„ ์ด ์ œํ•œ ์‚ฌํ•ญ์— ๋ถ€๋”ชํžˆ์ง€ ์•Š์•˜๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž์Šต๋‹ˆ๋‹ค.

๋ถ€๋ชจ ๋ฒ”์œ„์— ์žˆ๋Š” ํ•ญ๋ชฉ์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์˜ ์‹ค์šฉ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ•ญ์ƒ ๋ชจํ˜ธํ•œ ์†์„ฑ ์ด๋ฆ„์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ข…์ข… ์ด์ƒํ•œ ๋ฌผ์ฒด๋ฅผ ์ดˆ๋ž˜ํ•˜์ง€๋งŒ ์˜ค๋žซ๋™์•ˆ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ํ•ธ๋“ค ๋ฐ”์— ๋Œ€ํ•œ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜์ž๋ฉด, ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด ์–ฝํžŒ ์ƒ์œ„ ๋ฒ”์œ„ ํ•ด๊ฒฐ์„ ๋งŒ๋“ค๋„๋ก ์œ ํ˜นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. {{../../../id}} ๋Š” {{movieId}} ๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ํ›จ์”ฌ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

"../"๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ์„ ์ˆ˜ ์—†๊ฒŒ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ caml์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋กœ์ปฌ ๋ฒ”์œ„์—์„œ caml์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, ๋ถ€๋ชจ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค์›Œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” Mustache ์ฒ ํ•™์„ ์กด์ค‘ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•˜๋ฉด ๋””๋ ‰ํ† ๋ฆฌ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•˜๊ณ  ๋” ๋‚˜์€ ์•„์ด๋””์–ด๋ฅผ ์–ป์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๋ชจํ˜ธํ•œ ์†์„ฑ ์ด๋ฆ„์„ ํ”ผํ•˜๋ฉด ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ์žฅํ™ฉํ•œ ํ…œํ”Œ๋ฆฟ์ด ์ƒ๊น๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด ์ด ๊ธฐ๋Šฅ์„ ์ข‹์•„ํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด mustache.js ์˜ ๋‚ด๋ถ€ ๋™์ž‘์„ ์ˆ˜์ •ํ•˜๋Š” ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ผ์ข…์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‚˜ ํ”„๋ผ๊ทธ๋งˆ๋ฅผ ํ†ตํ•˜์ง€ ์•Š๋Š” ํ•œ ์ด๋Ÿฐ ์ผ์ด ์‹ค์ œ๋กœ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ API๋Š” ์ง€๊ธˆ ๋‹น์žฅ์€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•ด ์ข€ ๋” ์ƒ๊ฐํ•ด๋ดค๋Š”๋ฐ...

Mustache์˜ ์ฒ ํ•™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋Ÿฌ์— _์žˆ๋Š” ๊ทธ๋Œ€๋กœ_ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ์— '์ค€๋น„'ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋…ธ๋“œ์— parentId ์†์„ฑ์ด ์ƒ๊น๋‹ˆ๋‹ค.

๋˜ํ•œ ๋” ์ž์„ธํ•œ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ์„ ์ฝ๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

{{ id }}
{{#children}}
    {{children.id}}
    {{id}}
{{/children}}

์ „ vs ํ›„

{{ nodeId }}
{{#children}}
    {{ nodeId }}
    {{ parentId }}
{{/children}}

๊ด€๋ จ: http://stackoverflow.com/questions/4067093/mustache-read-variables-from-parent-section-in-child-section

( @bobthecow ๋ฅผ

์ด๋ฏธ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ํ…œํ”Œ๋ฆฟ์— ํ‘œ์‹œ๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ ๊ฐœ์ฒด {node: ... } ๋กœ ๋ž˜ํ•‘ํ•˜๊ณ  ํ…œํ”Œ๋ฆฟ์„ {{#node}}...{{/node}} ๋ž˜ํ•‘ํ•œ ๋‹ค์Œ {{node.id}} ๋ถ€๋ถ„์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ to_html() ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋‘ "JIT"๋ฅผ ๋ชจ๋‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒจ์น˜ ์›Œํฌ ์–ด๋ผ์šด๋“œ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ๋˜ํ•œ ์™ธ๋ถ€ ๋ ˆ์ด์–ด์— ๋Œ€ํ•œ ๋ด‰ํˆฌ ๋žฉ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ˆœํ•œ 2-๋ ˆ๋ฒจ ๋ชจ๋ธ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋ธ์ด ๋” ๊นŠ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์ €๊ธ€๋ง ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค.

ํ•˜์œ„ ๋ฐ์ดํ„ฐ ๊ณ„์ธต์—์„œ ์–ป์€ ๋ชจ๋ธ์„ ๋ฐ”์ธ๋”ฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ๋Š”๋ฐ ์ธํ”„๋ผ์—์„œ ์–ป์€ ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ๋ชจ๋ธ์„ ์ œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ œ ์ผ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋ธ์„ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์™„์ „ํžˆ ์žฌ๊ท€์ ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ redable property names ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ํ˜„์‹ค์— ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งž์ง€ ์•Š๋Š”๋‹ค...
์˜ˆ, ์‚ฌ์‹ค, ํ…œํ”Œ๋ฆฟ๊ณผ ๋ชจ๋ธ์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ตฌ์ฒด์ ์ธ ๋ชจ๋ธ ๊ทœ์น™๊ณผ ๊ฒฐํ•ฉ๋˜์ง€ ์•Š์€ ํ…œํ”Œ๋ฆฟ์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ํ…œํ”Œ๋ฆฟ์€ ์ •์˜์— ๋”ฐ๋ผ ์ •์˜๋œ ๋ชจ๋ธ์„ ๋ Œ๋”๋งํ•˜๋„๋ก ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
๋˜ ๋‹ค๋ฅธ ๋ ˆ์ด์–ด๋Š” ์ •์˜ ๋ ˆ์ด์–ด๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋’ค๋กœ ์ด๋™ํ•˜๊ณ  ๋ฒˆ์—ญ ๋ ˆ์ด์–ด๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.

IMHO, ๋‚˜๋Š” ๋„๊ตฌ๊ฐ€ ๋…๋‹จ์ ์ธ ๊ทœ์น™์„ ๋ถ€๊ณผํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์„ ํƒ์„ ๋งก๊ฒจ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

๋…์ž๋ฅผ ์œ„ํ•ด @rndme ๊ฐ€ ์ œ์•ˆํ•˜๋Š”

const Mustache = require('mustache')

var view = {
  node: {
    id: 5,
    children: [ { id: 6 }, { id: 7 } ]
  }
}

const template = `
{{#node}}
  children:
  {{#children}}

    id: {{ id }}
    parentId: {{ node.id }}
  {{/children}}
{{/node}}
`

const output = Mustache.render(template, view)
console.log(output)

  children:

    id: 6
    parentId: 5

    id: 7
    parentId: 5

๋‹ค์Œ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋ฉด latest ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ _์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค_, imo.

const template = `
  children:
  {{#node.children}}

    id: {{ id }}
    parentId: {{ node.id }}
  {{/node.children}}
`

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

Afaik, Mustache ์ฒ ํ•™์€ ํ•ญ์ƒ ํ…œํ”Œ๋ฆฟ์— ์ „๋‹ฌ๋˜๋Š” ๋ณด๊ธฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋ธ์„ ์ง์ ‘ ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@osher ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ํŒ/๋น„๋ฒ•์œผ๋กœ๋Š” ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์˜ˆ๋ฅผ ๋ณด์—ฌ ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚˜์ค‘์— ์Šค๋‹ˆํŽซ์„ ์ œ๊ณตํ•˜๋ ค๊ณ  ํ•˜๊ฒ ์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ - 3๊ฐœ ๋ ˆ๋ฒจ์ด ์ค‘์ฒฉ๋˜๋ฉด ์ค‘๊ฐ„ ๋ ˆ๋ฒจ์„ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - ์†Œ์Šค๋ฅผ ์ฒ˜๋ฆฌ๋œ ๋ณด๊ธฐ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ž˜ํ•‘๋œ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ค‘๊ฐ„ ์ˆ˜์ค€์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฃจํŠธ ์ˆ˜์ค€, ๊ฒฝ๋กœ ์ˆ˜์ค€, ๋™์‚ฌ ์ˆ˜์ค€์ด ์žˆ๋Š” swagger ๋ฌธ์„œ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ˆ˜์ค€์€ ๊ตฌํ˜„ ๊ณ„์ธต์— ๋Œ€ํ•œ DI ์ง€์‹œ๋ฌธ์ธ ์‚ฌ์šฉ์ž ์ง€์ • ์ง€์‹œ๋ฌธ - x-uses ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด swagger ๋ฌธ์„œ์—์„œ HTML ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ ์ž‘์—… ํ•ธ๋“ค๋Ÿฌ(๋™์‚ฌ ์ˆ˜์ค€)๊ฐ€ ์ˆ˜๋ฝํ•˜๋Š” DI์™€ ์ด๋ฅผ ์ƒ์†ํ•˜๋Š” ๊ณ„์ธต์„ ์ง€์ •ํ•˜๋Š” ํ”Œ๋žซ ํ…Œ์ด๋ธ”์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  ์ •๋ณด๊ฐ€ swagger ๋ฌธ์„œ์— ๋‚ด์žฌ๋˜์–ด ์žˆ์ง€๋งŒ ์ด์ œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ.
์ฝง์ˆ˜์—ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—… ๊ธฐ๋ณธ ์‘๋‹ต์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ์˜ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์„œ์— ์„ค๋ช…๋œ API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด ๋ณด์‹ญ์‹œ์˜ค.
๋ชจ์˜ ์‘๋‹ต์„ ์‹ค์ œ ๋…ผ๋ฆฌ๋กœ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ์˜ค๋Š” ๊ตฌํ˜„ ๊ฐœ๋ฐœ์ž๊ฐ€ DI ์ปจํ…์ŠคํŠธ์—์„œ ๊ธฐ๋Œ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•˜๋Š” doclet์„ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ๋“ค์ด ์–ป์€ ์ˆ˜์ค€์— ๋Œ€ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค.
๊ฐ™์€...

๊ณ ์ „์ ์ธ HTML ์ƒ์„ฑ์ด ์•„๋‹™๋‹ˆ๋‹ค - ์˜ˆ. ํ•˜์ง€๋งŒ ๋ˆ„๊ฐ€ ์ฝง์ˆ˜์—ผ์ด HTML ์ „์šฉ์ด๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๊นŒ? ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋ฉฐ ์ฝ”๋“œ ์ƒ์„ฑ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.)

๋ชจ๋ธ์„ ์ง์ ‘ ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œํ•œ/์ œํ•œ์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž์˜ ์„ ํƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ํ•˜๋‚˜ ๋” ๋“ค๊ฒ ๋‹ค, ๊ทธ๋ฆฌ๊ณ  ๋น„๋ฒ• ์†Œ์Šค๋ฅผ ๋ฐฐ์‹ ํ•˜์ง€ ์•Š๊ณ  ํ•ด๋ณผ๊ฒŒ.

์ „๋žต ๊ฒŒ์ž„์—์„œ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์†Œ์œ ํ•œ ์ž์‚ฐ์„ ์„ค๋ช…ํ•˜๋Š” ํŠธ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
ํŠธ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•ฝ 5๋‹จ๊ณ„๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Aliance -> Empire -> City -> Army -> Troops

๊ฐ ๋ ˆ๋ฒจ์€ ์ˆ˜์ •์ž ๋ณด๋„ˆ์Šค(์˜ˆ: ๊ณต๊ฒฉ ๋ณด๋„ˆ์Šค, ๋ฐฉ์–ด ๋ณด๋„ˆ์Šค, ๊ฑด๊ฐ• ๋ณด๋„ˆ์Šค ๋“ฑ)๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋™์ผํ•œ ํ†ต๊ณ„๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ˆ˜์ •์ž๋Š” ๋ชจ๋“  ์ˆ˜์ค€์—์„œ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค(์ฃผ๋กœ ์žฌ๊ท€์ ์œผ๋กœ ๊ณ„์‚ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์—).
ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์žฅ ๋‚ฎ์€ ์ˆ˜์ค€์— ์žˆ์ง€๋งŒ ์ „ํˆฌ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ตฐ๋Œ€ ๋‚ด ๊ตฐ๋Œ€์˜ ์ „ํˆฌ ํ†ต๊ณ„๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ฃผ์–ด์ง„ ๊ณผ์ œ์— ๋Œ€ํ•ด ์–ด๋–ค ๊ตฐ๋Œ€๊ฐ€ ์ด์ƒ์ ์ธ ๊ตฐ๋Œ€์ธ์ง€ ์„ ํƒํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์ „ํˆฌ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ์—์„œ ๋™์ผํ•œ ์†์„ฑ ์ด๋ฆ„์œผ๋กœ ๋ช…๋ช…๋œ ์ˆ˜์ •์ž.
์ด๊ฒƒ์€ _๋งค์šฐ_ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์ค‘๊ฐ„ ๋ฒˆ์—ญ ๊ณ„์ธต ์—†์ด ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•œ ์‹คํ™”๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋ ค์›€์„ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ๊ตฐ๋Œ€๋Š” ์–ผ๋ผ์ด์–ธ์Šค ์ˆ˜์ค€์˜ ํƒœ์Šคํฌ ํฌ์Šค์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
Alliance -> Rally -> Troops
๋„๊ตฌ๋Š” ์ถฉ๋ถ„ํžˆ ์ผ๋ฐ˜์ ์ด์–ด์•ผ ํ•˜๋ฉฐ(์ผ๋ฐ˜ ์žฌ๊ท€์ ) ๊ตฌ์ฒด์ ์ธ ์ˆ˜์ค€์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ฝง์ˆ˜์—ผ์ด ๋ถ€๋ถ„์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ ์ฝง์ˆ˜์—ผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค ...

@osher ๋Š” ๋‹ค์Œ๊ณผ

์ œํ•œ/์ œํ•œ์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž์˜ ์„ ํƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฝง์ˆ˜์—ผ์— ์˜๊ฒฌ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. "๋กœ์ง์ด ์ ์€ ํ…œํ”Œ๋ฆฟ" ์ฒ ํ•™์€ ํ…œํ”Œ๋ฆฟ์— ๋งŽ์€ ์ œํ•œ์„ ๋‘๋Š”๋ฐ, ๊ทธ ์‚ฌ์‹ค์€ ๋ Œ๋”๋ง์„ ์œ„ํ•ด ํ…œํ”Œ๋ฆฟ์— ์ œ๊ณตํ•˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ/๋ชจ๋ธ ์ค€๋น„๊ฐ€ ์ข…์ข… ํ•„์š”ํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ท€ํ•˜์˜ ์š”๊ตฌ์— ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•ธ๋“ค ๋ฐ” ๋˜๋Š” lodash.template ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋” ๋‚˜์€ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅธ์ชฝ. ํ•ธ๋“ค๋ฐ”๋ฅผ ๊นŒ๋งฃ๊ฒŒ ์žŠ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ธ๋“ค๋ฐ”์— ์‚ฌ์šฉ์ž๋ฅผ ์žƒ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋Š” ๋””์ž์ธ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค.

@osher ๊ฐ€ "๊ทธ๊ฑด ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋Š” ๋””์ž์ธ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค."๋ผ๊ณ  ๋งํ–ˆ์„ ๋•Œ
https://github.com/mustache/mustache.github.com/issues/103

์šฐ์„  ์ƒ์œ„ ๋ฒ”์œ„๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋…ผ๋ฆฌ์ ์ด์ง€ ์•Š์œผ๋ฉฐ ์ฝง์ˆ˜์—ผ์˜ ์ด์ƒ์„ ๋ฐฉํ•ดํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ•ญ์ƒ ์„ ํ–‰ "../"์™€ ๊ฐ™์€ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฃจํŠธ ๋ฒ”์œ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

Mustache.render('{{a1}}{{#a}}{{b.c}}{{../a1}}{{/a}}',{"a":{"b":{"c":"x1"}},"a1":"x2"})
"x2x1"

๋‚˜๋Š” ์ด๊ฒƒ์ด "x2x1x2"๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰ ๊ฒƒ์„ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.
JSONPath: https://goessner.net/articles/JsonPath/index.html#e2 ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ XPath for XML๊ณผ ๋‹ฌ๋ฆฌ ๋ถ€๋ชจ ์—ฐ์‚ฐ์ž๋ฅผ ๊ถŒ์žฅ/๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„์œ„ํ•œ.

์•„๋งˆ๋„ Mustache๋Š” ํ•ธ๋“ค๋ฐ”์™€ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์ƒ์œ„ ์ปจํ…์ŠคํŠธ์— ../ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

AFAIK, ํ•ธ๋“ค๋ฐ”๋Š” JS ์ „์šฉ์ธ ๋ฐ˜๋ฉด ์ฝง์ˆ˜์—ผ์€ ๋งŽ์€ ํ™˜๊ฒฝ(์˜ˆ: PHP)์—์„œ ๋™์ผํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฝง์ˆ˜์—ผ ๊ตฌ๋ฌธ์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด js๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ตฌํ˜„๋„ ๋™์ผํ•˜๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธด ์ฃผ๋ฌธ. ๊ฒŒ๋‹ค๊ฐ€, JS ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ "ํ•œ ๋ ˆ๋ฒจ" ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋น„๋ก ๊ตฌํ˜„ํ•˜๊ธฐ ๊ฐ€ ๋งค์šฐ ํฌํฌ์— ๋ฃจํŠธ๋กœ ๋Œ์•„๊ฐ€๋Š” ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ...

์ด๊ฒƒ์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„?

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

view = { wrap: { txt: "test" } };
{{#wrap}}
  {{wrap.txt}} {{! Should I use this?}}
  {{txt}} {{! Or this?}}
{{/wrap}}

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ: https://stackoverflow.com/q/62166467/5637701

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

๊ด€๋ จ ๋ฌธ์ œ

barbalex picture barbalex  ยท  5์ฝ”๋ฉ˜ํŠธ

chlab picture chlab  ยท  11์ฝ”๋ฉ˜ํŠธ

amper5and picture amper5and  ยท  5์ฝ”๋ฉ˜ํŠธ

kuldeepdhaka picture kuldeepdhaka  ยท  9์ฝ”๋ฉ˜ํŠธ

MatthijsZw picture MatthijsZw  ยท  18์ฝ”๋ฉ˜ํŠธ