CodeGym /์ž๋ฐ” ์ฝ”์Šค /Frontend SELF KO /ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ

ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ

Frontend SELF KO
๋ ˆ๋ฒจ 10 , ๋ ˆ์Šจ 5
์‚ฌ์šฉ ๊ฐ€๋Šฅ

5.1 ํƒœ๊ทธ <template>

HTML์˜ <template> ํƒœ๊ทธ๋Š” ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ ํ‘œ์‹œ๋˜์ง€ ์•Š์ง€๋งŒ, JavaScript๋ฅผ ํ†ตํ•ด ๋‚˜์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” HTML ์ฝ”๋“œ ์กฐ๊ฐ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜. ์ด๊ฑด ๋™์  ์ปจํ…์ธ  ์ƒ์„ฑ ๋ฐ ์‚ฝ์ž…, ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์ด๋‚˜ ์ œํ’ˆ ์นด๋“œ, ๋‹ค๋ฅธ ๋ฐ˜๋ณต์  ๊ตฌ์กฐ๋“ค์— ํŠนํžˆ ์œ ์šฉํ•ด.

<template> ์š”์†Œ๋Š” HTML ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ, ์ด ์ฝ”๋“œ๋Š” ํŽ˜์ด์ง€์— ์ฆ‰์‹œ ํ‘œ์‹œ๋˜์ง€ ์•Š์•„. <template> ์•ˆ์˜ ๋‚ด์šฉ์€ ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ ๋ธŒ๋ผ์šฐ์ €์— ์˜ํ•ด ๋ Œ๋”๋ง๋˜์ง€ ์•Š์ง€๋งŒ, DOM (Document Object Model)์„ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ณ , JavaScript๋กœ ๋ณต์ œํ•˜๊ณ  ๋ฌธ์„œ์— ์‚ฝ์ž…๋  ์ˆ˜ ์žˆ์–ด.

๋ฌธ๋ฒ•:

HTML
    
      <template>
        <!-- ํ…œํ”Œ๋ฆฟ ๋‚ด์šฉ -->
      </template>
    
  

<template> ํƒœ๊ทธ์˜ ์ฃผ์š” ํŠน์ง•

  1. ๋‚ด์šฉ ์ˆจ๊น€: <template> ํƒœ๊ทธ์˜ ๋‚ด์šฉ์€ ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ ํ‘œ์‹œ๋˜์ง€ ์•Š์•„.
  2. JavaScript ์‚ฌ์šฉ: <template> ํƒœ๊ทธ์˜ ๋‚ด์šฉ์€ JavaScript๋กœ ๋ณต์ œํ•˜๊ณ  DOM์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์–ด.
  3. ์ง€์—ฐ ๋กœ๋“œ: ํ•„์š”์— ๋”ฐ๋ผ ๋‚ด์šฉ ๋กœ๋“œ ๋ฐ ํ‘œ์‹œ๋ฅผ ํ—ˆ์šฉํ•ด ํŽ˜์ด์ง€ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด.

<template> ํƒœ๊ทธ ์‚ฌ์šฉ ์˜ˆ์‹œ

์ด ์˜ˆ์‹œ์—์„œ๋Š” "Add Item" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์ด ๋งŒ๋“ค์–ด์ง€๋ฉฐ <ul> ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€๋ผ. ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์˜ ํ…œํ”Œ๋ฆฟ์€ <template> ํƒœ๊ทธ ์•ˆ์— ์ •์˜๋ผ ์žˆ์–ด.

HTML
    
      <button id="addButton">Add Item</button>
      <ul id="itemList"></ul>
      <template id="itemTemplate">
        <li class="item">This is a new item</li>
      </template>
    
  
JavaScript
    
// DOM์—์„œ ์‚ฌ์šฉํ•  ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ ์–ป๊ธฐ
const addButton = document.getElementById('addButton'); // "์ถ”๊ฐ€" ๋ฒ„ํŠผ
const itemList = document.getElementById('itemList'); // ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ๋ฆฌ์ŠคํŠธ
const itemTemplate = document.getElementById('itemTemplate'); // ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์˜ ํ…œํ”Œ๋ฆฟ

// "์ถ”๊ฐ€" ๋ฒ„ํŠผ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์ถ”๊ฐ€ํ•˜๊ธฐ
addButton.addEventListener('click', () => {
  // ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ ํ…œํ”Œ๋ฆฟ ๋‚ด์šฉ ๋ณต์ œํ•˜๊ธฐ
  const newItem = itemTemplate.content.cloneNode(true); // true๋Š” ๋ชจ๋“  ์ž์‹ ์š”์†Œ๋ฅผ ํฌํ•จํ•œ ๊นŠ์€ ๋ณต์ œ๋ฅผ ์˜๋ฏธํ•ด

  // ์ƒˆ๋กœ์šด ํ•ญ๋ชฉ์„ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๊ธฐ
  itemList.appendChild(newItem); 
});
    
  

5.2 ์˜ˆ์‹œ: ์ƒํ’ˆ ์นด๋“œ ์ƒ์„ฑ

<template>์™€ JavaScript๋ฅผ ์‚ฌ์šฉํ•ด์„œ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒํ’ˆ ์นด๋“œ๋ฅผ ํฌํ•จํ•œ ์š”์†Œ ๋ชฉ๋ก์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด.

<template> ํƒœ๊ทธ ์‚ฌ์šฉ ์˜ˆ์‹œ:

HTML
    
      <h1>์ƒํ’ˆ ๋ชฉ๋ก</h1>
      <div id="productList"></div>
      <template id="productTemplate">
        <div class="item">
          <h2 class="title"></h2>
          <p class="description"></p>
          <span class="price"></span>
        </div>
      </template>
    
  
JavaScript
    
// ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ „์— DOM์ด ์™„์ „ํžˆ ๋กœ๋“œ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆผ
document.addEventListener('DOMContentLoaded', () => {
  // ์ƒํ’ˆ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด
  const products = [
    { title: '์ƒํ’ˆ 1', description: '์ƒํ’ˆ 1 ์„ค๋ช…', price: '100 ๋‹ฌ๋Ÿฌ' },
    { title: '์ƒํ’ˆ 2', description: '์ƒํ’ˆ 2 ์„ค๋ช…', price: '200 ๋‹ฌ๋Ÿฌ' },
    { title: '์ƒํ’ˆ 3', description: '์ƒํ’ˆ 3 ์„ค๋ช…', price: '300 ๋‹ฌ๋Ÿฌ' },
  ];

  // DOM ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ ์–ป๊ธฐ
  const productList = document.getElementById('productList'); // ์ œํ’ˆ ๋ฆฌ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ
  const template = document.getElementById('productTemplate').content; // ์ œํ’ˆ ์š”์†Œ ํ…œํ”Œ๋ฆฟ

  // ์ œํ’ˆ ๋ฐฐ์—ด์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๊ฐ๊ฐ์˜ ์š”์†Œ๋ฅผ ๋ฆฌ์ŠคํŠธ์— ์ƒ์„ฑ
  products.forEach(product => {
    // ์ œํ’ˆ ํ…œํ”Œ๋ฆฟ ๋ณต์ œํ•˜๊ธฐ
    const clone = document.importNode(template, true); // true - ๊นŠ์€ ๋ณต์ œ

    // ๋ณต์ œ๋œ ํ…œํ”Œ๋ฆฟ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๊ธฐ
    clone.querySelector('.title').textContent = product.title;
    clone.querySelector('.description').textContent = product.description;
    clone.querySelector('.price').textContent = product.price;

    // ๋ฆฌ์ŠคํŠธ์— ์ฑ„์›Œ์ง„ ํ…œํ”Œ๋ฆฟ ์ถ”๊ฐ€ํ•˜๊ธฐ
    productList.appendChild(clone);
  });
});
    
  

์„ค๋ช…

  • <template> ํƒœ๊ทธ: ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” HTML ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด.
  • document.importNode(template, true) ๋ฉ”์†Œ๋“œ: ํ…œํ”Œ๋ฆฟ ๋‚ด์šฉ์„ ๋ณต์ œํ•ด.
  • querySelector์™€ textContent ๋ฉ”์†Œ๋“œ: ๋ฌธ์„œ์— ์‚ฝ์ž…ํ•˜๊ธฐ ์ „์— ๋ณต์ œ๋œ ํ…œํ”Œ๋ฆฟ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ.

5.3 <template> ํƒœ๊ทธ์˜ ์žฅ์ 

์„ฑ๋Šฅ ํ–ฅ์ƒ

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

๋™์  ์ปจํ…์ธ  ๊ฐ„์†Œํ™”

ํ…œํ”Œ๋ฆฟ์€ ๋™์  ์ปจํ…์ธ  ์ƒ์„ฑ ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•ด. JavaScript๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ HTML ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹ , ๋ฏธ๋ฆฌ ์ค€๋น„๋œ ํ…œํ”Œ๋ฆฟ์„ ๋ณต์ œํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด.

ํŽธ๋ฆฌ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ

ํ…œํ”Œ๋ฆฟ์€ ์ฝ”๋“œ๋ฅผ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ๊ตฌ์กฐํ™”๋˜๊ฒŒ ๋งŒ๋“ค์–ด์ค˜, ๋ฐ˜๋ณต๋˜๋Š” ์š”์†Œ์šฉ HTML ์ฝ”๋“œ๋ฅผ JavaScript์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋ณ„๋„๋กœ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์•ผ.

์กฐ๊ฑด๋ถ€ ์ปจํ…์ธ  ํ‘œ์‹œ ์˜ˆ์‹œ:

HTML
    
      <h1>์ž‘์—… ๊ฒฐ๊ณผ</h1>
      <div id="messageContainer"></div>

      <template id="messageTemplate">
        <div class="message">
          <p class="content"></p>
        </div>
      </template>
    
  
JavaScript
    
document.addEventListener('DOMContentLoaded', () => {
  // DOM ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ ์–ป๊ธฐ
  const messageContainer = document.getElementById('messageContainer'); // ๋ฉ”์‹œ์ง€ ์ปจํ…Œ์ด๋„ˆ
  const template = document.getElementById('messageTemplate').content; // ๋ฉ”์‹œ์ง€ ํ…œํ”Œ๋ฆฟ

  // ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜
  function showMessage(type, text) {
    // ๋ฉ”์‹œ์ง€ ํ…œํ”Œ๋ฆฟ ๋ณต์ œํ•˜๊ธฐ
    const clone = document.importNode(template, true); // true - ๊นŠ์€ ๋ณต์ œ

    // ๋ณต์ œ๋ณธ ๋‚ด๋ถ€์˜ ๋ฉ”์‹œ์ง€ ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ ์–ป๊ธฐ
    const messageDiv = clone.querySelector('.message');

    // ๋ฉ”์‹œ์ง€ ์œ ํ˜•์— ํ•ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค ์ถ”๊ฐ€ํ•˜๊ธฐ (success ๋˜๋Š” error)
    messageDiv.classList.add(type);

    // ๋ฉ”์‹œ์ง€ ํ…์ŠคํŠธ ์„ค์ •ํ•˜๊ธฐ
    messageDiv.querySelector('.content').textContent = text;

    // ๋ฉ”์‹œ์ง€๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ์ถ”๊ฐ€ํ•˜๊ธฐ
    messageContainer.appendChild(clone);
  }

  // ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ธฐ
  showMessage('success', '์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!');
  showMessage('error', '์ž‘์—… ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.');
});
    
  

์„ค๋ช…:

  • showMessage() ํ•จ์ˆ˜: ๋ฉ”์‹œ์ง€ ์œ ํ˜• (์„ฑ๊ณต ๋˜๋Š” ์˜ค๋ฅ˜)๊ณผ ๋ฉ”์‹œ์ง€ ํ…์ŠคํŠธ๋ฅผ ์ˆ˜๋ฝํ•˜๊ณ , ํ…œํ”Œ๋ฆฟ์„ ๋ณต์ œํ•˜์—ฌ ๋ฉ”์‹œ์ง€ ์ปจํ…Œ์ด๋„ˆ์— ์ถ”๊ฐ€ํ•ด.
  • .success ๋ฐ .error ํด๋ž˜์Šค: ๋ฉ”์‹œ์ง€ ์œ ํ˜•์— ๋”ฐ๋ผ ๋ณต์ œ๋œ ํ…œํ”Œ๋ฆฟ์— ์Šคํƒ€์ผ๋ง์„ ์œ„ํ•ด ์ ์šฉ๋ผ.
1
ะžะฟั€ะพั
HTML5 ์‹œ๋งจํ‹ฑ ํƒœ๊ทธ,ย  10 ัƒั€ะพะฒะตะฝัŒ,ย  5 ะปะตะบั†ะธั
ะฝะตะดะพัั‚ัƒะฟะตะฝ
HTML5 ์‹œ๋งจํ‹ฑ ํƒœ๊ทธ
HTML5 ์‹œ๋งจํ‹ฑ ํƒœ๊ทธ
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION