๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐ŸŽˆ Chapter 3: ๊ฐ€์ƒ DOM

๊ฐ€์ƒ DOM ์†Œ๊ฐœโ€‹

๊ทธ๋ƒฅ DOM์ด๋ผ๊ณ  ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ € ๋Ÿฐํƒ€์ž„์˜ ๋ฌธ์„œ ๋ชจ๋ธ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. DOM์˜ ๊ฐ€๋ฒผ์šด ๋ณต์‚ฌ๋ณธ์ด ๊ฐ€์ƒ DOM์ธ๋ฐ, ์‹ค์ œ DOM์€ ๋…ธ๋“œ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋˜๊ณ  ๊ฐ€์ƒ DOM์€ ์„ค๋ช… ์—ญํ• ์„ ํ•˜๋Š” ํ‰๋ฒ”ํ•œ JS ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋œ๋‹ค๋Š” ์ ์—์„œ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ๋Š” ์šฐ๋ฆฌ๊ฐ€ setState ๋˜๋Š” ๋‹ค๋ฅธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด UI๋ฅผ ๋ณ€๊ฒฝํ•˜๋ผ๊ณ  ์ง€์‹œํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ€์ƒ DOM์„ ๋จผ์ € ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ, ๊ฐ€์ƒ DOM์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋งž์ถฐ ์‹ค์ œ DOM์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ๊ฐ€๋ฆฌ์ผœ ์žฌ์กฐ์ •(reconciliation)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ƒ DOM์„ ๋จผ์ € ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ด์œ ๋Š” ์‹ค์ œ DOM์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋‹ค์†Œ ๋Š๋ฆฌ๊ณ  ๋น„์šฉ์ด ๋งŽ์ด ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ€์ƒ DOM ์—…๋ฐ์ดํŠธ๋Š” ์‹ค์ œ ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

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

์‹ค์ œ DOMโ€‹

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

์‹ค์ œ DOM์˜ ๋ฌธ์ œ์ โ€‹

์„ฑ๋Šฅ, ๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ํ˜ธํ™˜์„ฑ, ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ ๋“ฑ์ด๋ฉฐ, DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜๋ฉด ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ…(XSS) ์ทจ์Ÿ‰์ ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅโ€‹

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

์ „๋ฐ˜์ ์œผ๋กœ ์‹ค์ œ DOM์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋Š” ํฌ๊ณ  ๋ณต์žกํ•œ ์›น ํŽ˜์ด์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ํฐ ๋ถ€๋‹ด์ด ๋ฉ๋‹ˆ๋‹ค. CSS ์„ ํƒ์ž ์ตœ์ ํ™”, ์ด๋ฒคํŠธ ์œ„์ž„ ์‚ฌ์šฉ, ์ฝ๊ธฐ/์“ฐ๊ธฐ DOM ์ž‘์—… ์ผ๊ด„ ์ฒ˜๋ฆฌ, CSS ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‚ฌ์šฉ ๋“ฑ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๋Š” ๊ธฐ์ˆ ์ด ์žˆ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๋ณต์žกํ•˜๊ณ  ๊ตฌํ˜„์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ƒ DOM์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ œ DOM์˜ ๋ณต์žก์„ฑ์„ ์ถ”์ƒํ™”ํ•˜๊ณ  UI๋ฅผ ๋” ๊ฐ€๋ณ๊ฒŒ ํ‘œํ˜„ํ•จ์œผ๋กœ์จ ๋ณด๋‹ค ํšจ์œจ์ ์ด๊ณ  ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ UI๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ํ˜ธํ™˜์„ฑโ€‹

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

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

๋ฆฌ์•กํŠธ์˜ ํ•ฉ์„ฑ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์ด ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐ”๋กœ ๊ทธ๊ฒƒ์ž…๋‹ˆ๋‹ค. SyntheticEvent๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ์ด๋ฒคํŠธ๋ฅผ ๋‘˜๋Ÿฌ์‹ผ ๋ž˜ํผ(wrapper) ๊ฐ์ฒด๋กœ, ์—ฌ๋Ÿฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งค์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ด ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  1. ํ†ตํ•ฉ ์ธํ„ฐํŽ˜์ด์Šค
// ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ๊ฐœ๋ณ„ ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ์†์„ฑ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
const targetElement = event.target || event.srcElement;

// ๋ฆฌ์•กํŠธ์—์„œ๋Š” SyntheticEvent ๋•๋ถ„์— ์ผ๊ด€์„ฑ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
function handleClick(event) {
const target = event.target;
// ...๋‚˜๋จธ์ง€ ์ฝ”๋“œ
}
  1. ์ด๋ฒ ํŠธ ์œ„์ž„
  • ๋ฆฌ์•กํŠธ๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์—˜๋ฆฌ๋จผํŠธ์— ์ง์ ‘ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹œ ๋ฃจํŠธ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  1. ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ๊ฐœ์„ 
  • ๊ธฐ๋ณธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ onChange ์ด๋ฒคํŠธ์˜ ๋™์ž‘์€ ์ž…๋ ฅ ์ปดํฌ๋„ŒํŠธ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • ๋ฆฌ์•กํŠธ์˜ SyntheticEvent ์‹œ์Šคํ…œ์€ ์ด๋Ÿฌํ•œ ์ž…๋ ฅ ์—˜๋ฆฌ๋จผํŠธ ์ „์ฒด์—์„œ onChange ์ด๋ฒคํŠธ์˜ ๋™์ž‘์„ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค.
  1. ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฒคํŠธ์— ์ ‘๊ทผ
  • ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฒคํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” event.nativeEvent๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ ์กฐ๊ฐโ€‹

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

๋ฌธ์„œ ์กฐ๊ฐ์€ ์ผ๊ด„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฐ€๋ฒผ์šด ์ปจํ…Œ์ด๋„ˆ์ด๋ฏ€๋กœ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์„ฑ๋Šฅ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ชฉ๋ก์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค.

const fragment = document.createDocumentFragment();
for(let i = 0; i < 100; i++) {
const li = document.createElement("li");
li.textContent = `๋ชฉ๋ก ํ•ญ๋ชฉ ${i + 1}`;
fragment.appendChild(li);
}
document.getElementById("myList").appendChild(fragment);

์ด ์˜ˆ์—์„œ๋Š” 100๊ฐœ์˜ ๋ชฉ๋ก ํ•ญ๋ชฉ์ด ๋จผ์ € ๋ฌธ์„œ ์กฐ๊ฐ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„์— ๋ฌธ์„œ ์กฐ๊ฐ์„ ๊ธฐ๋ณธ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋•๋ถ„์— ๋ฌธ์„œ์˜ ์‹ค์ œ DOM์€ ๊ฐ๊ฐ 100๋ฒˆ์ด ์•„๋‹ˆ๋ผ ๋‹จ ํ•œ ๋ฒˆ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์„œ ์กฐ๊ฐ์€ ์—ฌ๋Ÿฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ผ๊ด„ ์ฒ˜๋ฆฌํ•ด DOM์„ ํšจ์œจ์ ์œผ๋กœ ์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๋ฆฌํ”Œ๋กœ์™€ ๋ฆฌํŽ˜์ธํŠธ ํšŸ์ˆ˜๊ฐ€ ์ค๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ์˜ ๊ฐ€์ƒ DOM์€ ๋ฌธ์„œ ์กฐ๊ฐ ๊ฐœ๋…์„ ๋” ๋‚˜์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์Šทํ•œ ์ ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์ผ๊ด„ ์—…๋ฐ์ดํŠธ
    • ๋ฌธ์„œ ์กฐ๊ฐ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋ฆฌ์•กํŠธ์™ ๊ฐ€์ƒ DOM์€ ์—ฌ๋Ÿฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ•œ๊บผ๋ฒˆ์— ์ผ๊ด„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํšจ์œจ์ ์ธ ๋น„๊ต ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋˜๊ณ  ๋‚˜๋ฉด ๋ฆฌ์•กํŠธ๋Š” ํ˜„์žฌ ๊ฐ€์ƒ DOM๊ณผ ์‹ค์žฌ DOM์˜ ์ฐจ์ด์ ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ผ ๋ Œ๋”๋ง
    • ์ฐจ์ด์ ์ด ์‹๋ณ„๋˜๋ฉด ๋ฆฌ์•กํŠธ๋Š” ๋‹จ ํ•œ ๋ฒˆ์˜ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์‹ค์ œ DOM์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

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

๊ฐ€์ƒ DOM ์ž‘๋™ ๋ฐฉ์‹โ€‹

๋ฆฌ์•กํŠธ ์—˜๋ฆฌ๋จผํŠธโ€‹

๋‹ค์Œ์€ ๋ฆฌ์•กํŠธ ์—˜๋ฆฌ๋จผํŠธ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

const element = React.createElement(
"div",
{ className: "my-class" },
"Hello, world!"
);

๋‹ค์Œ์€ ์‹ค์ œ๋กœ ์ƒ์„ฑ๋œ ์—˜๋ฆฌ๋จผํŠธ์ž…๋‹ˆ๋‹ค.

{
$$typeof: Symbol(react.element),
type: "div",
key: null,
ref: null,
props: {
className: "my-class",
children: "Hello, world!"
},
_owner: null,
_store: {}
}

$$typeofโ€‹

๊ฐ์ฒด๊ฐ€ ์œ ํšจํ•œ ๋ฆฌ์•กํŠธ ์—˜๋ฆฌ๋จผํŠธ์ธ์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ˆ˜ํ•œ ์‹ฌ๋ฒŒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Symbol(react.element)๋กœ ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ $$typeof๋Š” ๋ฆฌ์•กํŠธ ์—˜๋ฆฌ๋จผํŠธ์˜ ์ข…๋ฅ˜๋ฅผ ์‹๋ณ„ํ•˜๋Š” ํ‘œ์‹œ์ž ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

typeโ€‹

type ์†์„ฑ์€ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ข…๋ฅ˜๋ฅผ ์•Œ๋ ค ์ค๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ ์—˜๋ฆฌ๋จผํŠธ์˜ type ์†์„ฑ์€ ๋ฌธ์ž์—ด์ด๊ฑฐ๋‚˜ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ์—๋Š” div, span, button ๊ฐ™์€ HTML ํƒœ๊ทธ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ•ฉ์ˆ˜์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ, ์ฆ‰ JSX๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

refโ€‹

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋Š” ์ด ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ๊ธฐ๋ณธ DOM ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ์—์„œ ref๋Š” null๋กœ ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

propsโ€‹

์ด ์†์„ฑ์€ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌ๋œ ๋ชจ๋“  ์†์„ฑ๊ณผ ํ”„๋กญ์„ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

_ownerโ€‹

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

function Parent() {
return <Child />;
}

function Child() {
const element = <div>Hello, world!</div>;
console.log(element._owner); // parent
return element;
}

_storeโ€‹

๋ฆฌ์•กํŠธ ์—˜๋ฆฌ๋จผํŠธ ๊ฐ์ฒด์˜ _store ์†์„ฑ์€ ์—˜๋ฆฌ๋จผํŠธ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์•กํŠธ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. _store์— ์ €์žฅ๋œ ํŠน์ • ์†์„ฑ ๋ฐ ๊ฐ’์€ ๊ณต๊ฐœ API์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ง์ ‘ ์ ‘๊ทผํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๊ฐ€์ƒ DOM๊ณผ ์‹ค์ œ DOM ๋น„๊ตโ€‹

๋ฆฌ์•กํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” React.createElement๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ƒˆ๋กœ์šด ๊ฐ€์ƒ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์ด๊ณ , DOM API์—์„œ ์ œ๊ณตํ•˜๋Š” document.createElement๋Š” document.appendChild ๋“ฑ์˜ API๋กœ DOM์— ์ถ”๊ฐ€๋˜๊ธฐ ์ „, ๋ฉ”๋ชจ๋ฆฌ์— ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

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

function App() {
const [count, setCount] = useState(0);

return (
<div>
<h1>์นด์šดํŠธ: {count}</h1>
<button onClick={() => setCount(count + 1)}>์ฆ๊ฐ€</button>
</div>
);
}

์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์Œ๊ณผ ๊น‰์ด ํ‘œํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

function App() {
const [count, setCount] = React.useState(0);

return React.createElement(
"div",
null,
React.createElement("h1", null, "์นด์šดํŠธ: ", count),
React.createElement(
"button",
{ onClick: () => setCount(count + 1) },
"์ฆ๊ฐ€"
)
);
}

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง๋  ๋•Œ ๋ฆฌ์•กํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ƒ DOM ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

div
- h1
- "์นด์šดํŠธ: 0"
- button
- "์ฆ๊ฐ€"

๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ฆฌ์•กํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

div
- h1
- "์นด์šดํŠธ: 1"
- button
- "์ฆ๊ฐ€"

๊ทธ๋Ÿฌ๋ฉด ๋ฆฌ์•กํŠธ๋Š” h1 ์—˜๋ฆฌ๋จผํŠธ์˜ ํ…์ŠคํŠธ ๋‚ด์šฉ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๋œ๋‹ค๊ณ  ๊ณ„์‚ฐํ•˜๊ณ  ์‹ค์ œ DOM์˜ ํ•ด๋‹น ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

ํšจ์œจ์ ์ธ ์—…๋ฐ์ดํŠธโ€‹

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋‚˜ ํ”„๋กญ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฆฌ์•กํŠธ๋Š” ์—…๋ฐ์ดํŠธ๋œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฆฌ์•กํŠธ ์—˜๋ฆฌ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋น„๊ต ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด ์ƒˆ ํŠธ๋ฆฌ๋ฅผ ์ด์ „ ํŠธ๋ฆฌ์™€ ๋น„๊ตํ•ด ์‹ค์ œ DOM์˜ ์—…๋ฐ์ดํŠธ์— ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

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

์ด๋ ‡๊ฒŒ ์ƒˆ ํŠธ๋ฆฌ์™€ ์ด์ „ ํŠธ๋ฆฌ๋ฅผ ๋…ธ๋“œ๋ฒผ๋กœ ๋น„๊ตํ•ด ํŠธ๋ฆฌ์˜ ์–ด๋Š ๋ถ€๋ถ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ์ž‘์—…์„ ๋””ํ•‘(diffing)์ด๋ผ๊ณ  ํ•˜๊ณ , ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋””ํ•‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ์˜ ๋””ํ•‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋˜์—ˆ์œผ๋ฉฐ ์‹ค์ œ DOM์— ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ณ€๊ฒฝ ํšŸ์ˆ˜์˜ ์ตœ์†Œํ™”๋ฅผ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

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

๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋งโ€‹

๋ฆฌ์•กํŠธ์˜ ๋””ํ•‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ตœ์†Œํ™”ํ•ด ์‹ค์ œ DOM์„ ํšจ์œจ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์˜ ๋ฌธ์ œ๋Š” ์•„์ง ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋ฉด ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜์–ด ์ž ์žฌ๋˜์—ˆ๋˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ถˆ๊ฑฐ์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ตœ์ ํ™”๋ฅผ ์ž์ฃผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.