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

[๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ ] 1์žฅ - ๋ฆฌ์•กํŠธ ์‹œ์ž‘

2020-03-23-๋ฆฌ์•กํŠธ๋ฅผ-๋‹ค๋ฃจ๋Š”-๊ธฐ์ˆ -1์žฅ-๋ฆฌ์•กํŠธ-์‹œ์ž‘-image-0

์ด ๊ธ€์€ ๊น€๋ฏผ์ค€(velopert)๋‹˜์˜ ๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ ์„์ฐธ์กฐํ•˜์—ฌ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

์™œ ๋ฆฌ์•กํŠธ(React)์ธ๊ฐ€?#

JS๋งŒ์œผ๋กœ ๊ทœ๋ชจ๊ฐ€ ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์‹œ๋Œ€์ด๋‹ค.

๊ทœ๋ชจ๊ฐ€ ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์ˆ˜๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์ด ์žˆ๋‹ค. ์ดํ”„๋ ˆ์ž„์›Œํฌ๋“ค์€ ์ฃผ๋กœ MVC(Model-View-Controller), MVVM(Model-View-View Model) ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๋ชจ๋ธ(Model) : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์˜์—ญ

  • ๋ทฐ(View) : ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ๋ถ€๋ถ„

  • ์ปจํŠธ๋กค๋Ÿฌ(Controller) : ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์ด๋‚˜ ์กฐ์ž‘์— ๋”ฐ๋ผ ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ, ์ˆ˜์ •ํ•˜๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ทฐ์— ๋ฐ˜์˜ํ•จ.


๐Ÿ“Œ ๋ฆฌ์•กํŠธ๋Š” ์˜ค์ง ๋ทฐ(View)๋งŒ์„ ์‹ ๊ฒฝ์“ฐ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค ์–ด๋–ค ๋ณ€ํ™”๋ฅผ ์ค„์ง€ ๊ณ ๋ฏผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ๋ƒฅ ๊ธฐ์กด ๋ทฐ๋ฅผ๋‚ ๋ ค๋ฒ„๋ฆฌ๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹


๋ฆฌ์•กํŠธ ์ดํ•ด#

๋ฆฌ์•กํŠธ๋Š” ํŠน์ • ๋ถ€๋ถ„์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ธธ์ง€ ์ •ํ•˜๋Š” ์„ ์–ธ์ฒด์ธ ์ปดํฌ๋„ŒํŠธ(Component) ๋‹จ์œ„๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋Š” ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ API๋กœ, ์ˆ˜๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ๋‚ด์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ƒ๊น€์ƒˆ์™€ ์ž‘๋™ ๋ฐฉ์‹์„ ์ •์˜ํ•œ๋‹ค.

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


์ดˆ๊ธฐ ๋ Œ๋”๋ง#

์ดˆ๊ธฐ ๋ Œ๋”๋ง์€ ๋งจ ์ฒ˜์Œ ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€๋ฅผ ์ •ํ•œ๋‹ค. ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์ด๋ฅผ render() ํ•จ์ˆ˜๋กœ ๋‹ค๋ฃฌ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋ทฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๊ณ  ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

render ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด

  • ๋‚ด๋ถ€์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค๋„ ์žฌ๊ท€์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ณ 

  • ๋ Œ๋”๋ง์ด ๋๋‚˜๋ฉด ์ง€๋‹ˆ๊ณ  ์žˆ๋Š” ์ •๋ณด๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ HTML ๋งˆํฌ์—…์„ ๋งŒ๋“ค๊ณ 

  • ์‹ค์ œ ํŽ˜์ด์ง€์˜ DOM ์š”์†Œ ์•ˆ์— ์ฃผ์ž…ํ•œ๋‹ค.


์กฐํ™” ๊ณผ์ •#

๋ฆฌ์•กํŠธ์—์„œ ๋ทฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ "์กฐํ™” ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค"๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณ€ํ™”์—๋”ฐ๋ผ ๋ทฐ๊ฐ€ ๋ณ€ํ˜•๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ์š”์†Œ๋กœ ๊ฐˆ์•„ ๋ผ์šฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ปดํฌ๋„ŒํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ–ˆ์„ ๋•Œ ์—…๋ฐ์ดํŠธํ•œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  render ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•œ๋‹ค.

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

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ตœ๋Œ€ํ•œ ์„ฑ๋Šฅ์„ ์•„๋ผ๊ณ , ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ๊ฒƒ์ด ๋ฆฌ์•กํŠธ์ด๋‹ค.


๋ฆฌ์•กํŠธ์˜ ํŠน์ง•#

Virtual DOM#

๋ฆฌ์•กํŠธ์˜ ์ฃผ์š” ํŠน์ง•์€ Virtual DOM์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


DOM์ด๋ž€?#

DOM์€ Document Object Model์˜ ์•ฝ์–ด. ๊ฐ์ฒด๋กœ ๋ฌธ์„œ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ HTML์ด๋‚˜ XML๋กœ ์ž‘์„ฑํ•œ๋‹ค.

์›น ๋ธŒ๋ผ์šฐ์ €๋Š” DOM์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ์ฒด์— JS์™€ CSS๋ฅผ ์ ์šฉํ•œ๋‹ค. DOM์€ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ, ํŠน์ •๋…ธ๋“œ๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์›ํ•˜๋Š” ๊ณณ์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

DOM์˜ ๋‹จ์ ์€ ๋™์  UI์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํŽ˜์ด์Šค๋ถ์—์„œ ์Šคํฌ๋กค๋ฐ”๋ฅผ ๋‚ด๋ ธ์„ ๋•Œ ์ˆ˜๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋”ฉ๋˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋ณด์ž. (ํŽ˜์ด์Šค๋ถ์—์„œ ํฌ์ŠคํŠธ ํ•œ ๊ฐœ์—์ƒˆ์šฉ๋˜๋Š” <div> ์š”์†Œ์˜ ์ˆ˜๋Š” ์•ฝ 100๊ฐœ์ด๋‹ค.)

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


Virtual DOM#

๋ฆฌ์•กํŠธ๋Š” Virtual DOM ์ฆ‰ ์‹ค์ œ DOM์— ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ ์กฐ์ž‘ํ•˜๋Š” ๋Œ€์‹  ์ด๋ฅผ ์ถ”์ƒํ™”ํ•œ JS ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. (์‹ค์ œ DOM์˜ ๊ฐ€๋ฒผ์šด ์‚ฌ๋ณธ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค!)

๋ฆฌ์•กํŠธ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ•ด DOM์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ๋Š” ๋‹ค์Œ์˜ ์ ˆ์ฐจ๋ฅผ ๋ฐŸ๋Š”๋‹ค.

  1. ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ „์ฒด UI๋ฅผ Virtual DOM์— ๋ฆฌ๋ Œ๋”๋งํ•œ๋‹ค.

  2. Virtual DOM์— ์žˆ๋˜ ๋‚ด์šฉ๊ณผ ํ˜„์žฌ ๋‚ด์šฉ์„ ๋น„๊ตํ•œ๋‹ค.

  3. ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ์ ์šฉํ•œ๋‹ค.

๋ฆฌ์•กํŠธ์˜ Virtual DOM ๋ฐฉ์‹์ด ๋ฌด์กฐ๊ฑด ๋น ๋ฅธ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ฆฌ์•กํŠธ ๋ฉ”๋‰ด์–ผ์— ์žˆ๋Š”๋ฌธ์žฅ์ด๋‹ค.

๐Ÿ“Œ ์ง€์†์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ™”ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•ํ•˜๊ธฐ

Virtual DOM์ด ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์—…๋ฐ์ดํŠธ ์ฒ˜๋ฆฌ ๊ฐ„๊ฒฐ์„ฑ์ด๋‹ค.


๊ธฐํƒ€ ํŠน์ง•#

๋ฆฌ์•กํŠธ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. (Vue.js, Angular.js๋Š” ํ”„๋ ˆ์ž„์›Œํฌ) ๋”ฐ๋ผ์„œ Ajax, ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง, ๋ผ์šฐํŒ… ๋“ฑ์˜ ๊ธฐ๋Šฅ์€ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ˜ผ์šฉํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.


๊ฐ™์ด ์ฝ๊ธฐ#

Virtual DOM๊ณผ Internals - React

[๋ฒˆ์—ญ] ๋ฆฌ์•กํŠธ์— ๋Œ€ํ•ด์„œ ๊ทธ ๋ˆ„๊ตฌ๋„ ์ œ๋Œ€๋กœ ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ - ์™œ Virtual DOM ์ธ๊ฐ€?

ReactJS์˜ Virtual DOM๊ณผ Repaint, Reflow | DrakeJin

React ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅ ์•Œ์•„๋ณด๊ธฐ : TOAST Meetup