[part 6] React :: VDOM

๋ˆ„๋ฆฌยท2023๋…„ 8์›” 17์ผ
0

Interview

๋ชฉ๋ก ๋ณด๊ธฐ
11/13

๐Ÿ’ก ๋ฌผ์–ด๋ณด๋Š” ์ด์œ ?

JavaScript๋Š” ๋””๋ฒ„๊น…๊ณผ ๊ด€๋ ค๋œ ๋‚ด์šฉ๋•Œ๋ฌธ์— ๋ฌผ์–ด๋ณด๋Š” ๊ฒƒ์ด ๋งŽ์•˜๋‹ค.
React๋Š” ์ง„์งœ ์‹ค๋ฌด๋ฅผ ์ž˜ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ‰๊ฐ€ํ•˜๋Š” ๋‚ด์šฉ๋“ค์ด ๋งŽ๋‹ค.

1. ๊ธฐ์ˆ ์  ์ง€์‹๊ณผ ์ดํ•ด๋„ : ์ง€์›์ž๊ฐ€ React์™€ ๊ด€๋ จ๋œ ํ•ต์‹ฌ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ์ ์ธ state์™€ props์˜ ์ดํ•ด์—์„œ๋ถ€ํ„ฐ ๋” ๋ณต์žกํ•œ ๊ฐœ๋…์ธ ์ปดํฌ๋„ŒํŠธ ๋ผ์ดํ”„์‚ฌ์ดํด, React Hooks, ๋˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ดํ•ด๋„๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
(๋‚ด๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด์„œ ๋ฆฌ๋“œ๋ฏธ๋ฅผ ๋ณด๋ฉด ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์™œ ๋‚˜์™”๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋ฏธ๋ฆฌ ์•Œ๊ณ  ๊ฐ€์ž)
2. ๋ฌธ์ œ ํ•ด๊ฒฐ ๋Šฅ๋ ฅ : ์‹ค์ œ ๊ฐœ๋ฐœ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์งˆ๋ฌธ์„ ํ†ตํ•ด, ์ง€์›์ž๊ฐ€ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”์ง€, ์–ด๋–ค ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ์‹ ์ž… ๊ฐœ๋ฐœ์ž๋ผ๊ณ  ํ•ด๋„, ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ธฐ๋ณธ์ ์ธ ๋Šฅ๋ ฅ๊ณผ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐฐ์šฐ๊ณ  ์ ์šฉํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋Šฅ๋ ฅ์„ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ œ ์ƒํ™ฉ์„ ์ œ์‹œํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ๊ฒƒ์ธ์ง€ ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3. ๊ฒฝํ—˜๊ณผ ํ•™์Šต ๋Šฅ๋ ฅ : ์ง€์›์ž๊ฐ€ ์ด์ „์— ํŠน์ • ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜์ด ์žˆ๋Š”์ง€, ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๊ณ  ์ ์šฉํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ์‹ ์ž… ๊ฐœ๋ฐœ์ž๋ผ๋ฉด, ์ฃผ์–ด์ง„ ํ•™์Šต ์ž์› ๋ฐ ์‹œ๊ฐ„์„ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜์—ฌ ๊ธฐ์ˆ ์„ ์Šต๋“ํ•˜๊ณ  ๋ฐœ์ „์‹œ์ผฐ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ง€์›์ž์˜ ์ž๊ธฐ ์ฃผ๋„์  ํ•™์Šต ๋Šฅ๋ ฅ๊ณผ ์—ด์ •์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
4. ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ดํ•ด๋„ : React๋ฅผ ์ด์šฉํ•œ ์›น ๊ฐœ๋ฐœ์—์„œ ์„ฑ๋Šฅ์€ ์ค‘์š”ํ•œ ์ด์Šˆ์ž…๋‹ˆ๋‹ค. ์ง€์›์ž๊ฐ€ ์ด์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

๋“ค์–ด๊ฐ€๊ธฐ ์ „

React๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๊ธฐ์ˆ  (react-query, redux, mobx, babel, vite, etc ...)์€ ํ•„์š”์— ์˜ํ•ด ๋งŒ๋“ค์–ด ์กŒ๋‹ค.
์‚ฌ์‹ค Reac๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ์•Œ์•„์•ผ ํ•  ๊ฒƒ๋“ค์ด ๋„ˆ๋ฌด ๋งŽ์ง€๋งŒ, ์–ด๋–ค ์ด์œ ์—์„œ React๊ฐ€ ์‹œ์ž‘๋˜์—ˆ๋Š”์ง€๋ฅผ ์ดํ•ดํ•˜๋ฉด ๊ทธ ํ›„์˜ ๊ณผ์ •๋“ค์„ ํ•™์Šตํ•˜๋Š” ๋ฐ ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

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

ํ•™์Šต๋ชฉํ‘œ : React์™€ ๊ทธ ์ฃผ๋ณ€ ์ƒํƒœ๊ณ„

  • ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€
  • ์™œ ์ด๋Ÿฐ ๊ธฐ์ˆ ์ด ํ•„์š”ํ–ˆ๋Š”์ง€
  • ์ด ๊ธฐ์ˆ ์ด ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ฐฐ๊ฒฝ

์ด ํ•ญ๋ชฉ๋“ค์„ ์ดํ•ดํ•˜๋Š”๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์ถ”ํ›„์— ์ ์ ˆํ•œ ์ƒํ™ฉ์— ์ž˜ ์ ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

VDOM (์ง๊ฟ SPA ~ DOM API)

  • React ํŒ€ ์ž…์žฅ์—์„œ DOM์œผ๋กœ ๋ณ€ํ™˜ ๋  ๊ฐ„๋‹จํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด VDOM (๊ฐ์ฒด) ๊ฐœ๋ฐœ
  • ํ—ฌํผํ•จ์ˆ˜ createElement๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์—†์„๊ฑฐ ๊ฐ™์•„ ์ต์ˆ™ํ•œ ๊ตฌ์กฐ์˜ ์ƒˆ๋กœ์šด ํ‘œํ˜„ ๋ฐฉ๋ฒ•์„ ๊ฐœ๋ฐœ
  • createElement ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์œผ๋กœ ๋ณ€ํ™˜์ด ๋˜๊ฒŒ ํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ด์šฉํ•ด์„œ ๋ณ€ํ™˜

(Context) Frontend์˜ ๋ฐœ์ „ ๊ณผ์ •

1. ์ •์  ์›นํŽ˜์ด์ง€(HTML, CSS)

์›น์˜ ์ดˆ๊ธฐ์—๋Š” HTML๊ณผ CSS๊ฐ€ ์ฃผ๋ฅผ ์ด๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ๊ธฐ์—๋Š” ์›น ํŽ˜์ด์ง€๊ฐ€ ์ •์ ์ด์—ˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฑฐ์˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

2. ๋™์  ์›นํŽ˜์ด์ง€(JS์˜ ๋“ฑ์žฅ!!)

JavaScript์˜ ๋“ฑ์žฅ์œผ๋กœ ์›นํŽ˜์ด์ง€์— ๋™์ ์ธ ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ๊ธฐ๋ถ€ํ„ฐ ์›นํŽ˜์ด์ง€๋Š” ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

3. AJAX(๋น„๋™๊ธฐ์ ์ธ ํ†ต์‹ ์„ ํ• ์ˆ˜ ์žˆ๋‹ค๊ตฌ?)

<!-- ์˜›๋‚ ์‹ fetch -->
<form action="...api์ฃผ์†Œ" method="post">
</form>

์ด ์‹œ๊ธฐ์—๋Š” AJAX(Asynchronous JavaScript And XML)์˜ ๋“ฑ์žฅ์œผ๋กœ ์›นํŽ˜์ด์ง€๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

Google Maps๊ฐ€ ์•ฝ๊ฐ„ ์„ ๋‘์ฃผ์ž ๋Š๋‚Œ์ธ๋ฐ, ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด์ค€ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

4. jQuery์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(2000๋…„๋Œ€ ํ›„๋ฐ˜)

์ด ์‹œ๊ธฐ์—๋Š” jQuery์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋“ฑ์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ณ , JavaScript๋ฅผ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. (DOM API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ํž˜๋“ค์—ˆ์Œ)

5. MVC ํ”„๋ ˆ์ž„์›Œํฌ(2010๋…„๋Œ€ ์ดˆ๋ฐ˜)

์ด ์‹œ๊ธฐ์—๋Š” AngularJS, Backbone.js์™€ ๊ฐ™์€ MVC(Model-View-Controller) ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋“ฑ์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ๋ฅผ ์ฒด๊ณ„ํ™”ํ•˜๊ณ  ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๋Š”๋ฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

6. ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ(2010๋…„๋Œ€ ์ค‘๋ฐ˜ ~ ํ˜„์žฌ๋ณด๋‹ค ์ชผ๊ธˆ ์ „)

์ด ์‹œ๊ธฐ์—๋Š” React, Vue.js์™€ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋“ฑ์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

7. ๋ญ”๊ฐ€ ๋‹ค์‹œ ์—ญํ–‰ํ•ด๋ฒ„๋ฆฐ๋“ฏํ•œ.. ์‹ ํฅ๊ฐ•์ž Next์˜ ๋“ฑ์žฅ? (ํ˜„์žฌ ~ )
Frontend์ฑ•ํ„ฐ Modern Rendering Patterns์—์„œ ๋” ์•Œ์•„๋ด…๋‹ˆ๋‹ค

CSR(Client Side Rendering) ์€ ๋ชจ๋“  ๋ Œ๋”๋ง์„ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  ๋™์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ๋ฐ ์œ ๋ฆฌํ•˜์ง€๋งŒ, ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋Š๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ SEO ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์š”์ฆ˜์—๋Š” CSR๊ณผ SSR, SSG, ISR์„ ์ ์ ˆํžˆ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

  1. SSR(Server Side Rendering): SSR์€ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ณ , SEO ์ตœ์ ํ™”์— ์ข‹์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ํŽ˜์ด์ง€๋ฅผ ์™„์ „ํžˆ ๋ Œ๋”๋งํ•œ ํ›„์— HTML์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‚ฌ์šฉ์ž๋Š” ๋น ๋ฅด๊ฒŒ ์™„์„ฑ๋œ ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํฌ๋กค๋Ÿฌ๊ฐ€ ์ฝ˜ํ…์ธ ๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ์–ด SEO์— ์ข‹์Šต๋‹ˆ๋‹ค.
  2. SSG(Static Site Generation): SSG๋Š” ๋นŒ๋“œ ์‹œ์ ์— ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, ์„œ๋ฒ„์— ๋ถ€๋‹ด์„ ์ฃผ์ง€ ์•Š๊ณ  ๋น ๋ฅธ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ƒ์„ฑ๋œ ์ •์  ํŒŒ์ผ์„ CDN(Content Delivery Network)์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์–ด ์ „ ์„ธ๊ณ„ ์–ด๋””์„œ๋‚˜ ๋น ๋ฅธ ์†๋„๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ISR(Incremental Static Regeneration): ISR์€ SSG์˜ ์žฅ์ ์„ ์œ ์ง€ํ•˜๋ฉด์„œ, ๋™์  ์ฝ˜ํ…์ธ ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ISR์€ ํ•„์š”์— ๋”ฐ๋ผ ์ •์  ํŽ˜์ด์ง€๋ฅผ ์žฌ์ƒ์„ฑํ•˜์—ฌ ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ์ด ๊ณผ์ •์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ด๋ฃจ์–ด์ ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋ฐฉํ•ด๋ฅผ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (SWR ๋ฐฉ์‹ ์บ์‹ฑ ๋ฌดํšจํ™” ์ „๋žต)

DOM API๋Š” SPA์— ์ข‹์•„ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค

DOM (Document Object Model) API : ์›น ์ดˆ์ฐฝ๊ธฐ(1990๋…„๋Œ€ ์ค‘๋ฐ˜)๋ถ€ํ„ฐ ๋“ฑ์žฅํ–ˆ๋‹ค. ์ด๋Š” ์›น ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

DOM API๋Š” HTML๊ณผ XML ๋ฌธ์„œ์˜ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ํ‘œ์ค€ ๋ชจ๋ธ์ด๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋ฌธ์„œ์˜ ๊ตฌ์กฐ, ์Šคํƒ€์ผ, ๋‚ด์šฉ ๋“ฑ์„ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. JavaScript์™€ ๊ฒฐํ•ฉ๋˜๋ฉด, ์›น ํŽ˜์ด์ง€์™€ ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. (jQuery ๋“ฑ์žฅ์ „๊นŒ์ง€ ์ข‹์•˜๋‹ค)

1. DOM์˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์‹œ๋„

  • JQuery
    • DOM API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค„๊ฒŒ ๋ผ๊ณ  ํ•˜๋Š” ์ปจ์…‰
    • ๊ธฐ๋ณธ์ ์œผ๋กœ DOM์„ ์‰ฝ๊ฒŒ ํฌ์žฅํ–ˆ์„ ๋ฟ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง„ ๋ชปํ–ˆ๋‹ค.

      ์—ฌ๊ธฐ์„œ React๋Š” 1ํƒ€ nํ”ผ๋ฅผ ์œ„ํ•œ ์ปจ์…‰์„ ๋ฐœ๊ฒฌ!
      DOM ์ž์ฒด๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ๊ฒƒ โžก๏ธ (VDOM ๊ฐœ๋ฐœ)์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ํš๊ธฐ์ ์œผ๋กœ ๋ฐ”๋€œ

2. ์ž‘๊ฒŒ ์‹œ์ž‘ํ•˜๊ธฐ (Minimum Viable Product)

๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ๋‹ด์œผ๋ ค๊ณ  ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ํ‹€๋งŒ ์ž‘๊ฒŒ ์‹œ์ž‘ํ•˜์ž

  • React๋Š” DOM์„ ์—†์• ์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•จ
  • DOM์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ–ˆ๋‹ค๋Š” ์ปจ์…‰์˜ ์ œํ’ˆ์„ ๊ฐœ๋ฐœ
  • React์˜ MVP
    - DOM์„ ์™„์ „ํžˆ ์—†์• ์ง„ ์•Š๊ณ  mock์ด๋ผ๋Š” ๊ฐ€์งœ DOM์„ ์ œ๊ณตํ•ด์„œ real DOM๊ณผ์˜ ์—ฐ๊ฒฐ์„ฑ ์ตœ์†Œํ™”

    ์ดˆ๊ธฐ React์˜ ๋ชฉ์  :
    SPA๋ฅผ ๋งŒ๋“ฆ์— ์žˆ์–ด์„œ ๋ชจ๋“  ๊ฒƒ์„ ์ œ๊ณตํ•˜๋ ค๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ user interface(UI) ๋ถ€๋ถ„๋งŒ์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์—ˆ์Œ

3. ์ง€๊ธˆ ๋ฌธ์ œ์ ์„ ๋ถ„์„ ํ•ด ๋ณด์ž!


์œ„์˜ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ ์ง€๊ธˆ ์ฝ”๋“œ์˜ ํŠน์ง•์„ ์‚ดํŽด๋ณด๋ฉด?

  • html
    • ๋ชจ๋“  html ํƒœ๊ทธ๋Š” ํƒœ๊ทธ๋ช…, props๋“ค, n๊ฐœ์˜ ์ž์‹๋“ค์ด ์žˆ๋‹ค!
    • ํƒœ๊ทธ์™€ attribute ๊ทธ ์•ˆ์— n๊ฐœ์˜ ์ž์‹์š”์†Œ๊ฐ€ ์žˆ๋‹ค.
    • ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค.
    • ๋ฌธ์ž์—ด์„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฝ์–ด์„œ DOM์„ ๋งŒ๋“ ๋‹ค.
  • JS
    • DOM API๋ฅผ ์ด์šฉํ•ด์„œ ๋Ÿฐํƒ€์ž„์ค‘์— DOM์„ ๊ทธ๋ฆฐ๋‹ค (html์„ ์ƒ์„ฑํ•œ๋‹ค)
    • DOM API๋ฅผ ๊ฐ€์ง€๊ณ  ์กฐ์ž‘ํ•  ๋–„์—๋Š” ๊ตฌ์กฐ๊ฐ€ ํ•œ๋ˆˆ์— ๋“ค์–ด์˜ค์ง€ ์•Š๋Š”๋‹ค.

      DOM API ๋ถˆํŽธํ•˜๋‹ค. ๊ตฌ์กฐ๊ฐ€ ํ•œ ๋ˆˆ์— ๋“ค์–ด์˜ค์ง€ ์•Š๋Š”๋‹ค.
      ํ•˜์ง€๋งŒ ๋Œ€์ฒด์ œ๊ฐ€ ์—†์ž–์•„์š”?

4. DOM ๋ฒ„๋ฆฌ๊ธฐ

๊ทธ๋ ‡๋‹ค๋ฉด React๊ฐœ๋ฐœ์ž๋“ค์€ ์–ด๋–ค ์ƒ๊ฐ์„ ํ–ˆ์„๊นŒโ€ฆ?
DOM API๋ฅผ ๋ชจ๋‘ ๋ฒ„๋ฆด ์ˆœ ์—†์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฒ„๋ ค๋ณด์ž!
์–ด๋–ป๊ฒŒ?
โžก๏ธ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” โ€˜DOMโ€™์„ ์ฃผ์ง€ ๋ง์ž
โžก๏ธ ์šฐ๋ฆฌ๊ฐ€ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์ œ๊ณต(VDOM)ํ•ด์ฃผ๊ณ  ์‹ค์งˆ์ ์ธ ์ œ์–ด๋Š” React๊ฐ€ ํ•˜์ž

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

  • ๋‹ค๋ฃจ๊ธฐ ๊นŒ๋‹ค๋กœ์šด ๊ฒƒ์„ ๋‹ค๋ฃจ๊ธฐ ์‰ฌ์šด ํฌ๋งท์œผ๋กœ ๋ฐ”๊ฟ”์„œ ๊ทธ ์‰ฌ์šด ํฌ๋งท์„ ๋‹ค๋ฃจ์ž!

5. ๋‹ค๋ค„๋ณด์ž

DOM์€ ๊ต‰์žฅํžˆ ๋ณต์žกํ•œ ๊ฐ์ฒด์ธ๋ฐ ์–ด๋–ป๊ฒŒ ๋‹ค๋ค„์•ผ ํ• ๊นŒ

1. ๋ณต์žกํ•œ๊ฒƒ์€ ๊ฐ„๋‹จํ•œ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พผ๋‹ค
๋ณต์žกํ•œ DOM ๊ฐ์ฒด๋ฅผ ๊ฐ„๋‹จํ•œ ๊ฐ์ฒด๋กœ ๋ฐ”๊พธ์ž
2. ๊ฐ„๋‹จํ•œ ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๋ณต์žกํ•œ DOM์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ค์ž

  • html ๋งˆํฌ์—…
    • tag๋Š” n๊ฐœ์˜ ์ž์‹์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค
    • tag๋Š” n๊ฐœ์˜ attribute(props)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค
      • ๊ฐ๊ฐ์˜ attribute๋Š” key value๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค
    • ๊ฐ tag๋Š” ์ด๋ฆ„์ด ์žˆ๋‹ค

html ๋งˆํฌ์—…์„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด ๋ณด์ž
๋ณต์žกํ•œ๊ฒƒ์€ ๊ฐ„๋‹จํ•œ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พผ๋‹ค

// ์ด ๊ฐ์ฒด ์•ˆ์— ์–ด๋–ค ๋ชจ์–‘์œผ๋กœ ๋งŒ๋“ค ๊ฒƒ์ธ๊ฐ€?
const vdom = {
  tag: 'ul',
  props: {},
  children: [],
};

// children์•ˆ์—๋Š” vdom์ด ๋˜ ๋“ค์–ด๊ฐ€์งˆ ๊ฒƒ์ด๋‹ค.
// ์ด ๊ฐ์ฒด ์•ˆ์— ์–ด๋–ค ๋ชจ์–‘์œผ๋กœ ๋งŒ๋“ค ๊ฒƒ์ธ๊ฐ€?

<ul>
	<li><a><span></span></a></li>
</ul>
const vdom = {
  tag: 'ul',
  props: {},
  children: [
    {
      tag: 'li',
      props: {},
      children: [
        {
          tag: 'a',
          props: {},
          children: [{ tag: 'span', props: {}, children: [] }],
        },
      ],
    },
  ],
};

๊ฐ„๋‹จํ•œ ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๋ณต์žกํ•œ DOM์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ค์ž : createDOM function

html :: <h1 className="greet">hello world</h1>
node : { tag: 'h1', props: { className: "greet" }, children: ['hello world'] }

function createDOM(node) {
// DOM์€ ํŠธ๋ฆฌ๊ตฌ์กฐ ์ด๋ฏ€๋กœ ์žฌ๊ท€ํ•จ์ˆ˜ ์กฐ๊ฑด์ด ํ•„์š”ํ•˜๋‹ค
//  if (typeof node === 'string') {
//    return document.createTextNode(node);
//  }

  const element = document.createElement(node.tag);
  // h1์œผ๋กœ ๋œ element๋ฅผ create

  node.children
    .map(createDOM)
    .forEach(element.appendChild.bind(element));

  return element;
}
  • map ํ•จ์ˆ˜์—๊ฒŒ ์žฌ๊ท€ํ˜ธ์ถœ ํŒจํ„ด์ด๋ผ createDOM์„ ๊ทธ๋Œ€๋กœ ์ค€๋‹ค
  • createDOM์€ element๋ฅผ return ํ•œ๋‹ค
  • map ์ˆœํšŒ์—์„œ ๋Œ๋ ค๋ฐ›์€ element๋Š” ๋ฐ”๊นฅ scope element์˜ ์ž์‹์š”์†Œ๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค
  • appendChild ํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ map ์—์„œ return ๋ฐ›์€ element์— ๋Œ€ํ•œ context๋ฅผ ์œ ์ง€์‹œ์ผœ์ฃผ๊ธฐ ์œ„ํ•ด bind๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

VDOM ๋งŒ์œผ๋กœ๋Š” ์ข€ ๋ถˆํŽธํ•ด ๋ณด์ธ๋‹ค
โžก๏ธ element ๋ฝ‘์•„์ฃผ๋Š” ๊ณต์žฅ์„ ๋งŒ๋“ค์ž (createElement)

๊ฐ์ฒด ์ƒ์„ฑ ํ•จ์ˆ˜

VDOM ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๊ฐ€ ์„ธ๊ฐœ์˜ ์†์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด์˜ ๋‹จ์ˆœ ๋ฐ˜๋ณต์ด๋ผ๋Š” ์ƒ๊ฐ์—์„œ ํŒŒ๋ณด์ž.
๊ฒฐ๊ตญ ๊ทธ ์„ธ๊ฐœ์˜ ์†์„ฑ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๋ฉด ๊ทธ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณต ํ˜ธ์ถœ ํ•˜๋ฉด์„œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

createElement('h1', {className: "hi"}, children : ['hello'])
export function createElement(tag, props, ...children) {
  return { tag, props, children };
}

children์€ ์‹ค์ œ๋กœ ๋ฐฐ์—ด์ด ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— createElement ์ž์ฒด์— ๊ฐ€๋ณ€์ธ์ž๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

  • ๊ธฐ์กด์ฝ”๋“œ
const vdom = {
  tag: 'div',
  props: {},
  children: [
    {
      tag: 'h1',
      props: {},
      children: ['Hello, React!'],
    },
    {
      tag: 'ul',
      props: {},
      children: [
        {
          tag: 'li',
          props: {},
          children: ['์ฒซ ๋ฒˆ์งธ ์•„์ดํ…œ'],
        },
        {
          tag: 'li',
          props: {},
          children: ['๋‘ ๋ฒˆ์งธ ์•„์ดํ…œ'],
        },
        {
          tag: 'li',
          props: {},
          children: ['์„ธ ๋ฒˆ์งธ ์•„์ดํ…œ'],
        },
      ],
    },
  ],
};
  • createElement๋ฅผ ํ†ตํ•ด ๋งŒ๋“  VDOM
const vDom = createElement(
  'div',
  {},
  createElement('hi', {}, 'Hello, hi'),
  createElement(
    'ul',
    {},
    createElement('li', { style: 'color: blue' }, '์ฒซ ๋ฒˆ์จฐ ๊ฐ€๊ฒŒ ใ…‹'),
    createElement('li', { style: 'color: red' }, '๋‘ ๋ฒˆ์จฐ ๊ฐ€๊ฒŒ'),
    createElement('li', { style: 'color: yellow' }, '์„ธ ๋ฒˆ์จฐ ๊ฐ€๊ฒŒ')
  )
);

<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>

const vDom = createElement(
  'ul',
  {}, // props
  createElement(li, {}, 1) // children
)

createElement ์ž์ฒด๊ฐ€ ๊ฐ€๋ณ€ ์ธ์ž๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋˜์–ด์žˆ๋‹ค๋ณด๋‹ˆ, UI๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๊ต‰์žฅํžˆ ๋ณต์žกํ•ด ์งˆ ๊ฒƒ์ด๋‹ค.
๋” ํŽธ๋ฆฌํ•œ ์‚ฌ์šฉ์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? โžก๏ธ JSX ๋“ฑ์žฅ

JSX

1. createElement ์ˆจ๊ธฐ๊ธฐ

์ดˆ๊ธฐ์— ๊ฐœ๋ฐœ์‹œ์— createElement ํƒœ๊ทธ์™€ prop, children ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ ๋งŒ๋“ค์—ˆ์„ ๊ฒƒ์ด๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฐฉ์‹์€ ์ต์ˆ™์น˜ ์•Š์•„์„œ ์ž˜ ์•ˆ์“ฐ์ด๊ฒŒ ๋  ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ์ต์ˆ™ํ•œ ํฌ๋งท์œผ๋กœ ๋งŒ๋“ค์–ด ๋ณด์ž.

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•, markup ๋ฐฉ๋ฒ•
ํ˜•ํƒœ๋Š” html ํƒœ๊น…ํ•˜๋“ฏ์ด ์ฝ”๋”ฉํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” createElement ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜๋Š” ์‹์œผ๋กœ ๋งŒ๋“ค๊ธฐ

2. React๊ฐ€ ์—†์–ด์š”

markup ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ๋งŒ๋“  ์ฝ”๋“œ์ด๋‹ค.

const vdom2 = (
  <p>
    <h1>React ๋งŒ๋“ค๊ธฐ</h1>
    <ul>
      <li style="color: red">์ฒซ ๋ฒˆ์งธ ์•„์ดํ…œ</li>
      <li style="color: blue">๋‘ ๋ฒˆ์งธ ์•„์ดํ…œ</li>
      <li style="color: yellow">์„ธ ๋ฒˆ์งธ ์•„์ดํ…œ</li>
    </ul>
  </p>
);

// render(App, document.getElementedById('root'))
render(vdom2, document.querySelector('#root'));

  • React is not defined
    webpack.config ๋ฅผ ๋ณด๋ฉด ์„ธํŒ…์ด ๋‹ค ๋˜์–ด์žˆ๋Š”๋ฐ, js ํŒŒ์ผ์€ babel-loader๋ผ๊ณ  ํ•˜๋Š” loader์—๊ฒŒ ์ „๋‹ฌ ๋˜๊ฒŒ๋” ๋˜์–ด์žˆ๋‹ค.

@babel/preset-react๋ž€? ์‹ค์ œ ๋ฐ”๋ฒจ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ค‘ ํ•˜๋‚˜๋กœ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์•ˆ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” JSX ์ฆ‰, markup์€ ์•„๋‹ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ ์žˆ๋Š” ๋ฌธ๋ฒ•์„ ๋ฐ”๊ฟ”์ค€๋‹ค.
JSX โžก๏ธ createElement

์‹ค์ œ ๋ณ€ํ™˜๋œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด React.createElement๋ผ๊ณ  ๋˜์–ด์žˆ๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์šฐ๋ฆฌ๋Š” React๋ฅผ import ํ•ด์ฃผ์ง€ ์•Š์•„์„œ ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผํ• ๊นŒ?
    import React from 'react'; ๋ฅผ ๊ผญ ๊ธฐ์ž… ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

3. ํ˜ธํ™˜์„ฑ ๋งž์ถ”๊ธฐ


์—ฌ์ „ํžˆ runtime ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ์ƒํ™ฉ์—์„œ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ• ๊นŒ?
์˜ค๋ฅ˜๋ฅผ ์‚ดํŽด๋ณด๋ฉด null์ด๋‚˜ undefined๋ฅผ convert ํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ๋‚˜์™€์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” props๋ฅผ ๋นˆ ๊ฐ์ฒด{}๋กœ ๋ณด๋‚ด์ค˜์•ผ ํ•˜๋Š”๋ฐ ํ˜„์žฌ๋Š” null๋กœ ๋ณด๋‚ด์ง€๊ณ  ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.

  • ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  createElement ํ•จ์ˆ˜์˜ default ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”๊พธ๋ฉด ๋ ๊นŒ? No
    export function createElement(tag, props = {}, ...children) {
     return { tag, props, children };
    }
    ์ด๋•Œ props์˜ ๊ฐ’์ด ์—†์„ ๋•Œ {} ๋นˆ๊ฐ์ฒด๋กœ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ props์˜ ๊ฐ’์ด undefined ์ผ๋•Œ๋งŒ ์žก์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ๋Š” null(object ์ทจ๊ธ‰)์ด ๋˜์–ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ฐฉ์–ด ์ฝ”๋“œ
    export function createElement(tag, props, ...children) {
     props = props ?? {};
     return { tag, props, children };
    }
    ์ด ์ฝ”๋“œ ์ฒ˜๋Ÿผ ๋ฐฉ์–ด ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์ž‘๋™ํ•˜๊ฒŒ ํ–ˆ๋‹ค.

4. ๊ตฌ์กฐ์— ๊ธฐ์ธํ•œ ์ œ์•ฝ์‚ฌํ•ญ

createElement ๋ผ๊ณ  ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” โ€˜์ฝ”๋“œโ€™๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์— ๊ธฐ์ธํ•œ ์ œ์•ฝ์‚ฌํ•ญ ์ฒดํฌ

import React from 'react';
import { /**createElement**/, render } from './react';

  • createElement๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์ฝ”๋“œ์ƒ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ, ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
  • ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด JSX๊ฐ€ createElement ํ•จ์ˆ˜๋กœ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

React์—์„œ๋„ ์ด๋Ÿฌํ•œ ์˜ˆ๊ฐ€ ์žˆ๋‹ค.

import React from 'react' 
// ํ•ญ์ƒ React๋ฅผ import ํ•ด์˜ค์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.
// ์™œ ? Build ๋œ ํŒŒ์ผ์—์„œ React.createElement ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์—

QnA

1. Virtual DOM์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

Virtual DOM์€ ์‹ค์ œ DOM์„ ์ถ”์ƒํ™”ํ•œ ๊ฐœ๋…์œผ๋กœ์„œ, ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ€์ƒ์œผ๋กœ ์กด์žฌํ•˜๋Š” DOM์˜ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. ์ด๋Š” JavaScript ๊ฐ์ฒด๋กœ์„œ ์กด์žฌํ•˜๋ฉฐ, ์‹ค์ œ DOM๊ณผ๋Š” ๋ณ„๋„๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

2. Virtual DOM์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ(props๋‚˜ state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ) ๋งˆ๋‹ค ์ƒˆ๋กœ์šด Virtual DOM ํŠธ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ์ƒˆ๋กœ์šด ํŠธ๋ฆฌ์™€ ์ด์ „ ํŠธ๋ฆฌ๋ฅผ ๋น„๊ตํ•˜์—ฌ(์ด๋ฅผ Diffing ์ด๋ผํ•จ), ์‹ค์ œ DOM์—์„œ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„, ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•˜๋Š” ๊ณผ์ •์„ Reconciliation์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

3. Virtual DOM์€ ์™œ ํ•„์š”ํ•œ๊ฐ€? ์ด๋ฅผ ๋„์ž…ํ•ด์„œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋‚˜?

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

4. Virtual DOM๊ณผ Real DOM์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

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

5. Reconciliation(์กฐ์ •)๊ณผ Diffing(์ฐจ์ด ๋น„๊ต) ๊ณผ์ •์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

Diffing์€ ๋‘ ๊ฐœ์˜ Virtual DOM ํŠธ๋ฆฌ(์ปค๋ฐ‹๊ณผ์ •๊ณผ ๋ Œ๋”๊ณผ์ •์˜ Virtual DOM)๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋‘ ํŠธ๋ฆฌ ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.
์ด ์ฐจ์ด๋Š” diff๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ์ด diff๋ฅผ ์‚ฌ์šฉํ•ด ์‹ค์ œ DOM์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด Reconciliation ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

6. VDOM์€ ์–ด๋–ค์‹์œผ๋กœ diffing ํ•˜๋‚˜์š”?


React ์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ์—…๋ฐ์ดํŠธ๋Š” ์ฃผ๋กœ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ƒํƒœ(state)์˜ ๋ณ€๊ฒฝ๊ณผ ์†์„ฑ(props)์˜ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค.

  • ์ƒํƒœ์˜ ๋ณ€๊ฒฝ : useState ๋˜๋Š” this.setState(ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด, React๋Š” ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค.
  • ์†์„ฑ์˜ ๋ณ€๊ฒฝ : ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜๋ฉด, ํ•ด๋‹น ์†์„ฑ์„ ์ „๋‹ฌ๋ฐ›์€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค.

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

React์˜ Reconciliation ๊ณผ์ •์€ ๋งค์šฐ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐ€์ •์— ๊ธฐ๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค :

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

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

7. Virtual DOM์ด ํ•ญ์ƒ Real DOM๋ณด๋‹ค ํšจ์œจ์ ์ธ๊ฐ€์š”? ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

ํ•ญ์ƒ ๊ทธ๋ ‡๋‹ค๊ณ  ๋งํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. Virtual DOM์ด ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์ž‘์€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋งŽ์ด ๋ฐœ์ƒํ•  ๋•Œ ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋ณ€ํ™”๊ฐ€ ๋งŽ์ด ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์‹ค์ œ DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (React๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ)
๊ทผ๋ฐ React ์“ฐ๋ฉด VDOM ๋‹ค๋ฃจ๋Š”๊ฒŒ ๋งž๋‹ค.

8. Virtual DOM์ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

Virtual DOM์€ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ๋งŒ์„ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•จ์œผ๋กœ์จ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ฆ‰์‹œ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•˜๋Š” ๋Œ€์‹ , ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ•œ๊บผ๋ฒˆ์— ๋ชจ์•„์„œ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

re-rendering๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ๋‹ค

re rendering์„ ํ•˜๋Š” ๊ณผ์ •

๋ Œ๋”๋ง์˜ ๊ณผ์ •์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ๋‹จ๊ณ„(Trigging, Render Phase, Commit Phase)๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์–ตํ•  ์ ์€ ์ด ๋ชจ๋“  ๊ณผ์ •์ด ๋™๊ธฐ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ณ  ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค๋Š” ์ ์ด๋‹ค. ์ด๊ฒƒ์€ React์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ (๋น„๋™๊ธฐ๋ผ๊ณ  ํ•ด์„œ) Promise๋Š” ์•„๋‹˜
โžก๏ธ ๋‹จ์ง€ ํ•ด๋‹น ์ž‘์—…์ด ์ฆ‰์‹œ ์™„๋ฃŒ๋˜์ง€ ์•Š๊ณ , ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ํ•ด๋‹น ์ž‘์—…์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋„๋ก ์ผ๋ถ€ ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ

React์˜ Concurrent Mode์—์„œ๋Š” ๋ Œ๋”๋ง ์ž‘์—…์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋„๋ก ์Šค์ผ€์ค„๋ง ๋œ๋‹ค. ์ฆ‰, ์ด ์ž‘์—…์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋Š์–ด์งˆ ์ˆ˜ ์žˆ๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ๋‹ค์‹œ ์‹œ์ž‘๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋™์‹œ์— ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ํ™•๋ณดํ•˜๊ฒŒ ๋œ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ์‚ฌ์šฉ์ž ์ฝ”๋“œ ์ธก๋ฉด์—์„œ๋Š” ์ง์ ‘ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” setState๋‚˜ useEffect์™€ ๊ฐ™์€ React API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์š”์ฒญํ•˜๊ณ , ๊ทธ๋Ÿฌ๋ฉด React๋Š” ์ด๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์Šค์ผ€์ค„๋งํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Fiber๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€?

  • Fiber Node: Fiber๋Š” React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” JavaScript ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ, ๋ผ์ดํ”„์‚ฌ์ดํด ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Fiber Node๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ž‘์—… ๋‹จ์œ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • Fiber Tree: Fiber Node๋“ค์€ Fiber Tree๋ฅผ ํ˜•์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” DOM ํŠธ๋ฆฌ์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ž‘์—… ๋‹จ์œ„์ธ Fiber๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Reconciliation and Rendering: Fiber ์•„ํ‚คํ…์ฒ˜๋Š” ๋‘ ๋‹จ๊ณ„๋กœ ์ž‘์—…์„ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ์ฒซ์งธ, Reconciliation ๋‹จ๊ณ„์—์„œ๋Š” ์ƒˆ๋กœ์šด Fiber Tree๋ฅผ ์ƒ์„ฑํ•˜๊ณ  diffing์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜์งธ, Commit ๋‹จ๊ณ„์—์„œ๋Š” ์‹ค์ œ DOM์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  • Cooperative Scheduling and Concurrent Mode: Fiber๋Š” ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ Cooperative Scheduling์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์ด๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋™์‹œ์— ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” Concurrent Mode๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

1. Trigging

ํŠธ๋ฆฌ๊น… ๋‹จ๊ณ„๋Š” ์ƒํƒœ ๋˜๋Š” ์†์„ฑ์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  React์—๊ฒŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋„๋ก ์ง€์‹œํ•˜๋Š” ๋‹จ๊ณ„์ด๋‹ค.
์ด๋Š” setState ๋ฉ”์„œ๋“œ ๋˜๋Š” useState ํ›…์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒˆ๋กœ์šด props๋ฅผ ์ „๋‹ฌ ๋ฐ›์„ ๋•Œ๋„ ์ด ํŠธ๋ฆฌ๊น… ๋‹จ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

2. Render Phase

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

3. Commit Phase

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

์ด ๊ณผ์ •์„ ํ†ตํ•ด React๋Š” ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋ฉฐ, ๋น ๋ฅธ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. setState๋‚˜ useState๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒˆ props๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ, ์ƒˆ๋กœ์šด Virtual DOM ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด์ „ ํŠธ๋ฆฌ์™€ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ฐพ์•„๋‚ด๊ณ , ๊ทธ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜์—ฌ React๋Š” ๋ณ€ํ™”๊ฐ€ ๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

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