[JavaScript] DOM - CRUD

Hannahhhยท2022๋…„ 7์›” 14์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
20/47

๐Ÿ” DOM - CRUD

document ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ HTML element๋ฅผ ๋งŒ๋“ค๊ณ (CREATE), ์กฐํšŒํ•˜๊ณ (READ), ๊ฐฑ์‹ ํ•˜๊ณ (UPDATE), ์‚ญ์ œํ•˜๋Š”(DELETE) ๋ฐฉ๋ฒ•์„ ์‹ค์Šต ํ›„, ์ •๋ฆฌํ•œ๋‹ค.

  • ์‹ค์Šต repository๋Š” ์ฝ”๋“œ ์Šคํ…Œ์ด์ธ ์—์„œ ์ œ๊ณต๋ฐ›์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.(html, css)
  • ์‹ค์Šต ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›์€ ํ›„, htmlํŒŒ์ผ์„ ํฌ๋กฌ์—์„œ ์—ด๊ณ  ๊ฐœ๋ฐœ์ž๋„๊ตฌ์˜ console ํƒญ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์‹ค์Šตํ–ˆ๋‹ค.



โœ” CREATE

DOM์œผ๋กœ ์ƒˆ๋กœ์šด HTML element๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

document.createElement('div')  // ์ƒˆ๋กœ์šด <div>์š”์†Œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

// ์œ„์—์„œ ์ƒ์„ฑํ•œ <div>์š”์†Œ๋ฅผ ๋ณ€์ˆ˜ tweetDiv์— ํ• ๋‹นํ•œ๋‹ค.
const tweetDiv = document.creatElement('Div')  

์œ„์— ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด๋„ ์ƒ์„ฑ๋งŒ ๋˜์—ˆ์„ ๋ฟ, ์—ฐ๊ฒฐ์€ ๋˜์–ด์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์š”์†Œ๋Š” '๊ณต์ค‘์— ๋– ์žˆ๋Š” ์ƒํƒœ'์ด๋‹ค. ๋”ฐ๋ผ์„œ, ํ™”๋ฉด์— ๋ณ€ํ™”๋Š” ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.



โœ” APPEND

DOM์œผ๋กœ ์ƒ์„ฑ๋œ HTML element๋ฅผ ๋ถ€๋ชจ ๋…ธ๋“œ์— ํฌํ•จํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.


//์œ„์—์„œ ์ƒ์„ฑํ•œ <div>์š”์†Œ๋ฅผ ๋‹ด์€ ๋ณ€์ˆ˜ tweetDiv๋ฅผ <body>์š”์†Œ์— appendํ•œ๋‹ค.
doucument.body.append(tweetDiv)  

ํฌ๋กฌ์˜ ๊ฐœ๋ฐœ์ž๋„๊ตฌ -> Elements ํƒญ์—์„œ <body>์š”์†Œ์— <div>์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.



โœ” READ

DOM์œผ๋กœ HTML element๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

querySelector์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์…€๋ ‰ํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ element์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, HTML ์š”์†Œ('div'), id('#tweetList'), class('.tweet') ์„ธ ๊ฐ€์ง€๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.


// ํด๋ž˜์Šค ์ด๋ฆ„์ด tweet์ธ HTML ์š”์†Œ๋ฅผ ์กฐํšŒํ•œ๋‹ค.
const oneTweet = document.querySelector('.tweet')

// ํด๋ž˜์Šค ์ด๋ฆ„์ด tweet์ธ ์š”์†Œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์†Œ๋ฅผ ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์˜ค์ž.
// ํด๋ž˜์Šค ์ด๋ฆ„์ด tweet์ธ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์œ ์‚ฌ๋ฐฐ์—ด๋กœ ๋ฐ›์•„์˜จ๋‹ค.
const tweets = document.querySelectorAll('.tweet')
  • ์œ ์‚ฌ ๋ฐฐ์—ด?
    querySelectorAll์„ ์ด์šฉํ•ด ์กฐํšŒํ•œ ์š”์†Œ๋“ค์€ ๋ฐฐ์—ด์ฒ˜๋Ÿผ for๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, ๋ฐฐ์—ด์ด ์•„๋‹ˆ๋ผ ์œ ์‚ฌ ๋ฐฐ์—ด(aka.๋ฐฐ์—ด์ด ์•„๋‹Œ ๋ฐฐ์—ด, ๋ฐฐ์—ดํ˜• ๊ฐ์ฒด ๋“ฑ)์ด๋‹ค. (์ •์‹๋ช…์นญ์€ Array like Object)

Internet Explorer์™€ ๊ฐ™์ด ์ด์ „ ๋ฒ„์ „์˜ ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ์„ ์‹ ๊ฒฝ ์จ์•ผ ํ•œ๋‹ค๋ฉด, ์˜›๋‚  ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์•„๋ž˜๋Š” get์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” DOM ์กฐํšŒ ๋ฉ”์„œ๋“œ์ด๋‹ค.

const getOneTweet = document.getElementById('container')
const queryOneTweet = document.querySelector('#container')
console.log(getOneTweet === queryOneTweet) // true

CREATE์—์„œ ์ƒ์„ฑํ•œ <div>์š”์†Œ๋Š” <body>์š”์†Œ์— ์œ„์น˜ํ•ด์žˆ๋‹ค. container์— ๋„ฃ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์•ผํ•œ๋‹ค.

// ID์ด๋ฆ„์ด container์ธ HTML ์š”์†Œ๋ฅผ ์กฐํšŒํ•œ๋‹ค.
const container = document.querySelector('#container')

// CREATE์—์„œ ์ƒ์„ฑํ•œ <div>์š”์†Œ๋ฅผ container์˜ ๋งˆ์ง€๋ง‰ ์ž์‹์š”์†Œ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค
container.append(tweetDiv)

ํฌ๋กฌ์˜ ๊ฐœ๋ฐœ์ž๋„๊ตฌ -> Elements ํƒญ์—์„œ <container>์š”์†Œ์— <div>์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.



โœ” UPDATE

DOM์œผ๋กœ HTML Element๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

// UPDATE ์‹ค์Šต์„ ์œ„ํ•ด oneDiv๋ผ๋Š” ์ด๋ฆ„์˜ <div>์š”์†Œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
const oneDiv = document.createElement('div');

console.log(oneDiv) // <div></div>

// textContent๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์—์„œ ์ƒ์„ฑํ•œ <div>์š”์†Œ์— ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•œ๋‹ค.
oneDiv.textContent = 'dev';

console.log(oneDiv) // <div>dev</div>

// ๋‹ค๋ฅธ ์š”์†Œ๋“ค ์ฒ˜๋Ÿผ CSS ์Šคํƒ€์ผ๋ง์ด ์ ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก <div> ์š”์†Œ์— ๊ฐ™์€ ์ด๋ฆ„์˜ class๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
oneDiv.classList.add('tweet')
//oneDiv.setAttribute('class', 'tweet')

console.log(oneDiv) // <div class="tweet">dev</div>

// UPDATE๋œ ๋‚ด์šฉ: ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•˜์—ฌ ํ…์ŠคํŠธ๋ฅผ ์ฑ„์šฐ๊ณ  ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์Šคํƒ€์ผ๋ง์„ ์ ์šฉํ•จ

// append๋ฅผ ์ด์šฉํ•ด container์˜ ์ž์‹์š”์†Œ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.
const container = document.querySelector('#container')

container.append(oneDiv)

append ํ›„, ์ถ”๊ฐ€ํ•œ <div>์š”์†Œ๊ฐ€ tweet์˜ ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ ์ƒํƒœ๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅ๋œ๋‹ค.


setAttribute()

setAttribute()๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑํ•œ ์š”์†Œ์˜ attribute๋ฅผ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

// ์•„์ด๋””๊ฐ€ "javascript"์ด๊ณ , ๋‚ด์šฉ์ด "awesome"์ธ <a>์š”์†Œ๋ฅผ ์ƒ์„ฑ
let aElement = document.createElement('a')
aElement.setAttribute('id', 'javascript') //<a> ์š”์†Œ์˜ ID๊ฐ€ Javascript๊ฐ€ ๋˜๋„๋ก ์„ค์ •
aElement.textContent = 'awesome'



โœ” DELETE

์‚ญ์ œํ•˜๋ ค๋Š” ์š”์†Œ์˜ ์œ„์น˜๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ

// ์•ž์—์„œ ๊ฐ€์žฅ ๋จผ์ € ์ƒ์„ฑํ•œ <div>์š”์†Œ์ธ tweetDiv์„ ์‚ญ์ œํ•œ๋‹ค.
tweetDiv.remove()

๋‹จ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž์‹ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด? ์•„๋ž˜์— ๊ธฐ์ˆ ํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

innerHTML

innerHTML์„ ์ด์šฉํ•ด ๋ชจ๋“  ์ž์‹ ์š”์†Œ๋ฅผ ์ง€์šธ ์ˆ˜ ์žˆ๋‹ค.

// ID ์ด๋ฆ„์ด container์ธ ์ž์‹ ์š”์†Œ๋“ค์„ ์‚ญ์ œํ•œ๋‹ค.
document.querySelector('#container').innerHTML = '';


removeChild & While

๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ์ฝ”๋“œ๋Š” ์ œ๋ชฉ์— ํ•ด๋‹นํ•˜๋Š” H2 'Tweet List'๊นŒ์ง€ ์‚ญ์ œํ•œ๋‹ค.

์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ removeChild์™€ while์„ ์ด์šฉํ•ด ์ž์‹์š”์†Œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

// ID ์ด๋ฆ„์ด container์ธ HTML ์š”์†Œ๋ฅผ ์กฐํšŒํ•œ๋‹ค.
const container = document.querySelector('#container');

// container์˜ ์ž์‹์š”์†Œ๊ฐ€ 1๊ฐœ๋งŒ ๋‚จ์„ ๋•Œ๊นŒ์ง€, ๋งˆ์ง€๋ง‰ ์ž์‹์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
while (container.children.length > 1) {
  container.removeChild(container.lastChild);
}

์ดํ›„, ํ™”๋ฉด์— H2 'Tweet List'๋งŒ ์ถœ๋ ฅ๋œ๋‹ค.


ํŠน์ • class ์ด๋ฆ„์„ ๊ฐ€์ง„ ์š”์†Œ ์ œ๊ฑฐ

// class ์ด๋ฆ„์ด tweet์ธ HTML ์š”์†Œ๋ฅผ ์กฐํšŒํ•œ๋‹ค.
const tweets = document.querySelectorAll('.tweet')

// forEach ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•ด class์ด๋ฆ„์ด tweet์ธ ์š”์†Œ๋“ค์„ ์ œ๊ฑฐํ•œ๋‹ค.
// ์ฐธ๊ณ ๋กœ forEach๋Š” ๋ฐฐ์—ด์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค! (๋‹จ, ์š”์†Œ๋“ค์€ ์œ ์‚ฌ๋ฐฐ์—ด์ผ ๋ฟ ๋ฐฐ์—ด์ด ์•„๋‹˜!)
tweets.forEach(function(tweet){
    tweet.remove();
})

// for ~ of๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ class ์ด๋ฆ„์ด tweet์ธ ์š”์†Œ๋“ค์„ ์ œ๊ฑฐํ•œ๋‹ค.
for (let tweet of tweets){
    tweet.remove()
}

์ œ๋ชฉ์ธ H2 'Tweet List'๋Š” class์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ณ , ์œ„์˜ ์ œ๊ฑฐ๋œ ์š”์†Œ๋“ค๊ณผ ๊ฐ™์€ ID ์ด๋ฆ„์„ ๊ฐ€์กŒ๊ธฐ ๋•Œ๋ฌธ์— ํ™”๋ฉด์— H2 'Tweet List'๋งŒ ์ถœ๋ ฅ๋œ๋‹ค.


โœ” Quiz

aElement๋ฅผ HTML์—์„œ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ๊ณ ๋ฅด์„ธ์š”

<body>
   <div>
    <div>hello</div>
    <div id="world">
      world
      <a id="javascript"></a>
    </div>
    <span id="code">code</span>
    <span>states</span>
  </div>
</body>
let aElement = document.createElement('a')
aElement.setAttribute('id', 'javascript')
aElement.textContent = 'awesome'

1) document.deleteNode(aElement)
=> deleteNode ๋ผ๋Š” ๋ฉ”์„œ๋“œ๋Š” ์—†๋‹ค.

2) aElement.remove()

3) document.querySelector("#world").remove()
=> #world ์˜ ์š”์†Œ๋ฅผ ์ „๋ถ€ ์ง€์šด๋‹ค.

4) document.querySelector("#world").remove(aElement)
=> #world ์˜ ์š”์†Œ๋ฅผ ์ „๋ถ€ ์ง€์šด๋‹ค.

5)document.querySelector("#world").removeChild(aElement)



id๊ฐ€ "world"์ธ
์š”์†Œ์˜ ์ž์‹์œผ๋กœ, ํ…์ŠคํŠธ "world" ๋‹ค์Œ์— ๋ณ€์ˆ˜ aElement๋ฅผ ๋„ฃ๊ณ ์ž ํ•  ๋•Œ, ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฅด์„ธ์š”.

<body>
   <div>
    <div>hello</div>
    <div id="world">world</div>
    <span id="code">code</span>
    <span>states</span>
  </div>
</body>
let aElement = document.createElement('a')
aElement.setAttribute('id', 'javascript')
aElement.textContent = 'awesome'

// TODO : ์ดํ›„์— ์จ์•ผ ํ•  ์ฝ”๋“œ๋ฅผ ์„ ํƒ์ง€์—์„œ ๊ณ ๋ฅด์„ธ์š”.

1) document.querySelector('world').insertBefore(aElement)

=> insertBefore์€ ์ฐธ์กฐ๋œ ๋…ธ๋“œ ์•ž์— ํŠน์ • ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ,๋ฌธ๋ฒ•์€ let insertedNode = parentNode.insertBefore(newNode, referenceNode); ์„ ๋”ฐ๋ฅธ๋‹ค. referenceNode์— ๋ช…์‹œ์ ์œผ๋กœ Node๋‚˜ null์„ ์ „๋‹ฌํ•ด์•ผํ•˜๋Š”๋ฐ, Node์ผ ๊ฒฝ์šฐ ํ•ด๋‹น Node์•ž์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ๊ฐ€ ์‚ฝ์ž…๋˜๊ณ , null์ผ ๊ฒฝ์šฐ ๋…ธ๋“œ ๋ชฉ๋ก ๋์— ์‚ฝ์ž…๋œ๋‹ค.

2) document.querySelector('#world').cloneNode(aElement)
=> cloneNode๋Š” element๋‚˜ node๋ฅผ ๋ณต์ œํ•˜๋Š” ๊ฒƒ์œผ๋กœ , ๋ฌธ๋ฒ•์€ let ๋ณต์ œ๋œ ์ƒˆ๋กœ์šด ๋…ธ๋“œ = ๋ณต์ œ๋˜์–ด์•ผ ํ•  node.cloneNode(deep);์„ ๋”ฐ๋ฅธ๋‹ค.
*deep: ํ•ด๋‹น node์˜ children๊นŒ์ง€ ๋ณต์ œํ•˜๋ ค๋ฉด true, ํ•ด๋‹น node๋งŒ ๋ณต์ œํ•˜๋ ค๋ฉด false


3) document.getElementById('world').appendChild(aElement)

=> appendChild๋Š” ํ•œ ๋…ธ๋“œ๋ฅผ ํŠน์ • ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ ๋ฆฌ์ŠคํŠธ ์ค‘ ๋งˆ์ง€๋ง‰ ์ž์‹์œผ๋กœ ๋ถ™์ด๋Š” ๊ฒƒ์œผ๋กœ, ๋ถ„๋ฒ•์€ let aChild = element.appendChild(aChild);์„ ๋”ฐ๋ฅธ๋‹ค. ๋งŒ์•ฝ ์ฃผ์–ด์ง„ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ๋ฌธ์„œ์— ์กด์žฌํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋…ธ๋“œ๋ฅผ ํ˜„์žฌ ์œ„์น˜์—์„œ ์ƒˆ๋กœ์šด ์œ„์น˜๋กœ ์ด๋™์‹œํ‚จ๋‹ค.


4) document.querySelector('world').prependChild(aElement)

=> prependChild๋ผ๋Š” ๋ฉ”์„œ๋“œ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.


5) document.getElementById('#world').insertAfter(aElement)

=> insertAfter๋ผ๋Š” ๋ฉ”์„œ๋“œ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.




Reference:
์ฝ”๋“œ์Šคํ…Œ์ด์ธ 
MDN

0๊ฐœ์˜ ๋Œ“๊ธ€