Skip to main content

๋ฆฌ์•กํŠธ ๋ฐฐ์นญ(Batching)์˜ ๋ชจ๋“  ๊ฒƒ

2024๋…„ 3์›” 13์ผAbout 2 minJavaScriptTypeScriptReact.jsArticle(s)blogyozm.wishket.comjsjavascripttstypescriptreactreactjs

๋ฆฌ์•กํŠธ ๋ฐฐ์นญ(Batching)์˜ ๋ชจ๋“  ๊ฒƒ ๊ด€๋ จ

React.js > Article(s)

Article(s)

๋ฆฌ์•กํŠธ ๋ฐฐ์นญ(Batching)์˜ ๋ชจ๋“  ๊ฒƒ | ์š”์ฆ˜IT
๋ฆฌ์•กํŠธ ๋ฐฐ์นญ(Batching)์˜ ๋ชจ๋“  ๊ฒƒ

2022๋…„ 3์›”, ๋ด„์ด ์‹œ์ž‘๋˜๋ฉด์„œ ๋ฆฌ์•กํŠธ ์„ธ๊ณ„์—๋„ ์ƒˆ๋กœ์šด ๋ณ€ํ™”์˜ ๋ฐ”๋žŒ์ด ๋ถˆ์–ด์™”์Šต๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ 18๋ฒ„์ „์ด ์ถœ์‹œ๋˜์—ˆ๋Š”๋ฐ, ์ด์ „ ๋ฒ„์ „์ธ ๋ฆฌ์•กํŠธ 17์ด ๋ฆฌ์•กํŠธ 16์— ๋น„ํ•ด ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง„ ์ ์ด ์—†๋‹ค๋Š” ํ‰์„ ๋ฐ›์•˜๋˜ ๊ฒƒ๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ๋ฆฌ์•กํŠธ 18์—์„œ๋Š” ์—ฌ๋Ÿฌ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์†Œ๊ฐœ๋˜์–ด ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๊ด€์‹ฌ์„ ๋Œ์—ˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ ๋ชจ๋“œ์™€ ์ž๋™ ๋ฐฐ์นญ(Automatic Batching)์„ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ์‹คํ—˜์ ์ด์ง€๋งŒ ์œ ์šฉํ•œ ๊ฐœ๋ฐœ ๊ธฐ๋Šฅ๋“ค์ด ๊ทธ ์ค‘์‹ฌ์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ์ค‘์—์„œ๋„ ์ž๋™ ๋ฐฐ์นญ์€ 2๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ๊นŒ์ง€ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ํ‰๊ฐ€๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ์ค‘์—์„œ๋„ ๊ฐ€์žฅ ํ˜ธํ‰๋ฐ›๋Š” ๋ถ€๋ถ„์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŠน๋ณ„ํžˆ ๋ฆฌ์•กํŠธ ์ƒํƒœ๊ณ„์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๊ฐ–์ถ”์ง€ ์•Š๋”๋ผ๋„, ์Šค์Šค๋กœ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•˜๋„๋ก ๋งŒ๋“ค์–ด์กŒ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋ฉ”์ด์ €(Major) ๋ฒ„์ „์„ ์˜ฌ๋ ธ์„ ๋•Œ, ํ”„๋กœ์ ํŠธ์˜ ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๋งŽ์€ ๊ฒƒ๋“ค์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ–ˆ๋˜ ๊ฒฝํ—˜์— ๋น„์ถ”์–ด๋ณด๋ฉด ์ƒ๋‹นํ•œ ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„ ๋“ฏํ•ฉ๋‹ˆ๋‹ค.

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

์ด ๊ธ€์€ ๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ ๋ฌธ๋ฒ•๊ณผ ์ƒํƒœ ๊ฐ’ ๋ณ€๊ฒฝ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•ด UI ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ ์ตœ์†Œํ•œ์˜ ์‚ฌ์šฉ ๊ฒฝํ—˜์„ ๊ฐ–๊ณ  ๊ณ„์‹œ๋ฉด ๋”์šฑ ์žฌ๋ฐŒ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜: ์ž‘๊ฐ€
์ถœ์ฒ˜: ์ž‘๊ฐ€

๋ฆฌ์•กํŠธ์˜ ๋ฐฐ์นญ๊ณผ ์ž๋™ ๋ฐฐ์นญ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ ์ „, ์—ฌ๋Ÿฌ๋ถ„์€ ๋ฐฐ์นญ์— ๋Œ€ํ•ด ์–ผ๋งˆ๋‚˜ ์•Œ๊ณ  ์žˆ๋‚˜์š”? ๋ฆฌ์•กํŠธ์—์„œ ๋ฐฐ์นญ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

  1. UI ๋ ˆ์ด์•„์›ƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…
  2. ๋ฆฌ์•กํŠธ์˜ ์ƒํƒœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…
  3. ๋ฆฌ์•กํŠธ์˜ ์ƒํƒœ ๊ฐ’์„ ์ผ์ •ํ•œ ์ฃผ๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—…
  4. ๋ฆฌ์•กํŠธ ํ›…์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š” ์ž‘์—…

๋ฐฐ์นญ์„ ์ดํ•ดํ•˜๊ธฐ ์ „, ์šฐ๋ฆฌ๋Š” ๋ฆฌ์•กํŠธ๊ฐ€ ์ƒํƒœ ๊ฐ’ ๋ณ€๊ฒฝ์— ์–ด๋–ป๊ฒŒ ๋Œ€์‘ํ•˜๋Š”์ง€ ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ์š”. ๋จผ์ € ๋ฆฌ์•กํŠธ์˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


๋ฆฌ์•กํŠธ์˜ ๋ Œ๋”๋ง ๊ณผ์ •

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

๋ฒ„์Šค์™€ ๋ฒ„์Šค ๋…ธ์„ ๋„๋ฅผ ํ‘œํ˜„ํ•œ ๊ทธ๋ฆผ์œผ๋กœ ๋ฆฌ์•กํŠธ ์„ธ๊ณ„๊ด€๊ณผ ๊ฐ™๋‹ค.
๋ฒ„์Šค์™€ ๋ฒ„์Šค ๋…ธ์„ ๋„๋ฅผ ํ‘œํ˜„ํ•œ ๊ทธ๋ฆผ์œผ๋กœ ๋ฆฌ์•กํŠธ ์„ธ๊ณ„๊ด€๊ณผ ๊ฐ™๋‹ค.

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

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

์ด์ œ ๋ฆฌ์•กํŠธ์˜ ์ƒํƒœ ๊ฐ’ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๋ณด๋ฉฐ, ๋ฒ„์Šค ๊ธฐ์‚ฌ์™€ ์Šน๊ฐ์ด ์„œ๋กœ ์–ด๋–ป๊ฒŒ ํ–‰๋™ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ๋ฆฌ์•กํŠธ ๋ Œ๋”๋ง

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

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

๋ฒ„์Šค๊ฐ€ ์ •๋ฅ˜์žฅ์— ๋ฉˆ์ถ”๋ฉด ์—ฌ๋Ÿฌ ์Šน๊ฐ์ด ํƒ€๊ณ  ๋‚ด๋ฆฐ๋‹ค.
๋ฒ„์Šค๊ฐ€ ์ •๋ฅ˜์žฅ์— ๋ฉˆ์ถ”๋ฉด ์—ฌ๋Ÿฌ ์Šน๊ฐ์ด ํƒ€๊ณ  ๋‚ด๋ฆฐ๋‹ค.

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

2. ์กฐ์ •(Reconciliation)

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

๋˜ํ•œ ์ขŒ์„ ๋ฒ„์Šค์˜ ๊ฒฝ์šฐ ๋ฒ„์Šค ์•ž ์œ ๋ฆฌ์ฐฝ๊ณผ ์šด์ „์„ ๋‚ด๋ถ€์— ๋‚จ์€ ์ขŒ์„ ์ˆ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๋ฆด ์‚ฌ๋žŒ์€ ๋‚ด๋ฆฌ๊ณ  ํƒˆ ์‚ฌ๋žŒ์€ ํƒ€๋ฉด์„œ ๋ฒ„์Šค ์•ˆ์ด ์ž ์‹œ ๋ถ„์ฃผํ•ด์ง‘๋‹ˆ๋‹ค. ์–ด๋А ์ •๋„ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋ฒ„์Šค ์•ˆ์˜ ์Šน๊ฐ์€ ๋ช‡ ๋ช…์ด๋‚˜ ์žˆ๋Š”์ง€, ์–ด๋А ์ž๋ฆฌ์— ๋ˆ„๊ฐ€ ์•‰์•˜๋Š”์ง€, ์–ด๋–ค ์˜ท์„ ์ž…์€ ์‚ฌ๋žŒ๋“ค์ด ํƒ€๊ณ  ์žˆ๋Š”์ง€ ๋“ฑ ๋‚ด๋ถ€ ์ „๊ฒฝ์ด ์กฐ๊ธˆ ๋‹ฌ๋ผ์งˆ ์ˆ˜๋„ ์žˆ์ฃ . ์ด ๊ณผ์ •์ด ๋ฆฌ์•กํŠธ์˜ ์กฐ์ • ๋‹จ๊ณ„์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์Šค ์Šน๊ฐ์ด ๋ชจ๋‘ ํƒ€๊ณ  ๋‚ด๋ฆฌ๋ฉด ๋ฒ„์Šค ๊ธฐ์‚ฌ๋Š” ๋ฌธ์„ ๋‹ซ๊ณ  ๋‹ค์‹œ ์ถœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ€์ƒ ๋”์˜ ๋น„๊ต๊ฐ€ ๋๋‚˜๋ฉด ๋ฆฌ์•กํŠธ๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

3. ์ ์šฉ(Commit)

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

์—ฌ๊ธฐ๊นŒ์ง€ ์ด๋ค„์ง€๋ฉด ์ƒํƒœ ๊ฐ’์˜ ๋ณ€ํ™”๋ถ€ํ„ฐ UI์˜ ๋ณ€๊ฒฝ๊นŒ์ง€ ํ•˜๋‚˜์˜ ๊ณผ์ •์ด ๋ชจ๋‘ ์ข…๋ฃŒ๋˜๊ณ , ๋ฆฌ์•กํŠธ๋Š” ๋‹ค์‹œ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด ๋ฆฌ์•กํŠธ(๋ฒ„์Šค ๊ธฐ์‚ฌ)๋Š” ๋‹ค์‹œ ๋ Œ๋”๋ง๋ถ€ํ„ฐ(์Šน๊ฐ์ด ํ•˜์ฐจ ๋ฒจ์„ ๋ˆ„๋ฅด๋Š” ๊ฒƒ๋ถ€ํ„ฐ) ์‹œ์ž‘ํ•  ์ค€๋น„๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด์ฃ .


๋ฆฌ์•กํŠธ ๋ฐฐ์นญ์ด๋ž€?

์œ„์˜ ๋ฒ„์Šค ๊ธฐ์‚ฌ์™€ ๋ฒ„์Šค ์šดํ–‰์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋ฅผ ์ดํ•ดํ–ˆ๋‹ค๋ฉด, ์ด์ œ ๋ฐฐ์นญ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ์ค€๋น„๊ฐ€ ๋˜์—ˆ์„ ๊ฒ๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ๋ฒ„์Šค ๊ธฐ์‚ฌ์™€ ๋ฒ„์Šค ์ด์•ผ๊ธฐ์—์„œ ๋ฐฐ์นญ์ด ์–ด๋А ๋ถ€๋ถ„์— ํ•ด๋‹นํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ๊ฒŒ์š”.

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

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

๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์‹œ ์•ž์˜ ์งˆ๋ฌธ์œผ๋กœ ๋Œ์•„๊ฐ€, ๋ฐฐ์นญ์ด ๋ฌด์—‡์ธ์ง€ ๋ฌผ์–ด๋ณธ๋‹ค๋ฉด ์ด์ œ๋Š” ๋Œ€๋‹ตํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

  1. UI ๋ ˆ์ด์•„์›ƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…
  2. ๋ฆฌ์•กํŠธ์˜ ์ƒํƒœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…
  3. ๋ฆฌ์•กํŠธ์˜ ์ƒํƒœ ๊ฐ’์„ ์ผ์ •ํ•œ ์ฃผ๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—… (์ •๋‹ต!)
  4. ๋ฆฌ์•กํŠธ ํ›…์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š” ์ž‘์—…

์ด์ฒ˜๋Ÿผ ๋ฐฐ์นญ์€ ์ด๋ฒคํŠธ๋กœ ์ธํ•ด ๋ณ€๊ฒฝ๋˜๋Š” ๋ณ€๊ฒฝ ์ ์ด ํ•˜๋‚˜๋ฟ์ด๋“ , ์—ฌ๋Ÿฌ ๊ฐœ๋“  ์ผ์ •ํ•œ ์ฃผ๊ธฐ์— ๋งž์ถฐ ๋‹ค ๊ฐ™์ด ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฆฌ์•กํŠธ์˜ ๋‚ด๋ถ€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.


์˜ˆ์‹œ ์ฝ”๋“œ

์ด๋ฒˆ์—๋Š” ์‹ค์ „ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๋ฐฐ์นญ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” A์™€ B๋ฅผ ์ž„์˜์˜ ์ˆซ์ž๋กœ ํ• ๋‹นํ•ด ์ฃผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฒ„ํŠผ์— ์—ฐ๊ฒฐํ•ด ๋†“์•˜์Šต๋‹ˆ๋‹ค. ๋‘ ์ˆ˜์˜ ํ•ฉ์€ MAX์ธ 100์„ ๋„˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๋ฉด useEffect์—์„œ ๊ฐ์ง€ํ•ด ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•ด ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

const MAX = 100;

const getRandomNumber = ()  {
  // 1๋ถ€ํ„ฐ 99์‚ฌ์ด์˜ ๋žœ๋ค ์ˆซ์ž ๋ฐ˜ํ™˜
  return Math.floor(Math.random() * (MAX - 1 - 1) + 1);
};

export default function App() {
  const [A, setA] = useState(50);
  const [B, setB] = useState(50);

  const handleClick = () => {
    const randomA = getRandomNumber();

    setA(randomA);
    setB(MAX - randomA);
  };

  useEffect(() => {
    console.log(`A: ${A}, B: ${B}, Total: ${A + B}`);
  }, [A, B]);

  return (
    <div className="App">
      <button onClick={handleClick}>์žฌ๋ฐฐ์น˜</button>
      <h4>A: {A}</h4>
      <h4>B: {B}</h4>
    </div>
  );
}

๋ฆฌ์•กํŠธ ๋ฐฐ์นญ์ด ์ ์šฉ๋œ ๊ฒฐ๊ณผ

๋ฐฐ์นญ์€ ๋‹จ์ผ ๋˜๋Š” ์—ฌ๋Ÿฌ ์ƒํƒœ ๊ฐ’์˜ ๋ณ€ํ™”๊ฐ€ ๋™์ผํ•œ ์ด๋ฒคํŠธ ์ฃผ๊ธฐ์—์„œ ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์นญ์ด ์ ์šฉ๋  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

๋ฐฐ์นญ์€ ์—ฌ๋Ÿฌ ์ƒํƒœ ๊ฐ’์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ™์€ ์ฃผ๊ธฐ์— ์ฒ˜๋ฆฌ๋˜๋„๋ก ๋„์™€์ค€๋‹ค.
๋ฐฐ์นญ์€ ์—ฌ๋Ÿฌ ์ƒํƒœ ๊ฐ’์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ™์€ ์ฃผ๊ธฐ์— ์ฒ˜๋ฆฌ๋˜๋„๋ก ๋„์™€์ค€๋‹ค.

์ƒํƒœ ๊ฐ’ A, B๊ฐ€ ๋™์‹œ์— ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋ฐฐ์นญ ๋•๋ถ„์— ๋‘ ์ƒํƒœ ๊ฐ’์ด ๊ฐ™์€ ํƒ€์ด๋ฐ์— ๋ณ€๊ฒฝ๋˜์–ด, ๋ Œ๋”๋ง์ด ํ•œ ๋ฒˆ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœํ•  ๋•Œ ํฌ๊ฒŒ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ๋ฐฐ์นญ์˜ ๋ฌธ์ œ์ ์€?

๊ธฐ์กด ๋ฆฌ์•กํŠธ 17๋ฒ„์ „๊นŒ์ง€๋Š” ๋ฐฐ์นญ์— ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ์š”. ๋ฐ”๋กœ ์œ ์ € ์ด๋ฒคํŠธ์— ์—ฐ๊ฒฐ๋œ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ง์ ‘์ ์œผ๋กœ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ ๊ฐ’๋งŒ ๋ฐฐ์นญ์˜ ๋ฒ”์œ„ ์•ˆ์— ๋“ค์–ด์™”๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํƒ€์ด๋จธ(setTimeout), ํ”„๋กœ๋ฏธ์Šค, Native Event ๋“ฑ์€ ๋ฐฐ์นญ์˜ ํšจ๊ณผ๋ฅผ ๋ˆ„๋ฆด ์ˆ˜ ์—†์—ˆ๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ์ ์€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€์—ˆ์ฃ .

๋ฆฌ์•กํŠธ 17๋ฒ„์ „๊นŒ์ง€ ๋ฐฐ์นญ์€ ํƒ€์ด๋จธ์™€ ํ”„๋กœ๋ฏธ์Šค ๋“ฑ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•˜๋‹ค.
๋ฆฌ์•กํŠธ 17๋ฒ„์ „๊นŒ์ง€ ๋ฐฐ์นญ์€ ํƒ€์ด๋จธ์™€ ํ”„๋กœ๋ฏธ์Šค ๋“ฑ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•˜๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ

์œ„์˜ ์˜ˆ์‹œ ์ฝ”๋“œ์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

const sleep = (t) => {
  return new Promise(res  setTimeout(res, t));
}

๊ทธ๋ฆฌ๊ณ  ๋ฆฌ์•กํŠธ์˜ ์ด๋ฒคํŠธ ํ•จ์ˆ˜๋ฅผ ์‚ด์ง ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

const handleClick = async () => {
  // Promise๋ฅผ ์‚ฌ์šฉํ•ด Promise ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝ๋˜๋„๋ก ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  await sleep(0);

  const randomA = getRandomNumber();

  setA(randomA);
  setB(MAX - randomA);
};

์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝ ํ›„ ๋ฆฌ์•กํŠธ 17๋ฒ„์ „์—์„œ ๋‹ค์‹œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณด๋ฉด, ์ด๋ฒˆ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ Œ๋”๋ง์ด ๋‘ ๋ฒˆ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋‹ค.
๋ Œ๋”๋ง์ด ๋‘ ๋ฒˆ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ณ€ํ™”๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด, A์™€ B๋Š” ๋ชจ๋‘ 50์—์„œ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์ฝ˜์†”์—๋Š” A์™€ B๋Š” ๋ชจ๋‘ 50์œผ๋กœ, ์ดํ•ฉ๊ณ„๋Š” 100์œผ๋กœ ์ถœ๋ ฅ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์žฌ๋ฐฐ์น˜ ๋ฒ„ํŠผ์„ ํ•œ ๋ฒˆ ๋ˆ„๋ฅด๊ณ  ๋‚˜์„œ ์ฝ˜์†”์—” ์ˆœ๊ฐ„ ๋กœ๊ทธ๊ฐ€ ๋‘ ๋ฒˆ์ด ์ถœ๋ ฅ๋˜๋Š”๋ฐ์š”. ์ด๋•Œ ๊ฐ๊ฐ A์™€ B๋Š” 87๊ณผ 50, ์ดํ•ฉ์€ 137์ด ์ถœ๋ ฅ๋˜๊ณ , ๋ฐ”๋กœ ๋’ค์— ์ถœ๋ ฅ๋˜๋Š” ๋กœ๊ทธ์—” A์™€ B๋Š” 87, 13์ด ์ถœ๋ ฅ๋˜๊ณ  ์ดํ•ฉ๋„ 100์ด ์ถœ๋ ฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ์š”?

sleep() ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ ๋‚ด๋ถ€์—์„œ๋Š” ๋‹ค์‹œ ํƒ€์ด๋จธ๋ฅผ ๋™์ž‘์‹œํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ 17๋ฒ„์ „๊นŒ์ง€๋Š” ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด, ํ•ด๋‹น ์ฝ”๋“œ๋Š” ๋ฐฐ์นญ์˜ ๋ฒ”์œ„์— ํฌํ•จ์„ ์‹œํ‚ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ A์™€ B๊ฐ€ ๊ฐ๊ฐ 87๊ณผ 13์œผ๋กœ ๋ณ€๊ฒฝ์ด ๊ฐ๊ฐ ์ด๋ค„์กŒ์ฃ . ์ƒํƒœ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ Œ๋”๋ง ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋ฆฌ์•กํŠธ์˜ ์ด๋ฒคํŠธ ์ฃผ๊ธฐ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด, ์กฐ์ •(Reconciliation)๊ณผ ์ ์šฉ(Commit)์„ ๊ฑฐ์ณ ์ปดํฌ๋„ŒํŠธ๋Š” ์ตœ์ข…์ ์œผ๋กœ A๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ํ•œ ๋ฒˆ, B๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ˜ธ์ถœ์ด ๋˜์–ด ์ด ๋‘ ๋ฒˆ์— ๊ฑธ์ณ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ ํ•จ์ˆ˜์—์„œ ๋ณ€๊ฒฝํ•˜๋Š” ์ƒํƒœ ๊ฐ’์ด ๋งŽ์„์ˆ˜๋ก ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋ฆฌ์•กํŠธ 18๋ฒ„์ „์—์„  ์–ด๋–จ๊นŒ?

์ด ์ ์€ ๋‹คํ–‰ํžˆ ๋ฆฌ์•กํŠธ 18๋ฒ„์ „์ด ์ถœ์‹œ๋˜๋ฉด์„œ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”๋ฐ์š”. createRoot ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ฆฌ์•กํŠธ ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๋ฉด, ํ”„๋กœ๋ฏธ์Šค์™€ ํƒ€์ด๋จธ๋„ ๊ฐ™์€ ์ฃผ๊ธฐ ๋‚ด์—์„œ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

// ๋ฆฌ์•กํŠธ 17๋ฒ„์ „๊นŒ์ง€๋Š” ์ด๋Ÿฌํ–ˆ์Šต๋‹ˆ๋‹ค.
import { StrictMode } from "react";
import { render } from "react-dom";

import App from "./App";

const rootElement = document.getElementById("root");

render(
  <StrictMode>
    <App />
  </StrictMode>,
  rootElement
);
// ํ•˜์ง€๋งŒ ๋ฆฌ์•กํŠธ 18๋ฒ„์ „์—์„œ๋Š” createRoot๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";

import App from "./App";

const rootElement = document.getElementById("root");
const root = createRoot(rootElement);

root.render(
  <StrictMode>
    <App />
  </StrictMode>
);

์ฐจ์ด๊ฐ€ ๋ณด์ด์‹œ๋‚˜์š”? createRoot๋กœ ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•œ ๋’ค, ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ์˜ render ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ 18๋ฒ„์ „์€  ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ํ•ด๊ฒฐ๋œ๋‹ค.
๋ฆฌ์•กํŠธ 18๋ฒ„์ „์€ createRoot ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ํ•ด๊ฒฐ๋œ๋‹ค.

๋ฆฌ์•กํŠธ 18๋ฒ„์ „์—์„œ ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด ๋ณ€๊ฒฝ๋˜์—ˆ๊ณ , ์ด์— ๋”ฐ๋ผ ํ”„๋กœ๋ฏธ์Šค์™€ ํƒ€์ด๋จธ, Native Event ๋ชจ๋‘ ์ด์ œ๋Š” ๋ฆฌ์•กํŠธ๊ฐ€ ์•Œ์•„์„œ ๊ฐ™์€ ์ฃผ๊ธฐ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ด๋ฒคํŠธ๋ฅผ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์น˜ ๋ฒ„์Šค ๊ธฐ์‚ฌ๊ฐ€ ๋›ฐ์–ด์˜ค๋Š” ์†๋‹˜๋“ค์„ ๊ธฐ๋‹ค๋ ค์ฃผ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ __์ž๋™ ๋ฐฐ์นญ(Automatic Batching)__์ด๋ผ๊ณ  ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.


๋งˆ์น˜๋ฉฐ

๋งˆ์ง€๋ง‰์œผ๋กœ ํ•œ ๋ฒˆ ๋” ์ •๋ฆฌํ•˜๋ฉด, ๋ฆฌ์•กํŠธ๋Š” ์ƒํƒœ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ƒํƒœ ๊ฐ’์„ ๋‹ค๋ฃจ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ๋ Œ๋”๋ง ๊ณผ์ •์„ ๊ฑฐ์น˜๊ณ , ์ปดํฌ๋„ŒํŠธ๊ฐ€ JSX ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ทธ๊ฒƒ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐ€์ƒ ๋”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ๊ฐ€์ƒ ๋”์€ HTML์— ์ ์šฉ๋œ ๊ฐ€์žฅ ์ด์ „ ๋ฒ„์ „์˜ ๊ฐ€์ƒ ๋”๊ณผ ๋น„๊ตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๊ณผ์ •์„ ์กฐ์ •(Reconciliation)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๋น„๊ต ํ›„ ์ตœ์ข…์ ์œผ๋กœ ์ ์šฉํ•  ๊ฐ€์ƒ ๋”์„ ๊พธ๋ฆฌ๊ฒŒ ๋˜๋ฉด, ์ ์šฉ(Commit) ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๊ณ  ์‚ฌ์šฉ์ž๋Š” UI๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋А๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ผ๋ จ์˜ ๊ณผ์ • ์ค‘ ์ƒํƒœ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ณ  ์ ์šฉ๋˜๋Š” ํƒ€์ด๋ฐ์— ์žˆ์–ด, ๋ฆฌ์•กํŠธ๋Š” ์—ฌ๋Ÿฌ ์ƒํƒœ ๊ฐ’์ด ๋˜๋„๋ก ํ•œ ๋ฒˆ์— ๋‹ค ๊ฐ™์ด ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ธฐ๋Šฅ์„ '๋ฐฐ์นญ'์ด๋ผ๊ณ  ํ‘œํ˜„ํ•˜์ฃ .

๊ธฐ์กด ๋ฐฐ์นญ์˜ ๋‹จ์ ์€ ํ”„๋กœ๋ฏธ์Šค์™€ ํƒ€์ด๋จธ, Native Event๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ ๊ฐ’ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ์— ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ๋ Œ๋”๋ง์ด ๋˜์—ˆ๋Š”๋ฐ์š”. ๊ทธ๋ž˜์„œ 18๋ฒ„์ „๋ถ€ํ„ฐ๋Š” createRoot ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ฉด, ๋ฆฌ์•กํŠธ๊ฐ€ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๊ณ  ์ด ๊ธฐ๋Šฅ์ด '์ž๋™ ๋ฐฐ์นญ'์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋ฆฌ์•กํŠธ ๋ฐฐ์นญ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ์‚ดํŽด๋ณด์•˜๋Š”๋ฐ์š”. ์ด๋ฒˆ ๊ธ€์„ ํ†ตํ•ด ๋ฐฐ์นญ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋˜์—ˆ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.