๋ฐ˜์‘ํ˜•

๋‹ค ๊นŒ๋จน์–ด๋ฒ„๋ฆฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์‹œ ๋ณต๊ธฐ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‹œ์ž‘ํ•œ ํˆฌ๋‘ ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ!

๋งŒ๋“ค๋‹ค ๋ณด๋‹ˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ ์จ๋‚ด๋ ค๊ฐ”๋˜ ์ฝ”๋“œ์™€ ๋ณ„๋ฐ˜ ์ฐจ์ด๊ฐ€ ์—†๋‹ค..

 

์ฒ˜์Œ์ด๋ž‘ ๋˜‘๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋‹จ์ˆœ ๋ณต์Šต ๋‹จ์ˆœ ๋…ธ๊ฐ€๋‹ค์ผ๋ฟ..!!!!

๋ญ๋ผ๋„ ๋ฐœ์ „๋œ๊ฒŒ ์žˆ์–ด์•ผ ํ•˜์ง€ ์•Š์„๊นŒ.......???????????๋ž€ ์ƒ๊ฐ์—

 

๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ค„์—ฌ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค!


๐Ÿ‘ป ์ด์ „ ์ฝ”๋“œ

์ „์—๋Š” ๋ƒ…๋‹ค ํ•„์š”ํ•œ ์š”์†Œ๋“ค ๋Š์ž„์—†์ด ์ƒ์„ฑ ํ›„

      const wrapper = document.createElement("div");
      const header = document.createElement("header");
      const inputContainer = document.createElement("div");
      const todoContainer = document.createElement("div");

 

๋ƒ…๋‹ค ๋ถ™์—ฌ๋ฒ„๋ฆฌ๊ธฐ..

      document.body.appendChild(wrapper);
      wrapper.appendChild(header);
      wrapper.appendChild(inputContainer);
      wrapper.appendChild(todoContainer);

 

๋ถ€๋ชจ์š”์†Œ ์ƒ์„ฑ, ์ž์‹์š”์†Œ ์ƒ์„ฑ, ์ž์‹์š”์†Œ ๋ถ€๋ชจ์š”์†Œ์— ๋ถ™์ด๊ธฐ..

์ž๊พธ ๋Š˜์–ด๋งŒ ๊ฐ€๋Š” createElement, appendChild......์ง€๊ธ‹์ง€๊ธ‹ํ–..


โœจ ๋ฆฌํŒฉํ† ๋ง

function createElement({
  tagName,
  properties,
  parent,
  children,
  count = 1,
}) {
  function create() {
    const element = document.createElement(tagName);  // ํƒœ๊ทธ ์ƒ์„ฑ
    Object.assign(element, properties);               // ์†์„ฑ ํ• ๋‹น
    parent?.appendChild(element);                     // ๋ถ€๋ชจ์— ์ถ”๊ฐ€

    // ์ž์‹ ์š”์†Œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์žฌ๊ท€์ ์œผ๋กœ ์ž์‹ ์ƒ์„ฑ
    children?.map((child) => {
      child.parent = element;   // ํ˜„์žฌ ์ƒ์„ฑ๋œ ์š”์†Œ๋ฅผ ๋ถ€๋ชจ๋กœ ์„ค์ •
      createElement(child);     // ์ž์‹ ์š”์†Œ๋ฅผ ์œ„ํ•œ createElement ์žฌ๊ท€ ํ˜ธ์ถœ
    });

    return element;
  }

  if (count > 1) {
    const results = [];
    for (let i = 0; i < count; i++) {
      results.push(create());
    }
    return results;
  } else {
    return create();
  }
}
  • createElement์™€ appendChild๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ createElement ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜์˜€๋‹ค.
  • createElement ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ํ•œ ๋ฒˆ์— ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก count ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ๋™์ ์œผ๋กœ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„์˜ DOM ๊ตฌ์กฐ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด children ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ด๋กœ์จ ๋ถ€๋ชจ ์š”์†Œ๊ฐ€ ์ž์‹ ์š”์†Œ๋ฅผ ๊ฐ–๋Š” ๋ณต์žกํ•œ DOM ํŠธ๋ฆฌ๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Object.assign์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ์— ์†์„ฑ๋“ค์„ ์œ ์—ฐํ•˜๊ฒŒ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์†์„ฑ์„ ํ•œ ๋ฒˆ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ์ถ”๊ฐ€์ ์ธ ์†์„ฑ์ด ์ƒ๊ธฐ๋”๋ผ๋„ ํ•จ์ˆ˜ ์ˆ˜์ • ์—†์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
Object.assign()์€ ๊ฐ์ฒด์˜ ์†์„ฑ๋“ค์„ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋ณต์‚ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” properties ๊ฐ์ฒด์˜ ์†์„ฑ๋“ค์„ ์ƒ์„ฑ๋œ ํƒœ๊ทธ(element)์— ๋ณต์‚ฌํ•˜์—ฌ, ํƒœ๊ทธ์˜ ์†์„ฑ์„ ์„ค์ •ํ•œ๋‹ค.

 

 

โœจ ๋ฆฌํŒฉํ† ๋งํ•œ createElement ์‚ฌ์šฉํ•˜๊ธฐ

children ์š”์†Œ๊ฐ€ ๋Š์ž„ ์—†์ด ์ƒ๊ฒจ ๋ฌดํ•œ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ๋ฐœ์ƒ..

๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด header, inputContainer, itemContainer์˜ ํฐ ๋ฉ์–ด๋ฆฌ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค.

      const app = createElement({
        tagName: "div",
        properties: { id: "app" },
        parent: document.body,
      });

      const header = createElement({
        tagName: "header",
        properties: { id: "header" },
        parent: app,
        children: [
          {
            tagName: "div",
            properties: { className: "counter" },
            children: [
              {
                tagName: "span",
                properties: { textContent: "total" },
              },
              {
                tagName: "span",
                properties: { textContent: "0" },
              },
              {
                tagName: "span",
                properties: { textContent: "completed" },
              },
              {
                tagName: "span",
                properties: { textContent: "0" },
              },
            ],
          },
          {
            tagName: "h1",
            properties: { textContent: "T๐ŸŒž D๐ŸŽฏ LIST", className: "title" },
          },

          {
            tagName: "span",
            properties: { textContent: "ํ•  ์ผ์„ ๊ธฐ๋กํ•˜์„ธ์š”๐ŸŒฑ" },
          },
        ],
      });
      
      // ์ดํ›„ ์ƒ๋žต..

 


์ฐธ๊ณ ๐Ÿง

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

 

Object.assign() - JavaScript | MDN

Object.assign() ๋ฉ”์„œ๋“œ๋Š” ์ถœ์ฒ˜ ๊ฐ์ฒด๋“ค์˜ ๋ชจ๋“  ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ์ž์ฒด ์†์„ฑ์„ ๋ณต์‚ฌํ•ด ๋Œ€์ƒ ๊ฐ์ฒด์— ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ›„ ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

developer.mozilla.org

 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

๋ฆฌ์•กํŠธ๋งŒ ํ•˜๋‹ค๋ณด๋‹ˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ง€์‹์ด ๋ชจ๋‘ ์ฆ๋ฐœํ•ด๋ฒ„๋ฆฐ ๋Š๋‚Œ....

๋ฉ”์„œ๋“œ๋ช…๋“ค์„ ์ฃ„๋‹ค ๊นŒ๋จน์–ด๋ฒ„๋ฆฐ ๊ฒƒ ๊ฐ™๋‹ค. ๊ธ‰ํ•˜๊ฒŒ ํˆฌ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ฉฐ ๊ธฐ์–ตํ•ด๋‚ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

DOM์„ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์„ ํƒํ•ด์•ผ ํ•  ์ง€ ๊ณ ๋ฏผ์ด ๋˜์—ˆ๋‹ค.

๋งค๋ฒˆ ๊นŒ๋จน์–ด์„œ ๋งค๋ฒˆ ๊ณ ๋ฏผํ•˜๊ณ  ๋งค๋ฒˆ ๊ฒ€์ƒ‰ํ•˜๊ณ !!! ์ง€๊ฒจ์›Œ... ์ด๋ฒˆ์—” ์ •๋ฆฌํ•ด๋†”์•ผ์ง€.


ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ๋ฅผ ๋‹ค๋ฃจ๊ธฐ:  innerText,textContent

๐Ÿ“š innerText

  • ์š”์†Œ์˜ ๋ Œ๋”๋ง๋œ ํ…์ŠคํŠธ๋งŒ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ ํ›„์˜ ํ…์ŠคํŠธ๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.
  • display: none์ด๋‚˜ visibility: hidden์œผ๋กœ ์ˆจ๊ฒจ์ง„ ์š”์†Œ์˜ ํ…์ŠคํŠธ๋„ textContent๋กœ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, innerText๋Š” ์ˆจ๊ฒจ์ง„ ์š”์†Œ์˜ ํ…์ŠคํŠธ๋ฅผ ๋ฌด์‹œํ•œ๋‹ค.
  • textContent๋ณด๋‹ค ๋ Œ๋”๋ง ๊ฒฐ๊ณผ์— ์˜์กดํ•˜๋ฏ€๋กœ ๋ณต์žกํ•œ ๊ตฌ์กฐ์—์„œ๋Š” ์กฐ๊ธˆ ๋” ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค.
  • innerText๋Š” DOM์˜ ์Šคํƒ€์ผ์„ ๊ณ„์‚ฐํ•˜๋ฏ€๋กœ textContent๋ณด๋‹ค ์•ฝ๊ฐ„ ๋Š๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์—†๋‹ค.

๐Ÿ“š textContent

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

HTML ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ฝ์ž…: innerHTML, appendChild, insertAdjacentHTML

๐Ÿ“š innerHTML 

  • ์š”์†Œ ๋‚ด๋ถ€์˜ HTML์ด๋‚˜ XML ๋งˆํฌ์—…์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์„ค์ •ํ•œ๋‹ค.
  • HTML ๋งˆํฌ์—…์„ ํฌํ•จํ•œ ๋ฌธ์ž์—ด์„ ์‰ฝ๊ฒŒ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.
  • ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,  ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ…(XSS) ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๋‹ค.
    • ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ถ”๊ฐ€์ ์œผ๋กœ HTML์„ ์‚ฝ์ž…ํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” insertAdjacentHTML() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•˜๋‹ค.
      ..Why๐Ÿง?
      innerHTML์€ ์š”์†Œ์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ๊ธฐ์กด์˜ ์ž์‹ ์š”์†Œ๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด, insertAdjacentHTML()์€ ๊ธฐ์กด์˜ DOM ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด HTML์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ ๋ฉด์—์„œ ์œ ๋ฆฌํ•˜๋‹ค.

๐Ÿ“š  insertAdjacentHTML() 

  • element.insertAdjacentHTML(position, text)
  • ๊ธฐ์กด ์š”์†Œ๋ฅผ ์œ ์ง€ํ•œ ์ฑ„๋กœ ์ง€์ •๋œ ์œ„์น˜(position)์— HTML ๋ฌธ์ž์—ด์„ ํŒŒ์‹ฑํ•˜์—ฌ ์š”์†Œ๋กœ ์‚ฝ์ž…ํ•œ๋‹ค.
  • insertAdjacentHTML์€ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ํŒŒ์‹ฑํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•ด๋‹น ์š”์†Œ ์•ˆ์˜ ๊ธฐ์กด ์ž์‹ ์š”์†Œ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.
  • HTML์„ ํ•œ ๋ฒˆ์— ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ๋น ๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณด์•ˆ ๋ฌธ์ œ(XSS: Cross-site scripting)๋กœ ์ธํ•ด ์™ธ๋ถ€ ์ž…๋ ฅ์„ ์‚ฝ์ž…ํ•  ๋•Œ๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
const el = document.getElementById('el')
el.insertAdjacentHTML('beforebegin', '<span>Before Begin</span>');// el ์ด์ „์— ์‚ฝ์ž…
el.insertAdjacentHTML('afterbegin', '<span>After Begin</span>'); // el์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ์ด์ „์— ์‚ฝ์ž…
el.insertAdjacentHTML('beforeend', '<span>Before End</span>'); // el์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ์ดํ›„์— ์‚ฝ์ž… 
el.insertAdjacentHTML('afterend', '<span>After End</span>'); // el ์ดํ›„์— ์‚ฝ์ž…
<span> --A-- </span>
<span>Before Begin</span> 
<span id="el"> 
	<span>After Begin</span> 
    <span> --B-- </span>
    --C-- 
    <span> --D-- </span> 
    <span>Before End</span> 
 </span> 
 <span>After End</span> 
 <span> --E-- </span>

 

๐Ÿ“š appendChild()

  • ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์š”์†Œ๋ฅผ ๊ธฐ์กด DOM์˜ ์ž์‹์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ์ง๊ด€์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€ ๋ณด์ˆ˜์™€ ๊ฐ€๋…์„ฑ์ด ๋›ฐ์–ด๋‚˜๋‹ค.
  • ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ํ•œ ๋ฒˆ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ์„ฑ๋Šฅ์ด ์–‘ํ˜ธํ•˜๋‹ค.

โœจ ๊ฒฐ๋ก 

innerText vs textContent

innerText๋Š” ๋ Œ๋”๋ง๋œ ํ…์ŠคํŠธ๋งŒ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ€์ผ์— ์˜์กด์ ์ด๋‹ค. ๋˜ํ•œ ์ˆจ๊ฒจ์ง„ ์š”์†Œ์˜ ํ…์ŠคํŠธ๋Š” ๋ฌด์‹œ๋˜๋ฏ€๋กœ, ์ˆœ์ˆ˜ํ•œ ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ์—์„œ๋Š” textContent๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋”์šฑ ๋น ๋ฅด๊ณ  ๋‹จ์ˆœํ•˜๋‹ค. DOM ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๊ณ  ์ˆœ์ˆ˜ ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค. 

 

innerHTML vs insertAdjacentHTML vs appendChild

innerHTML์€ ๊ธฐ์กด์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋ฎ์–ด์“ฐ๊ธฐ ๋•Œ๋ฌธ์—, ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค. insertAdjacentHTML์€ ๊ธฐ์กด ์š”์†Œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด HTML์„ ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. (์ž์‹์š”์†Œ์˜ ํŒŒ์‹ฑ๊ณผ์ •์ด ์ƒ๋žต๋˜์–ด ๋” ๋น ๋ฅด๊ณ  ์„ฑ๋Šฅโฌ†)

 

ํ•˜์ง€๋งŒ insertAdjacentHTML๊ณผ innerHTML์€ XSS ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด appendChild๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€๋‹ค. ์„ฑ๋Šฅ ๋ฉด์—์„œ๋„ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์—์„œ๋Š” ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋œ๋‹ค.

 


๐Ÿง ์ฐธ๊ณ 
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText
https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent

https://developer.mozilla.org/ko/docs/Web/API/Element/innerHTML

https://developer.mozilla.org/ko/docs/Web/API/Element/insertAdjacentHTML

https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

# ์š”์•ฝ

  • ๋‹จ์ˆœํžˆ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ โžก forEach (์›๋ณธ ๋ฐฐ์—ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ / ์ƒˆ๋กœ์šด ๋ฐฐ์—ด ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ)
  • ์›๋ณธ ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ณ€ํ˜•๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋”ฐ๋กœ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ โžก map (์›๋ณธ ๋ฐฐ์—ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ / ์ƒˆ๋กœ์šด ๋ฐฐ์—ด ๋ฐ˜ํ™˜)

โœ… forEach

  • ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
const numbers = [1, 2, 3];
numbers.forEach(num => {
  console.log(num * 2); // 2, 4, 6 ์ถœ๋ ฅ
});
console.log(numbers); // [1, 2, 3] ์›๋ณธ ๋ฐฐ์—ด์€ ๊ทธ๋Œ€๋กœ!
  • forEach๋Š” ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ์š”์†Œ๋ฅผ 2๋ฐฐ๋กœ ๊ณ„์‚ฐํ•ด์„œ ์ถœ๋ ฅํ•˜์ง€๋งŒ, ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    (์›๋ณธ ๋ฐฐ์—ด์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ)
  • ์›๋ณธ ๋ฐฐ์—ด์„ ์œ ์ง€ํ•˜๋ฉด์„œ, ๋‹จ์ˆœํžˆ ๋ฐ˜๋ณต ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ(๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜, ๋กœ๊ทธ ์ฐ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ๋จ)

โœ… map

  • ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
const numbers = [1, 2, 3];
const doubled = numbers.map(num => num * 2);
console.log(doubled); // [2, 4, 6] ๋ณ€ํ˜•๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
console.log(numbers); // [1, 2, 3] ์›๋ณธ ๋ฐฐ์—ด์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€!
  • map์€ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ์š”์†Œ๋ฅผ 2๋ฐฐ๋กœ ๋งŒ๋“ค์–ด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์›๋ณธ ๋ฐฐ์—ด์„ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•œ๋‹ค.
    โžก ์›๋ณธ ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ ์†์‹ค ๋ง‰์„ ์ˆ˜ ์žˆ๊ณ , ๋ณ€ํ˜•๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์–ด๋”˜๊ฐ€ ์ €์žฅํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
    (ex: ๊ฐ€๊ฒฉ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ˜•ํ•ด์„œ ํ• ์ธ๊ฐ€๋ฅผ ๊ณ„์‚ฐํ•œ ํ›„, ์ด๋ฅผ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด๋กœ ์ €์žฅ ๊ฐ€๋Šฅ)

 

๐Ÿ”ฅ map์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ƒํ™ฉ์—์„œ forEach๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

1. ๋ณ€ํ˜•๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋‹ค.

forEach๋Š” ๋‹จ์ˆœํžˆ ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋ฟ์ด๋ฏ€๋กœ, ๋ณ€ํ˜•๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

const numbers = [1, 2, 3];
const doubled = numbers.forEach(num => num * 2);
console.log(doubled); // undefined

forEach๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— doubled ๋ณ€์ˆ˜๋Š” undefined๊ฐ€ ๋œ๋‹ค.
๋ณ€ํ˜•๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์—ด๋กœ ์–ป์œผ๋ ค๋Š” ์ƒํ™ฉ์—์„œ forEach๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋ฐ์ดํ„ฐ๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค.

const numbers = [1, 2, 3];
numbers.forEach(num => {
  num = num * 2; // ์ž‘์—…์€ ์ˆ˜ํ–‰๋˜์ง€๋งŒ
});
console.log(numbers); // [1, 2, 3] ์›๋ณธ ๋ฐฐ์—ด์€ ์—ฌ์ „ํžˆ ๊ทธ๋Œ€๋กœ

๋ณ€ํ˜•๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ์žฌ์‚ฌ์šฉ๋„ ๋‹น์—ฐ ๋ถˆ๊ฐ€..

2. ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

map์€ "๋ณ€ํ˜•๋œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜"ํ•˜๋Š” ๋ช…ํ™•ํ•œ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์‚ฌ์šฉ๋œ๋‹ค. ๋ฐ˜๋ฉด, forEach๋Š” ์ฃผ๋กœ "๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰"ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋Ÿฐ ์ฐจ์ด๋ฅผ ๋ฌด์‹œํ•˜๊ณ  forEach๋ฅผ ๋ณ€ํ˜• ์ž‘์—…์— ์‚ฌ์šฉํ•˜๋ฉด, ์ฝ”๋“œ์˜ ์˜๋„๊ฐ€ ๋ถˆ๋ถ„๋ช…ํ•ด์ง€๊ณ , ์ด๋Š” ๊ฒฐ๊ตญ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

const numbers = [1, 2, 3];
let doubled = [];
numbers.forEach(num => {
  doubled.push(num * 2);
});

forEach๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ง์ ‘ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ๊ฐ์˜ ์š”์†Œ๋ฅผ ๋ฐฐ์—ด์— ๋„ฃ๋Š” ์ž‘์—…์„ ํ•ด์•ผ ํ•œ๋‹ค. ์ฝ”๋“œ๋Š” ๋ณต์žกํ•ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์€ ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฒฝ์šฐ map์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ง๊ด€์ ์ด๊ณ  ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•˜๋‹ค.

๋ฐ˜์‘ํ˜•

+ Recent posts