πŸ’» FE

생성!

Roy Miller 2025. 5. 16. 15:18

 

 

Element: insertAdjacentHTML() λ©”μ„œλ“œ - Web API | MDN

Element μΈν„°νŽ˜μ΄μŠ€μ˜ insertAdjacentHTML() λ©”μ„œλ“œλŠ” μ§€μ •λœ ν…μŠ€νŠΈλ₯Ό HTML ν˜Ήμ€ XML둜 νŒŒμ‹±ν•˜κ³  κ²°κ³Ό λ…Έλ“œλ“€μ„ μ§€μ •λœ μœ„μΉ˜μ˜ DOM νŠΈλ¦¬μ— μ‚½μž…ν•©λ‹ˆλ‹€.

developer.mozilla.org

λͺ¨λ“  것이 μž¬λ Œμ €λ§ λ˜μ§€ μ•ŠμŒ.

 

"beforebegin"

μš”μ†Œ 이전에 μœ„μΉ˜ν•©λ‹ˆλ‹€. 였직 μš”μ†Œκ°€ DOM νŠΈλ¦¬μ— 있고 λΆ€λͺ¨ μš”μ†Œλ₯Ό κ°€μ§€κ³  μžˆμ„ λ•Œλ§Œ μœ νš¨ν•©λ‹ˆλ‹€.

 

"afterbegin"

μš”μ†Œ λ°”λ‘œ μ•ˆμ—μ„œ 처음 μžμ‹ 이전에 μœ„μΉ˜ν•©λ‹ˆλ‹€.

"beforeend"

μš”μ†Œ λ°”λ‘œ μ•ˆμ—μ„œ λ§ˆμ§€λ§‰ μžμ‹ 이후에 μœ„μΉ˜ν•©λ‹ˆλ‹€.

 

"afterend"

μš”μ†Œ 이후에 μœ„μΉ˜ν•©λ‹ˆλ‹€. 였직 μš”μ†Œκ°€ DOM νŠΈλ¦¬μ— 있고 λΆ€λͺ¨ μš”μ†Œλ₯Ό κ°€μ§€κ³  μžˆμ„ λ•Œλ§Œ μœ νš¨ν•©λ‹ˆλ‹€.

 

μ›Ή λΈŒλΌμš°μ €κ°€ HTML νŽ˜μ΄μ§€λ₯Ό ν‘œμ‹œν•˜λŠ” 과정은 크게 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. νŒŒμ‹±(Parsing): HTML μ½”λ“œλ₯Ό 읽어 DOM 트리(λ¬Έμ„œ 객체 λͺ¨λΈ)λ₯Ό λ§Œλ“­λ‹ˆλ‹€.
  2. λ Œλ”λ§(Rendering): DOM 트리λ₯Ό 기반으둜 화면에 μ‹€μ œλ‘œ μš”μ†Œλ₯Ό κ·Έλ¦¬λŠ” κ³Όμ •μž…λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” μš”μ†Œμ˜ 크기, μœ„μΉ˜, 색상 등을 κ³„μ‚°ν•˜λŠ” **λ ˆμ΄μ•„μ›ƒ(Layout/Reflow)**κ³Ό κ³„μ‚°λœ 정보λ₯Ό λ°”νƒ•μœΌλ‘œ 픽셀을 μ±„μ›Œλ„£λŠ” **νŽ˜μΈνŒ…(Painting/Repaint)**이 ν¬ν•¨λ©λ‹ˆλ‹€.

insertAdjacentHTML()κ³Ό 같은 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  λ•Œ "λͺ¨λ“  것이 μž¬λ Œλ”λ§ λ˜μ§€ μ•ŠμŒ"의 μ˜λ―ΈλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 효율적인 DOM μ‘°μž‘: innerHTML = 'μƒˆλ‘œμš΄ HTML'처럼 νŠΉμ • μš”μ†Œμ˜ innerHTML 속성을 ν†΅μ§Έλ‘œ λ°”κΎΈλ©΄, λΈŒλΌμš°μ €λŠ” ν•΄λ‹Ή μš”μ†Œμ˜ λͺ¨λ“  κΈ°μ‘΄ μžμ‹μ„ μ œκ±°ν•˜κ³ , μƒˆλ‘œμš΄ HTML λ¬Έμžμ—΄μ„ λ‹€μ‹œ νŒŒμ‹±ν•˜μ—¬ μƒˆλ‘œμš΄ DOM λ…Έλ“œλ₯Ό λ§Œλ“€κ³ , κ·Έ 뢀뢄을 μ²˜μŒλΆ€ν„° λ‹€μ‹œ λ Œλ”λ§ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 과정은 λ•Œλ•Œλ‘œ λΉ„νš¨μœ¨μ μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 뢀뢄적인 μ—…λ°μ΄νŠΈ: 반면 insertAdjacentHTML()은 이미 μ‘΄μž¬ν•˜λŠ” μš”μ†Œμ˜ νŠΉμ • μœ„μΉ˜(beforebegin, afterbegin, beforeend, afterend)에 μƒˆλ‘œμš΄ HTML λ¬Έμžμ—΄μ„ μ‚½μž…ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. μ΄λŠ” 마치 κΈ°μ‘΄ DOM νŠΈλ¦¬μ— μƒˆλ‘œμš΄ λ‚˜λ­‡κ°€μ§€λ‚˜ μžŽμ„ λ§λΆ™μ΄λŠ” 것과 κ°™μŠ΅λ‹ˆλ‹€. λΈŒλΌμš°μ €λŠ” μƒˆλ‘œ μ‚½μž…λœ λ‚΄μš©κ³Ό κ·Έ 주변에 영ν–₯을 λ°›λŠ” μ΅œμ†Œν•œμ˜ λΆ€λΆ„λ§Œ λ ˆμ΄μ•„μ›ƒμ„ λ‹€μ‹œ κ³„μ‚°ν•˜κ³  λ‹€μ‹œ 그리면 λ©λ‹ˆλ‹€. 전체λ₯Ό λ‹€μ‹œ 그릴 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

결둠적으둜, "λͺ¨λ“  것이 μž¬λ Œλ”λ§ λ˜μ§€ μ•ŠμŒ"은 insertAdjacentHTML() λ©”μ„œλ“œκ°€ DOM을 μ‘°μž‘ν•  λ•Œ λΆˆν•„μš”ν•œ λΉ„μš©μ΄ 큰 전체 λ˜λŠ” κ΄‘λ²”μœ„ν•œ μ˜μ—­μ˜ μž¬κ³„μ‚° 및 재그리기λ₯Ό μœ λ°œν•˜μ§€ μ•Šκ³ , ν•„μš”ν•œ λΆ€λΆ„λ§Œ 효율적으둜 μ—…λ°μ΄νŠΈν•œλ‹€λŠ” 것을 κ°•μ‘°ν•˜λŠ” λ§μž…λ‹ˆλ‹€. μ΄λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯ μ΅œμ ν™”μ— μ€‘μš”ν•œ μš”μ†Œμž…λ‹ˆλ‹€.

 

λ²— μ΄λŸ°μ‹μ€ μ½”λ“œ λ³΅μž‘ν•΄μ§. 


 

 

 

Document.createElement() - Web API | MDN

HTML λ¬Έμ„œμ—μ„œ, Document.createElement() λ©”μ„œλ“œλŠ” μ§€μ •ν•œ tagName의 HTML μš”μ†Œλ₯Ό λ§Œλ“€μ–΄ λ°˜ν™˜ν•©λ‹ˆλ‹€. tagName을 인식할 수 μ—†μœΌλ©΄ HTMLUnknownElementλ₯Ό λŒ€μ‹  λ°˜ν™˜ν•©λ‹ˆλ‹€.

developer.mozilla.org

function addElement() {
  // create a new div element
  var newDiv = document.createElement("div");
  // and give it some content
  var newContent = document.createTextNode("ν™˜μ˜ν•©λ‹ˆλ‹€!");
  // add the text node to the newly created div
  newDiv.appendChild(newContent);

  // add the newly created element and its content into the DOM
  var currentDiv = document.getElementById("div1");
  document.body.insertBefore(newDiv, currentDiv);
}

append()와 appendChild()λŠ” λͺ¨λ‘ DOM(λ¬Έμ„œ 객체 λͺ¨λΈ)에 μžμ‹ λ…Έλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œμ΄μ§€λ§Œ, μ€‘μš”ν•œ 차이점이 μžˆμ–΄ μ–΄λ–€ 상황에 더 μ ν•©ν•œμ§€κ°€ λ‹¬λΌμ§‘λ‹ˆλ‹€.

μ£Όμš” 차이점

  1. 인자(Arguments):
    • appendChild(node):
      • 였직 ν•˜λ‚˜μ˜ Node 객체만 인자둜 받을 수 μžˆμŠ΅λ‹ˆλ‹€.
      • ν…μŠ€νŠΈ λ¬Έμžμ—΄(DOMString)을 직접 μ‚½μž…ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λ¬Έμžμ—΄μ„ μ‚½μž…ν•˜λ €λ©΄ λ¨Όμ € document.createTextNode()λ₯Ό μ‚¬μš©ν•˜μ—¬ ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό 생성해야 ν•©λ‹ˆλ‹€.
    • append(node1, node2, ..., string1, string2, ...):
      • μ—¬λŸ¬ 개의 인자λ₯Ό λ™μ‹œμ— 받을 수 μžˆμŠ΅λ‹ˆλ‹€.
      • Node 객체뿐만 μ•„λ‹ˆλΌ **ν…μŠ€νŠΈ λ¬Έμžμ—΄(DOMString)**도 인자둜 직접 받을 수 μžˆμŠ΅λ‹ˆλ‹€. λ¬Έμžμ—΄μ€ μžλ™μœΌλ‘œ Text λ…Έλ“œλ‘œ λ³€ν™˜λ˜μ–΄ μ‚½μž…λ©λ‹ˆλ‹€.
  2. λ°˜ν™˜ κ°’(Return Value):
    • appendChild(): μΆ”κ°€λœ Node 객체 자체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • append(): undefinedλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  3. ν˜Έν™˜μ„±:
    • appendChild(): 비ꡐ적 였래된 ν‘œμ€€μ΄λ©°, λͺ¨λ“  μ£Όμš” λΈŒλΌμš°μ €μ—μ„œ κ΄‘λ²”μœ„ν•˜κ²Œ μ§€μ›λ©λ‹ˆλ‹€.
    • append(): 비ꡐ적 μ΅œμ‹  ν‘œμ€€(DOM Living Standard)에 μΆ”κ°€λœ λ©”μ„œλ“œλ‘œ, ν˜„λŒ€ λΈŒλΌμš°μ €μ—μ„œλŠ” λŒ€λΆ€λΆ„ μ§€μ›λ˜μ§€λ§Œ, μ•„μ£Ό 였래된 λΈŒλΌμš°μ €μ—μ„œλŠ” μ§€μ›λ˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ–Έμ œ 무엇을 μ‚¬μš©ν• κΉŒ?

μ΄λŸ¬ν•œ 차이점을 λ°”νƒ•μœΌλ‘œ λ‹€μŒκ³Ό 같은 κ²½μš°μ— 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.

appendChild()λ₯Ό μ‚¬μš©ν•˜λŠ” 경우:

  • 단 ν•˜λ‚˜μ˜ Node 객체만 μΆ”κ°€ν•  λ•Œ: ν•˜λ‚˜μ˜ μš”μ†Œλ₯Ό DOM에 μΆ”κ°€ν•  λ•Œ κ°€μž₯ 기본적인 λ°©λ²•μž…λ‹ˆλ‹€.
  • μΆ”κ°€λœ Node 객체λ₯Ό λ°˜ν™˜λ°›μ•„ 좔가적인 μž‘μ—…μ„ ν•  λ•Œ: 예λ₯Ό λ“€μ–΄, λ…Έλ“œλ₯Ό 좔가함과 λ™μ‹œμ— κ·Έ λ…Έλ“œμ— 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό λΆ™μ΄κ±°λ‚˜ μŠ€νƒ€μΌμ„ μ μš©ν•΄μ•Ό ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.
    JavaScript
     
    const parent = document.getElementById('parent');
    const newDiv = document.createElement('div');
    newDiv.textContent = 'μƒˆλ‘œμš΄ λ‚΄μš©';
    
    const appendedNode = parent.appendChild(newDiv); // newDivκ°€ λ°˜ν™˜λ¨
    appendedNode.classList.add('highlight'); // λ°˜ν™˜λœ λ…Έλ“œμ— λ°”λ‘œ μž‘μ—…
    
  • κ΅¬ν˜• λΈŒλΌμš°μ € ν™˜κ²½μ„ 지원해야 ν•  λ•Œ: 넓은 λΈŒλΌμš°μ € ν˜Έν™˜μ„±μ΄ ν•„μš”ν•œ κ²½μš°μ— μ•ˆμ „ν•œ μ„ νƒμž…λ‹ˆλ‹€.

append()λ₯Ό μ‚¬μš©ν•˜λŠ” 경우:

  • μ—¬λŸ¬ 개의 Node κ°μ²΄λ‚˜ ν…μŠ€νŠΈ λ¬Έμžμ—΄μ„ λ™μ‹œμ— μΆ”κ°€ν•  λ•Œ: μ½”λ“œλ₯Ό 더 κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    JavaScript
     
    const parent = document.getElementById('parent');
    const newDiv = document.createElement('div');
    newDiv.textContent = 'μƒˆλ‘œμš΄ λ””λΈŒ';
    const newSpan = document.createElement('span');
    newSpan.textContent = 'μƒˆλ‘œμš΄ 슀팬';
    
    parent.append('μ‹œμž‘ ν…μŠ€νŠΈ ', newDiv, newSpan, ' 끝 ν…μŠ€νŠΈ');
    // <div id="parent">μ‹œμž‘ ν…μŠ€νŠΈ <div>μƒˆλ‘œμš΄ λ””λΈŒ</div><span>μƒˆλ‘œμš΄ 슀팬</span> 끝 ν…μŠ€νŠΈ</div>
    
  • ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μƒμ„±ν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ„ ν”Όν•˜κ³  싢을 λ•Œ: λ¬Έμžμ—΄μ„ λ°”λ‘œ μ‚½μž…ν•  수 μžˆμ–΄ νŽΈλ¦¬ν•©λ‹ˆλ‹€.
  • μ΅œμ‹  μžλ°”μŠ€ν¬λ¦½νŠΈ λ¬Έλ²•μ˜ 간결성을 μ„ ν˜Έν•  λ•Œ: μ½”λ“œκ°€ 더 읽기 쉽고 μ§§μ•„μ§‘λ‹ˆλ‹€.

κ²°λ‘ :

ν˜„λŒ€ μ›Ή 개발 ν™˜κ²½μ—μ„œλŠ” μ—¬λŸ¬ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ ν…μŠ€νŠΈλ₯Ό λ°”λ‘œ μ‚½μž…ν•˜λŠ” μœ μ—°μ„±κ³Ό κ°„κ²°μ„± λ•Œλ¬Έμ— **append()**κ°€ μ„ ν˜Έλ˜λŠ” κ²½ν–₯이 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μΆ”κ°€λœ λ…Έλ“œμ— λŒ€ν•œ 즉각적인 μ°Έμ‘°κ°€ ν•„μš”ν•˜κ±°λ‚˜ κ΅¬ν˜• λΈŒλΌμš°μ €λ₯Ό 지원해야 ν•˜λŠ” νŠΉμ • μƒν™©μ—μ„œλŠ” **appendChild()**κ°€ μ—¬μ „νžˆ μœ μš©ν•©λ‹ˆ


append(), prepend(), before() 이 μ„Έ κ°€μ§€ λ©”μ„œλ“œμ˜ 곡톡점은 λͺ¨λ‘ DOM(λ¬Έμ„œ 객체 λͺ¨λΈ)에 μƒˆλ‘œμš΄ λ…Έλ“œλ‚˜ ν…μŠ€νŠΈλ₯Ό **μ‚½μž…(insert)**ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ν˜„λŒ€μ˜(Modern) DOM μ‘°μž‘ λ©”μ„œλ“œλΌλŠ” κ²ƒμž…λ‹ˆλ‹€.

ꡬ체적인 곡톡점은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. μ—¬λŸ¬ 개의 인자λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€ (닀쀑 인자 지원):
    • append(): λΆ€λͺ¨ μš”μ†Œμ˜ λ§ˆμ§€λ§‰ μžμ‹μœΌλ‘œ μ—¬λŸ¬ 개의 λ…Έλ“œλ‚˜ ν…μŠ€νŠΈλ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • prepend(): λΆ€λͺ¨ μš”μ†Œμ˜ 첫 번째 μžμ‹μœΌλ‘œ μ—¬λŸ¬ 개의 λ…Έλ“œλ‚˜ ν…μŠ€νŠΈλ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • before(): λŒ€μƒ μš”μ†Œμ˜ λ°”λ‘œ μ•žμ— ν˜•μ œ μš”μ†Œλ‘œ μ—¬λŸ¬ 개의 λ…Έλ“œλ‚˜ ν…μŠ€νŠΈλ₯Ό μ‚½μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ΄λŠ” appendChild()κ°€ 였직 ν•˜λ‚˜μ˜ λ…Έλ“œλ§Œ μΆ”κ°€ν•  수 μžˆλ‹€λŠ” 점과 λŒ€λΉ„λ©λ‹ˆλ‹€.
  2. Node 객체와 DOMString(ν…μŠ€νŠΈ λ¬Έμžμ—΄)을 λͺ¨λ‘ 인자둜 받을 수 μžˆμŠ΅λ‹ˆλ‹€:
    • 이 μ„Έ λ©”μ„œλ“œλŠ” 인자둜 document.createElement()둜 λ§Œλ“  Node 객체뿐만 μ•„λ‹ˆλΌ, 일반적인 ν…μŠ€νŠΈ λ¬Έμžμ—΄λ„ 직접 받을 수 μžˆμŠ΅λ‹ˆλ‹€. ν…μŠ€νŠΈ λ¬Έμžμ—΄μ€ μžλ™μœΌλ‘œ Text λ…Έλ“œλ‘œ λ³€ν™˜λ˜μ–΄ μ‚½μž…λ©λ‹ˆλ‹€.
    • μ΄λŠ” appendChild()κ°€ ν…μŠ€νŠΈ λ¬Έμžμ—΄μ„ 직접 받을 수 μ—†κ³ , document.createTextNode()λ₯Ό 톡해 ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό 미리 생성해야 ν–ˆλ˜ 것과 λ‹€λ¦…λ‹ˆλ‹€.
  3. λͺ¨λ‘ undefinedλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€:
    • μ„Έ λ©”μ„œλ“œ λͺ¨λ‘ μž‘μ—…μ„ μˆ˜ν–‰ν•œ ν›„ νŠΉλ³„ν•œ 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (μ΄λŠ” appendChild()κ°€ μΆ”κ°€λœ λ…Έλ“œλ₯Ό λ°˜ν™˜ν•˜λŠ” 것과 λ‹€λ¦…λ‹ˆλ‹€.)

μ •λ¦¬ν•˜μžλ©΄, 이 λ©”μ„œλ“œλ“€μ€ 기쑴의 appendChild()λ‚˜ insertBefore()보닀 더 μœ μ—°ν•˜κ³  κ°„κ²°ν•˜κ²Œ DOM에 μš”μ†Œλ₯Ό μΆ”κ°€ν•  수 μžˆλ„λ‘ μ„€κ³„λœ ν˜„λŒ€μ μΈ DOM μ‘°μž‘ API의 μΌλΆ€μž…λ‹ˆλ‹€. 각각 μ‚½μž…λ˜λŠ” μœ„μΉ˜(끝, μ‹œμž‘, 이전)λŠ” λ‹€λ₯΄μ§€λ§Œ, 인자λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방식과 λ°˜ν™˜ 값이 λ™μΌν•˜λ‹€λŠ” 곡톡점이 μžˆμŠ΅λ‹ˆλ‹€.