CodeSnippet๊ณผ ํ•จ๊ป˜ํ•˜๋Š” JavaScript ํ”„๋กœ๊ทธ๋ž˜๋ฐ


codesnippet

์›น ์„œ๋น„์Šค์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์˜์กด๋„๋Š” ๊ณ„์† ์ฆ๊ฐ€ํ•˜๋Š” ์ถ”์„ธ๋‹ค. github์— ๋“ฑ๋ก๋œ ํ”„๋กœ์ ํŠธ๋“ค(2015๋…„๋„ ์กฐ์‚ฌ ์ž๋ฃŒ)๋งŒ ๋ด๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„์ค‘์ด ๊ฐ€์žฅ ๋†’๊ณ , ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ๋“ค๋„ ๋Œ€๋ถ€๋ถ„์ด ๊ทธ๋Ÿด ๊ฒƒ์ด๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์€ ํ˜น์‹œ ๋‹ค์Œ์˜ ๊ฒฝ์šฐ๋ฅผ ๊ฒช์ง€ ์•Š์•˜๋Š”๊ฐ€?

1. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด๋ฏธ ๋งŒ๋“ค์–ด ๋†“์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ณ  ์ค‘๋ณต์œผ๋กœ ์ž‘์—…ํ–ˆ๋‹ค.
   (trim ๋“ฑ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ๋“ค์€ ํŠนํžˆ ๊ทธ๋Ÿฌ๊ธฐ ์‰ฝ๋‹ค)

2. ๊ฐ™์€ ์šฉ๋„์˜ ํ”„๋ ˆ์ž„์›์„ ์—ฌ๋Ÿฌ๊ฐœ ๋˜๋Š” ๋ฒ„์ „๋ณ„๋กœ ์ถ”๊ฐ€ํ–ˆ๊ณ , ์‹ฌ์ง€์–ด ํ•œ ํŽ˜์ด์ง€์—์„œ ๊ฐ™์ด ์‚ฌ์šฉํ–ˆ๋‹ค.
   (jQuery, prototype ...)

3. ์ƒˆ๋กœ ๋„ฃ์œผ๋ ค๋Š” ์ฝ”๋“œ๊ฐ€ ๊ธฐ์กด์˜ ์ฝ”๋“œ์™€ ๊ผฌ์—ฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

4. ์œ ์ง€๋ณด์ˆ˜ํ•  ๋•Œ ์ด๋ฏธ ๊ฐœ๋ฐœ๋œ HTMLํŽ˜์ด์ง€์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์–ด๋””์„œ๋ถ€ํ„ฐ ์†๋Œ€์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.
   (ํŽ˜์ด์ง€ ์ง„์ž…๊ณผ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ํŒŒ์•…์ด ์–ด๋ ต๋‹ค)

๋ฌผ๋ก  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๊ตญํ•œ๋œ ๋ฌธ์ œ๋“ค์€ ์•„๋‹ˆ์ง€๋งŒ, ์œ ๋… ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‘๋“œ๋Ÿฌ์ง€๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ œ๋“ค์ด๋‹ค.

์ด์ œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋„ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์‹œ๋Œ€๋‹ค.

์ด๋ฏธ ๊ทธ๋žฌ์–ด์•ผ ํ–ˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

์š”์ ์€ ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด window์— ์•„๋ฌด๋ ‡๊ฒŒ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ๋ง๊ณ  ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์–ด๋””์— ๋“ค์–ด๊ฐ€์•ผ ํ• ์ง€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •๋ฆฌํ•ด์„œ ์“ธ๋ฐ์—†๋Š” ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ  ๋‹ค๋ฅธ ์ฝ”๋“œ์™€ ๊ผฌ์ผ ์ผ์ด ์—†๋„๋ก ์ถœ์ž…๊ตฌ๋ฅผ ํ•˜๋‚˜๋งŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. (jQuery๋Š” window.$ ์•ˆ์— ์ฝ”๋“œ๋“ค์ด ์ •๋ฆฌ๋˜์–ด ์žˆ๋‹ค. ์šฐ๋ฆฌ๋ผ๊ณ  ๋ชปํ• ๊ฒŒ ๋ญ ์žˆ๊ฒ ๋Š”๊ฐ€! ์ „ํ˜€ ์–ด๋ ต์ง€ ์•Š๋‹ค)

๋จผ์ € ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณธ๋‹ค. ์ •๋ฆฌ๋œ ์ฝ”๋“œ๊ฐ€ ๊ฐ€์ ธ๋‹ค์ฃผ๋Š” ์œ ์ง€๋ณด์ˆ˜์˜ ํŽธ์˜๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ๊ฒช์–ด๋ด์„œ ์ด๋ฏธ ์•Œ ๊ฒƒ์ด๋‹ค. (์ ์–ด๋„ ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋Š” ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค) ๊ทธ ํ›„ CodeSnippet์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ defineNamespace, defineModule ์„ ํ†ตํ•ด ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด ๋ณธ๋‹ค.

๊ธฐ์กด์˜ ๋ฐฉ์‹๊ณผ ๋ฌธ์ œ์ 

์ „์—ญ์„ ์˜ค์—ผ์‹œํ‚ค๋Š” ๋ฌธ์ œ์ ์œผ๋กœ ์ฆ‰์‹œ์‹คํ–‰ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋“ค ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค.

<body>
  <script>
    function login() {
      /* ... */
    }
  </script>
</body>

์œ„์˜ ์ฝ”๋“œ๋Š” login()์œผ๋กœ ์‹คํ–‰ํ• ์ˆ˜๋„ ์žˆ์ง€๋งŒ window.login()์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ์„ž์—ฌ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค. (์ด๋Ÿฐ ์ฝ”๋“œ๋ฅผ '์ „์—ญ์„ ์˜ค์—ผ์‹œํ‚ค๋Š” ์ฝ”๋“œ' ๋ผ๊ณ  ํ•œ๋‹ค)

๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜(IIFE)๋ฅผ ์‚ฌ์šฉํ•ด ์ „์—ญ์„ ์˜ค์—ผ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ–ˆ๋‹ค.

<body>
  <script>
    (function() {
      function login() {
        /* ... */
      }
    })();
    login(); // ReferenceError
  </script>
</body>

๋ฌธ์ œ๋Š” login ํ•จ์ˆ˜๊ฐ€ ์ต๋ช…ํ•จ์ˆ˜ (์ด๋ฆ„ ์—†๋Š” ํ•จ์ˆ˜) ๋‚ด์— ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋•Œ๋ฌธ์— window์— ์ˆ˜๋™์œผ๋กœ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋Š”๊ฒƒ๋“ค์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. window์— ํ”„๋กœ์ ํŠธ๋ช…์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์—ฌ๊ธฐ์— ์ •๋ฆฌํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

<body>
  <script>
    (function(w) {
      function login() {
        /* ... */
      }

      w.myProject = {
        login: login
      };
    })(window);

    w.myProject.login(); // OK
  </script>
</body>

login์ด๋ž€ ๋ฉ”์„œ๋“œ๊ฐ€ window.myProject๋ผ๋Š” ๊ฐ์ฒด์— ํฌํ•จ๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค. namespace ๊ฐ€ ์—ฌ๋Ÿฌ depth๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ์„ ํ…๋ฐ ์ต๋ช…ํ•จ์ˆ˜ ๋‚ด์—์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด myProject.common ์„ ๋งŒ๋“ค ๋•Œ myProject๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ๋ง์ด๋‹ค.

<body>
  <script>
    (function(w) {
      function saveData() {
        /* ... */
      }

      // myProject ๊ฐ€ ์žˆ๋Š”์ง€?
      if (w.myProject) {
        // myProject.user ๊ฐ€ ์žˆ๋Š”์ง€?
        if (w.myProject.user) {
          w.myProject.user.saveData = saveData;
        } else {
          w.myProject.user = {
            saveData: saveData
          };
        }
      }
    })(window);

    w.myProject.user.saveData();
  </script>
</body>

defineNamespace

CodeSnippet์˜ defindNamespace๋Š” window์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ๋“ค์„ ์‰ฝ๊ฒŒ ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ Namespace๋ฅผ ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ž์„œ ์ด์•ผ๊ธฐํ–ˆ๋˜ ๋ถˆํŽธํ•œ ๋ฌธ์ œ ์—†์ด ๊ณ„ํš์ ์œผ๋กœ ๊ธฐ๋Šฅ๋“ค์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

<body>
  <script>
    var common = tui.util.defineNamespace("ne.myNote.common", {
      trim: function() {
        /* ... */
      }
    });

    tui.util.defineNamespace("ne.myNote", {
      login: function() {
        /* ... */
      }
    });

    ne.myNote.login();
    ne.myNode.common.trim("test");
    common.trim("test"); // ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค
  </script>
</body>

ne.myNote์™€ ne.myNote.common๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ–ˆ๋‹ค. (์‚ฌ์‹ค ne.๋กœ ์‹œ์ž‘ํ•˜๋Š” namespace๋Š” ์‚ฌ๋‚ด ํ‘œ์ค€ ๊ฐ€์ด๋“œ๋‹ค.) ์‹ฌ์ง€์–ด ne.myNote.common์„ ๋จผ์ € ์„ ์–ธํ•˜๋”๋ผ๋„ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ•œ๋‹ค.

defineNamspace๋ฅผ ์‚ฌ์šฉํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”์„œ๋“œ๋“ค์„ ๊ตฌ์กฐ์ ์œผ๋กœ ๋…ธ์ถœ์‹œํ‚ค๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๊ต‰์žฅํžˆ ๊น”๋”ํ•œ ์‚ฐ์ถœ๋ฌผ์„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

ํ˜น์‹œ ์—ฌ๊ธฐ์„œ ๋” ๋‚˜์•„๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ์‹œ์ ์— ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด defineModule ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

<body>
  <script>
    tui.util.defineModule("ne.myNote.settings", {
      memberID: "<%= memberID %>",
      initialize: function() {
        // ํŽ˜์ด์ง€ ๋กœ๋”ฉ๊ณผ ๋™์‹œ์— ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ํ•ด์•ผ ํ•จ (์ž๋™์‹คํ–‰)
        $.ajax(/* ... */);
      }
    });

    ne.myNote.settings.memberID; // ์‚ฌ์šฉ์ž ID
  </script>
</body>

defineNamespace์™€ defineModule์˜ ์ฐจ์ด๋Š” ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ์ ์— initialize๋ผ๋Š” ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์—ฌ๋ถ€ ๋ฟ์ด๋‹ค.

defineModule์€ ํ•œ ํŽ˜์ด์ง€ ๋‹จ์œ„์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์“ธ ์ˆ˜ ์žˆ๋‹ค. initialize์—์„œ ํŽ˜์ด์ง€ ๋กœ๋”ฉ๊ณผ ํ•จ๊ป˜ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ตฌํ˜„์„ ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (์‹ค๋ฌด ์˜ˆ์ œ์—์„œ ๋‹ค๋ฃฌ๋‹ค)

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

<body>
  <script>
    var Comment = tui.util.defineClass({
      init: function(content) {
        this.content = content;
        this.like = 0;
      },
      likeIt: function() {
        this.like += 1;
      }
    });

    var comment1 = new Comment("I like it!");
    var comment2 = new Comment("I hate it!");
  </script>
</body>

defineClass๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ prototype ํŒจํ„ด์„ ์ด์šฉํ•ด ํด๋ž˜์Šค๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ดํŒ…ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœํผํ‹ฐ๋Š” ์ธ์Šคํ„ด์Šค์—, ๋ฉ”์„œ๋“œ๋Š” prototype๊ฐ์ฒด์— ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์˜ ํ•œ์ •์ ์ธ ์ž์›์—์„œ ๋™์ž‘ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ค€๋‹ค. ๋ฌผ๋ก  ์ƒ์†๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

<body>
  <script>
    var PhotoComment = tui.util.defineClass(Comment, {
      init: function(content) {
        Comment.call(this, content);
        this.photoUrl = ""; // Commentํด๋ž˜์Šค์— photoUrl ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค
      }
    });

    var comment1 = new PhotoComment("I like it!");
  </script>
</body>

์‹ค๋ฌด ์˜ˆ์ œ

๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉํ•  ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด ๋ณด์ž. ์ถ”๊ฐ€์ ์œผ๋กœ email ์— trim์„ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ •ํ•œ๋‹ค.

// util.js
tui.util.defineNamespace("ne.myNote.util", {
  trim: function(str) {
    if (str.trim) {
      return str.trim();
    }

    return str.replace(/^[\s]+|[\s]+$/g, "");
  },

  getElement: function(selector) {
    return document.querySelector(selector);
  }
});

util.js๋Š” ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ ์‚ฌ์šฉํ•  ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ์€ ๋ชจ๋“ˆ์ด๋‹ค. getElement๋Š” jQuery์˜ $()์™€ ๊ฐ™์€ ๊ฒƒ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

<body>
  <form>
    <input type="text" name="email" placeholder="Enter email address" />
    <input type="password" name="password" placeholder="Enter password" />
    <input type="submit" value="login" />
  </form>
  <script src="./util.js"></script>
  <!-- ne.myNote.util -->
  <script>
    tui.util.defineModule("ne.myNote.page.login", {
      $email: ne.myNote.util.getElement("input[name=email]"),
      $form: ne.myNote.util.getElement("form"),

      initialize: function() {
        this.$form.addEventListener("submit", this.onSubmit.bind(this));
      },

      onSubmit: function(e) {
        this.$email.value = ne.myNote.util.trim(this.$email.value);
      }
    });
  </script>
</body>

๊ฐ ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์—˜๋ฆฌ๋จผํŠธ์— ๋Œ€ํ•ด ๋ชจ๋“ˆ์˜ ํ”„๋กœํผํ‹ฐ๋กœ ์ •์˜ํ–ˆ๋‹ค ($email, $form) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํŽ˜์ด์ง€ ๋‚ด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์–ด ๊ด€๋ฆฌํ•˜๊ธฐ ์šฉ์ดํ•ด์กŒ๋‹ค.

initialize ์—์„œ ํŽ˜์ด์ง€ ์ดˆ๊ธฐ์— ์‹คํ–‰๋˜์–ด์•ผํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์ด์ œ ํŽ˜์ด์ง€ ์ „์ฒดํŒŒ์ผ์„ ํ›‘์ง€ ์•Š์•„๋„ ๋กœ๋”ฉ ์‹œ์ ์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฌธ์„œ์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ํผ ์—˜๋ฆฌ๋จผํŠธ ์ด๋ฒคํŠธ๋ฅผ onSubmit์— ์„ค์ •ํ–ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด ์ด๋ฒคํŠธ ๋ฉ”์„œ๋“œ์˜ ์ปจ๋ฒค์…˜์„ ์ •์˜ํ•  ๊ฒฝ์šฐ ํŽ˜์ด์ง€ ๋‚ด์—์„œ ์–ด๋–ค ์ด๋ฒคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์š”์•ฝ ๋ฐ ๊ฒฐ๋ก 

CodeSnippet์˜ defineNamespace, defineModule, defineClass๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋น„์Šค์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๊ณ„ํš์ ์œผ๋กœ ๊ตฌ์กฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • defineNamespace: ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์—†์ด window์— ๊ฐ์ฒด ํ˜•ํƒœ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • defineModule: ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ์ ์— initialize ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š”๊ฒƒ ๋นผ๊ณ  defineNamespace์™€ ๊ฐ™๋‹ค
  • defineClass: ํด๋ž˜์Šค ์‹œ๋ฎฌ๋ ˆ์ดํŒ… ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ๋‹ค.

์„œ๋น„์Šค ๊ฐœ๋ฐœ ์ดˆ๊ธฐ์— namespace ๋ชฉ๋ก๊ณผ ๊ทธ ์šฉ๋„๋ฅผ ์ •๋ฆฌํ•ด ๊ณต์œ ํ•œ๋‹ค๋ฉด ์ด๋ฏธ ์žˆ๋Š” ๋กœ์ง์„ ์ค‘๋ณต์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค๊ฑฐ๋‚˜, ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฒค๋”์˜ ํ”„๋ ˆ์ž„์›์„ ์ค‘๋ณต์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ๋ถˆ์ƒ์‚ฌ๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค (jQuery์™€ prototype ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•œํŽ˜์ด์ง€์— ๊ฐ™์ด ์“ฐ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„์ง ๋งŽ๋‹ค...)

CodeSnippet์€ ์ด ์™ธ์—๋„ ์—ฌ๋Ÿฌ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจํ˜ธํ•œ ํƒ€์ž… ์ฒดํ‚น์„ ํšŒํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ ๋ถ€ํ„ฐ, ์‚ฌ์šฉํ•˜๊ธฐ ๋ถˆํŽธํ–ˆ๋˜ window.open์„ ํ†ตํ•œ ํŒ์—…์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๊นŒ์ง€ ๋ง์ด๋‹ค. ๊ธฐ๋Šฅ ๋ชฉ๋ก์€ CodeSnippet Github Repository์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ์˜ ์ „์ฒด ์šฉ๋Ÿ‰์€ 23KB์ด๋ฉฐ GZIP ์••์ถ• ํ›„ ์•ฝ 6.94KB์ด๋ฏ€๋กœ ๋ถ€๋‹ด์—†๋Š” ํฌ๊ธฐ์ด๋‹ค. ๋˜ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ํŒŒ์ผ๋งŒ ๊ฐœ๋ณ„๋กœ ์‚ฌ์šฉํ• ์ˆ˜๋„ ์žˆ๋‹ค. ์‚ฌ์šฉ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•ด github์ด๋‚˜ dl_javascript@nhn.com์œผ๋กœ ๋ฆฌํฌํŒ…ํ•˜๋ฉด ํฐ ์ด์Šˆ๊ฐ€ ์—†๋Š” ํ•œ ์ฆ‰๊ฐ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

๊น€๋ฏผํ˜•2016.04.04
Back to list