๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

TIL/๐Ÿงบ React

๊ฐ€์ƒ๋”(Virtual DOM) ์ดํ•ดํ•˜๊ธฐ

์šฐ์„  DOM์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€ ?


Dom์ด๋ž€ Document Object Model(๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ)์˜ ์•ฝ์ž์ด๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌธ์„œ ๊ฐ์ฒด๋ž€, ์›น ๋ธŒ๋ผ์šฐ์ € ์•ˆ์—์„œ HTML ๋ฌธ์„œ์— JavaScript ๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก <htmlํƒœ๊ทธ>๋ฅผ ๊ฐ์ฒด(object)์ด๋‹ค.

HTML์˜ ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ Tree๋กœ ๋‚˜ํƒ€๋‚ด๋ฉฐ, DOM์ด ์กด์žฌํ•จ์œผ๋กœ์จ JS๋ฅผ ์ด์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. (๋ฌธ์„œ ๊ตฌ์กฐ, ์Šคํƒ€์ผ, ๋‚ด์šฉ ๋“ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋•๋Š” ์—ญํ• )

 

 

 

ํ•˜์ง€๋งŒ HTML ๋ฌธ์„œ ์•ˆ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์„๊นŒ?


๊ทธ๊ฑด ๋ฐ”๋กœ DOM ์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ธ์‹ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๊ธฐ์กด ๋ Œ๋”๋ง ๋ฐฉ์‹์€

  1. ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด์ค€ HTML ํŒŒ์ผ์„ ํ•ด์„(Parsing)ํ•˜์—ฌ DOM ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.
  2. ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด์ค€ CSS ํŒŒ์ผ์„ ํ•ด์„ํ•˜์—ฌ CSSOM ํŠธ๋ฆฌ๋„ ๋งŒ๋“ ๋‹ค.
  3. DOM ํŠธ๋ฆฌ + CSSOM ํŠธ๋ฆฌ๋ฅผ ๊ฒฐํ•ฉํ•ด ๋ Œ๋”ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.
  4. ๋ Œ๋”ํŠธ๋ฆฌ๋กœ ๊ฐ ๋…ธ๋“œ์˜ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•œ ๋ ˆ์ด์•„์›ƒ์„ ๋งŒ๋“ ๋‹ค. ๋ทฐํฌํŠธ(Viewport) ๋‚ด์—์„œ ๊ฐ ๋…ธ๋“œ๋“ค์˜ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
  5. ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ์ด ์™„๋ฃŒ๋˜๋ฉด ์ด์ œ ์š”์†Œ๋“ค์„ ์‹ค์ œ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š” ํŽ˜์ธํŠธ(paint)๋ฅผ ํ•œ๋‹ค.
  • ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ(์žฌ๊ตฌ์„ฑ): ๊ฐ ๋…ธ๋“œ๋“ค์ด ์–ด๋””์— ๋‚˜ํƒ€๋‚˜์•ผ ํ•  ์ง€ ์Šคํฌ๋ฆฐ ์ขŒํ‘œ ๊ณ„์‚ฐ
  • ํŽ˜์ธํŠธ(Paint): ๋ Œ๋”๋ง๋œ ์š”์†Œ์— ์ƒ‰์„ ์ž…ํžˆ๋Š” ๊ณผ์ •

 

 

 

DOM์˜ ๋ฌธ์ œ์ 


DOM์€ ์ƒˆ๋กœ์šด ์š”์ฒญ์ด๋‚˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•œ๋‹ค. ํ•œ๊ธ€์ž๋งŒ ์ˆ˜์ •ํ•ด๋„ ๋ฆฌ๋ Œ๋”๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์ด๋‹ค.

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

 

ํ•ด๊ฒฐ์ฑ…์€ ๋ฐ”๋กœ ๊ฐ€์ƒ๋”

์œ„์™€ ๊ฐ™์€ ์„ฑ๋Šฅ(์†๋„) ์ด์Šˆ์— ๋Œ€ํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ DOM์„ ์ตœ์†Œํ•œ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ƒ๋”์ด ๋“ฑ์žฅ ํ•˜๊ฒŒ๋œ ๊ฒƒ์ด๋‹ค.

React๋Š” ๊ฐ€์ƒ DOM์„ ๋„์ž…ํ•˜์—ฌ, HTML ๋งˆํฌ์—…์„ ์‹œ๊ฐ์ ์ธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์‹œ๊ฐ„(css๊ฐ€ ์ ์šฉ๋˜๊ณ  ์ˆ˜์ •๋˜์–ด ๋ฐ˜์˜๋˜๋Š” ์‹œ๊ฐ„)์„ ์ตœ์†Œํ•œ์˜ DOM ์กฐ์ž‘์„ ํ†ตํ•ด ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๊ฐœ์„ ํ•˜๊ณ ์ž ํ•˜์˜€๋‹ค.

 

 

 

 

๊ฐ€์ƒ๋”(Virtual DOM)์€


DOM์˜ ๊ตฌ์กฐ๋ฅผ ํ‰๋‚ด๋‚ธ ํŠธ๋ฆฌ๊ตฌ์กฐ์˜ JavaScript ๊ฐ์ฒด์ด๋‹ค.

์‹ค์ œ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ, ๋ฉ”๋ชจ๋ฆฌ์— DOM์„ ์ถ”์ƒํ™”ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ƒํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๊ณจ๋ผ์ง‘์œผ๋ฏ€๋กœ, Reflow, Repaint๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ํ•œ๋ฒˆ์— ๋ฌถ์–ด์„œ DOM์— ์ „๋‹ฌํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์ฒ˜๋ฆฌ๋˜๋Š” Reflow, Repaint์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•œ๋ฒˆ๋งŒ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋ฐ˜๋ณต์ ์ธ ๋ถ€๋ถ„์ด ์ค„์–ด๋“ค์–ด ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋œ๋‹ค.

์ž‘์€ ๊ทœ๋ชจ์˜ ๋ ˆ์ด์•„์›ƒ์ด ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํฐ ๊ทœ๋ชจ์˜ ๋ ˆ์ด์•„์›ƒ์ด ํ•œ๋ฒˆ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ์ƒ์˜ ํฐ ์ฐจ์ด๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

๋ฆฌ์•กํŠธ๊ฐ€ ๊ฐ€์ƒ๋”์„ ๋ฐ˜์˜ํ•˜๋Š” ์ ˆ์ฐจ


  1. ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ „์ฒด UI๋ฅผ ๊ฐ€์ƒ๋”์— ๋ฆฌ๋ Œ๋”๋ง ํ•œ๋‹ค.
  2. ๊ฐ€์ƒ๋”๋ผ๋ฆฌ ๋น„๊ตํ•˜๊ณ  (์ด์ „ ๊ฐ€์ƒ๋”์— ์žˆ๋˜ ๋‚ด์šฉ๊ณผ ํ˜„์žฌ ๋‚ด์šฉ ๋น„๊ต)
  3. ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ์ ์šฉํ•˜์—ฌ ๋ Œ๋”๋งํ•œ๋‹ค. (๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ์€ ํ•œ๋ฒˆ๋งŒ ํ•œ๋‹ค.)
  • ๋ Œ๋”๋ง(Rendering)์ด๋ž€?
    • HTML,CSS,JS๋กœ ์ž‘์„ฑ๋œ ๋ฌธ์„œ๋ฅผ ํ•ด์„ํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €์— ์‹œ๊ฐ์ ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๋•Œ๋กœ๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ HTML๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •(SSR)์„ ๊ฐ€๋ฅดํ‚ค๊ธฐ๋„ ํ•œ๋‹ค.

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

 

 

 

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ •๋ง ๊ฐ€์ƒ๋”์€ ๋น ๋ฅผ๊นŒ?

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ์•„๋‹ˆ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

 

 

 

์ •๋ฆฌ


๋ฆฌ์•กํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ’์˜ ๋ณ€๊ฒฝ๋˜๋ฉด UI๋ฅผ ์ž๋™ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฉฐ,

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

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

 

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

 

 

 

 

 

์ฐธ๊ณ ๋ฌธํ—Œ

'TIL > ๐Ÿงบ React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ "React Hooks"  (0) 2023.01.06