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

Develog/Study

React์˜ state๋Š” ๋™๊ธฐ์ธ๊ฐ€ ๋น„๋™๊ธฐ์ธ๊ฐ€. with ์ด๋ฒคํŠธ ๋ฃจํ”„

 
 
 

๐Ÿค” ์‹œ์ž‘ํ•˜๋ฉฐ

์ตœ๊ทผ ๊ณผ์ œํ…Œ์ŠคํŠธ๋ฅผ ๋ณด๋ฉด์„œ ๋ฌดํ•œ์Šคํฌ๋กค ๊ตฌํ˜„ ์‹œ useEffect๊ฐ€ ๋‚ด ๋งˆ์Œ๋Œ€๋กœ ๋™์ž‘์ง€ ์•Š์•˜๋‹ค.
์ถ”ํ›„ ํ•ด๊ฒฐํ•˜๊ธด ํ–ˆ์ง€๋งŒ, ๋‚˜๋Š” useState์™€ useEffect์‚ฌ์ด์—์„œ ๋ญ๊ฐ€ ์–ด๋–ค๊ฒŒ ๋จผ์ € ์‹คํ–‰๋˜๋Š”์ง€ ์ž์‹ ์žˆ๊ฒŒ ๋งํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

 

๊ฒฐ๊ตญ ์‹œ์ž‘์€ ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜์Œ ๋ฆฌ์•กํŠธ๋ฅผ ๋ฐฐ์šธ๋•Œ ํ—ท๊ฐˆ๋ ธ๋˜ ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ธ ์˜ˆ์ œ์—์„œ ์‹œ์ž‘ํ•œ๋‹ค.

const handleClick = () => {
  setCount(count + 1);
  console.log(count); // ์ด์ „ ๊ฐ’์ด ์ฐํž˜
};

 

์™œ ์—ฌ๊ธฐ์„œ ์ด์ „ ๊ฐ’์ด ์ฐํžˆ๋Š”๊ฐ€ ? ์™œ ๋ฐ”๋กœ count+1๋œ ๊ฐ’์ด ์ฐํžˆ์ง€ ์•Š๋Š”๊ฑธ๊นŒ? state๋Š” ์–ธ์ œ ์—…๋ฐ์ดํŠธ ๋˜๋Š”๊ฑธ๊นŒ?

์ด์— ๋Œ€ํ•œ ๋‹ต์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

๐Ÿ“š ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ ๊ฐ„๋‹จ ์ •๋ฆฌ

๋™๊ธฐ(sync) : ์‹คํ–‰์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค. ํ˜ธ์ถœ ์‹œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (const, let, for, if, function, console.log() ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋‘ js์˜ ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ ๋™๊ธฐ์ด๋‹ค.)

 

๋น„๋™๊ธฐ(async) : ์‹คํ–‰์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๊ฒƒ์„ ๋œปํ•œ๋‹ค. ํ˜ธ์ถœ ์‹œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์ค‘์— ๋„์ฐฉํ•œ๋‹ค. (setTimeout, fetch, Promise, await)

 

์—ฌ๊ธฐ์„œ ์ž ๊น ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์งš๊ณ  ๋„˜์–ด๊ฐ€์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ์ด๋‹ค.

 


์ฝœ์Šคํƒ์—์„œ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๊ณ  ์ด์—๋Œ€ํ•œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋“ค์ด ์ฝœ๋ฐฑํ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

 

MicroTaskQueue์— ๋‹ด๊ธฐ๋Š” ๋น„๋™๊ธฐ ๋™์ž‘ : Promise, await, queueMicrotask
MacroTaskQueue์— ๋‹ด๊ธฐ๋Š” ๋น„๋™๊ธฐ ๋™์ž‘ : setTimeout, setInterval, DOM ์ด๋ฒคํŠธ ๋“ฑ

 

 

(์šฐ์„ ์ˆœ์œ„๋Š” MicroTaskQueue > CallbackQueue ์ด๋‹ค )

 

โš™๏ธ React ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ๋ฆ„

React์˜ ๋ Œ๋”๋ง ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (setState → render → commit → effect)

์ž ์ด์ œ ๋‹ค์‹œ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž

const handleClick = () => {
  setCount(count + 1);
  console.log(count); // ์ด์ „ ๊ฐ’์ด ์ฐํž˜
};

 

์œ„ ์˜ˆ์‹œ์—์„œ ์™œ ์ด์ „๊ฐ’์ด ์ฐํž๊นŒ?

 

๊ทธ๊ฑด ๋ฐ”๋กœ setState๊ฐ€ ์ฆ‰์‹œ ์‹คํ–‰๋˜๋”๋ผ๋„ ์‹ค์ œ ๋ฐ˜์˜์€ ๋ Œ๋”๋ง ์ดํ›„์— ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ด๋Š” ์ƒํƒœ๋Š” snapshot(์ •์ ์ธ UI ๋ณต์‚ฌ๋ณธ)์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

Rendering : ์ด๋ž€ React๊ฐ€ ์ปดํฌ๋„ŒํŠธ์ธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

ํ•ด๋‹น ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” JSX ์ปดํฌ๋„ŒํŠธ๋Š” ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ UI์Šค๋ƒ…์ƒท๊ณผ ๊ฐ™๋‹ค.

 

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

 

๋ Œ๋”๋ง ์‹œ์  → count = 0
   ↓
ํด๋ฆญ ๋ฐœ์ƒ → handleClick() ์‹คํ–‰
   ↓
setCount(count + 1) → setCount(0 + 1) → "์—…๋ฐ์ดํŠธ ์˜ˆ์•ฝ"
   ↓
console.log(count) → 0 ← ์•„์ง ๋ฆฌ๋ Œ๋”๋ง ์•ˆ ๋์œผ๋‹ˆ๊นŒ!
   ↓
React๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง → count = 1
## 

 

์ด๋ ‡๊ฒŒ ์Šค๋ƒ…์ƒท์ฒ˜๋Ÿผ ์ €์žฅ๋˜๋Š” ์ด์œ ๋Š” React์˜ Batching ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋•Œ๋ฌธ์ด๋‹ค.

 

React๋Š” ํšจ์œจ์ ์ธ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ setState ํ˜ธ์ถœ์„ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜์ง€ ์•Š๊ณ ,

 

"ํ•˜๋‚˜์˜ ๋ Œ๋”๋ง ์‚ฌ์ดํด๋กœ ๋ฌถ์–ด์„œ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌ"  ๋ฐฐ์นญ(Batching) ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.


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

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ๊ฑด

setState()๋Š” ์ƒํƒœ๋ฅผ "์ฆ‰์‹œ ๋ณ€๊ฒฝ"ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ React์˜ ์—…๋ฐ์ดํŠธ ํ์— "๋ณ€๊ฒฝ ์š”์ฒญ์„ ๋“ฑ๋ก"๋งŒ ํ•œ๋‹ค.
React๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ๋ Œ๋”๋ง์ด ๋๋‚œ ๋’ค์— ๋ชจ๋“  ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ์— ์Œ“์•„๋‘”๋‹ค.

 

setCount(count + 1);
setCount(count + 1);
setCount(count + 1);
  • ์œ„์˜ ์˜ˆ์‹œ๋Š” ๋งŒ์•ฝ ๋ฐฐ์นญ์ด ์—†๋‹ค๋ฉด ๋ Œ๋”๋ง์ด 3๋ฒˆ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค.
  • ํ•˜์ง€๋งŒ ๋ฐฐ์นญ ๋•๋ถ„์— React๋Š” ํ•œ๋ฒˆ์˜ ๋ Œ๋”๋ง๋งŒ ์‹คํ–‰ํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ด ๋ชจ๋“  setCount๋Š” ๊ฐ™์€ count=0์ด๋ž€ ์ƒํƒœ์˜ ์Šค๋ƒ…์ƒท ๊ธฐ๋ฐ˜์ด๋ผ ๊ฒฐ๊ณผ๋Š” ๊ฒฐ๊ตญ count+1์ด๋‹ค.
  • ๊ฒฐ๊ตญ ๋‹ค์Œ ๋ Œ๋”๋ง์—์„œ์˜ ์ƒํƒœ ๋ณ€ํ™”๋Š”, ์ด์ „ ๋ Œ๋”๋ง ์‹œ์ ์˜ "์Šค๋ƒ…์ƒท"์„ ๊ธฐ์ค€์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์—…๋ฐ์ดํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ์ธ ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ๋ฅผ ์“ฐ๊ณ ์‹ถ๋‹ค๋ฉด ๋ฆฌ์•กํŠธ๊ฐ€ ๊ถŒ์žฅํ•˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์„ ์จ์•ผํ•œ๋‹ค.

setCount(prev => prev + 1);
setCount(prev => prev + 1);
  • ์ด ๋ฐฉ์‹์—์„  React๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐ˜์˜๋œ ์งํ›„์˜ ์ตœ์‹  ๊ฐ’์„ ๋‘ ๋ฒˆ์งธ์—๋„ ๋„˜๊ฒจ์ค€๋‹ค.
  • ์ฆ‰, React๋Š” ์ด ๋‘ ๊ฐœ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ "ํ์— ์ €์žฅ"ํ–ˆ๋‹ค๊ฐ€
    ๊ฐ ์ฝœ๋ฐฑ์„ ์ตœ์‹  ๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ์ฐจ๋ก€๋กœ ์‹คํ–‰ํ•œ๋‹ค.
  • prev => ... ํ˜•ํƒœ์˜ ์—…๋ฐ์ดํŠธ๋Š” React๊ฐ€ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ
  • "์ด์ „ ์ƒํƒœ๋ฅผ ๋„˜๊ฒจ์ค„๊ฒŒ, ๋„ค๊ฐ€ ๊ณ„์‚ฐํ•ด๋ด" ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ๋Š” ํ•ญ์ƒ ์ตœ์‹ ๊ฐ’์„ ๋ฐ›๋Š”๋‹ค
  • ์ด ๋•๋ถ„์— ๋ Œ๋”๋ง ์ค‘ ๋งŒ๋“ค์–ด์ง„ ์Šค๋ƒ…์ƒท์— ์˜์กดํ•˜์ง€ ์•Š๊ณ ,
    ์‹ค์ œ๋กœ ํ ์ฒ˜๋ฆฌ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ตœ์‹  ๊ฐ’์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ผ๋ฐ˜ ์—…๋ฐ์ดํŠธ:

"๋‚ด๊ฐ€ ๋ณธ ์ƒํƒœ(์ด์ „ snapShot)(count=0)์—์„œ 1 ๋”ํ•ด์ค˜!"

 

ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ:

"๋„ค๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๊ฐ€์žฅ ์ตœ์‹  ์ƒํƒœ(์ด์ „์— +1๋œ ์ƒํƒœ)(prev)๋ฅผ ์•Œ๋ ค์ฃผ๋ฉด, ๊ฑฐ๊ธฐ์„œ 1 ๋”ํ• ๊ฒŒ."

๐Ÿ“Œ ์‹ค์ œ ํ๋ฆ„ ์š”์•ฝ

const handleClick = () => {
  setCount(count + 1); //์ด์ „ ์Šค๋ƒ…์ƒท(count : 0) +1
  console.log(count); //์ด์ „ ์Šค๋ƒ…์ƒท(count : 0)
};

 

๊ฒฐ๊ณผ : 

0

โœ… ๊ฒฐ๋ก : ๋™๊ธฐ์ธ๊ฐ€, ๋น„๋™๊ธฐ์ธ๊ฐ€?

state ๋Š” ๋™๊ธฐ์ด๋‹ค. useEffect๋„ ๋™๊ธฐ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ๋ฆฌ์•กํŠธ ๋‚ด๋ถ€์˜ ์Šค์ผ€์ฅด๋ง (๋ฆฌ์•กํŠธ ๋‚ด๋ถ€์—์„œ js๋Ÿฐํƒ€์ž„๊ณผ ๋‹ฌ๋ฆฌ ์Šค์ผ€์ฅด๋ง ๋œ๋‹ค.)์— ์˜ํ•ด useState์™€ useEffect์˜ ์‹คํ–‰์‹œ์ ์ด ๋‹ค๋ฅด๋‹ค

 

useState: ์žฌ๋ Œ๋”๋ง ํ•˜๋ผ๋Š” Trigger

useEffect: state์— ์˜ํ•œ sideEffect๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์šฉ๋„ ์ด๊ธฐ ๋•Œ๋ฌธ์— useEffect์˜ ๋™์ž‘์€ ๋ Œ๋”๋ง ์ดํ›„ mount ๋œํ›„ (DOM์—…๋ฐ์ดํŠธ) ์ดํ›„์— ์‹คํ–‰๋œ๋‹ค

 

์ƒํƒœ ๋ณ€๊ฒฝ ๋ฐœ์ƒ(setState ํ˜ธ์ถœ ๋“ฑ) 
โฌ‡๏ธ ์ƒํƒœ ๋ณ€๊ฒฝ ๋ฐฐ์นญ 
โฌ‡๏ธ ๋ Œ๋”๋ง (return ๋ฌธ ์‹คํ–‰) 
โฌ‡๏ธ ํ™”๋ฉด(DOM) ์—…๋ฐ์ดํŠธ 
โฌ‡๏ธ useEffect ์‹คํ–‰

 

(์ด๊ฒƒ๋„ ์ค‘๊ฐ„์— ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๊ปด์žˆ๋А๋ƒ ์•„๋‹ˆ๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š”๋ฐ, ์ด๋Š” ๋‹ค์Œ์— ์“ธ ๊ธ€์—์„œ ์ž‡๋„๋ก ํ•˜๊ฒ ๋‹ค.)

๐Ÿ“Š ํ‘œ๋กœ ์ •๋ฆฌํ•˜๋ฉด

 

โœ… React ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋ฐ ์‹คํ–‰ ํ๋ฆ„ ์š”์•ฝ ํ‘œ

๋‹จ๊ณ„ ์‹œ์  / ์‹คํ–‰ ๋Œ€์ƒ ์„ค๋ช…
1๏ธโƒฃ setState() ํ˜ธ์ถœ ์ƒํƒœ ๋ณ€๊ฒฝ ์š”์ฒญ (์ฆ‰์‹œ ์‹คํ–‰๋จ)
2๏ธโƒฃ ์—…๋ฐ์ดํŠธ ์˜ˆ์•ฝ ์ƒํƒœ๋Š” ์•„์ง ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ. React์˜ ์—…๋ฐ์ดํŠธ ํ์— ์ €์žฅ๋จ
3๏ธโƒฃ ๋ฐฐ์นญ ์ฒ˜๋ฆฌ ์—ฌ๋Ÿฌ setState()๊ฐ€ ๋ชจ์ด๋ฉด ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ๋จ (๋ฐฐ์นญ)
4๏ธโƒฃ ์ปดํฌ๋„ŒํŠธ ์žฌ๋ Œ๋”๋ง ์ƒˆ๋กœ์šด ์Šค๋ƒ…์ƒท ์ƒ์„ฑ. ์ด ์‹œ์ ์˜ state, props, ๋ณ€์ˆ˜๋“ค์€ "๊ณ ์ •"๋จ
5๏ธโƒฃ DOM ์—…๋ฐ์ดํŠธ (Commit Phase) ์‹ค์ œ DOM์— ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฐ˜์˜๋จ
6๏ธโƒฃ useEffect() ์‹คํ–‰ ๋ Œ๋”๋ง ์ดํ›„ ์‹คํ–‰๋˜๋Š” ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์ฒ˜๋ฆฌ ์˜์—ญ

 

๐Ÿ”„ ์ผ๋ฐ˜ ์—…๋ฐ์ดํŠธ vs ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ ๋น„๊ต ํ‘œ

๋ฐฉ์‹ ์ฝ”๋“œ ์˜ˆ์‹œ ์ฒ˜๋ฆฌ ๊ธฐ์ค€ ๊ฒฐ๊ณผ
์ผ๋ฐ˜ ์—…๋ฐ์ดํŠธ setCount(count + 1) ๋ Œ๋”๋ง ๋‹น์‹œ์˜ ์Šค๋ƒ…์ƒท ๊ธฐ์ค€ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•ด๋„ ๊ฐ™์€ ๊ฐ’ ๊ธฐ์ค€ → ๋ˆ„์ ๋˜์ง€ ์•Š์Œ
ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ setCount(prev => prev + 1) React๊ฐ€ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋„˜๊ฒจ์คŒ ์ตœ์‹  ์ƒํƒœ ๊ธฐ์ค€ → ๋ˆ„์  ๊ฐ€๋Šฅ
       

 

๐Ÿ” ์ƒํƒœ์™€ useEffect ์‹คํ–‰ ํ๋ฆ„ ๋น„๊ต

ํ•ญ๋ชฉ ์‹คํ–‰ ์‹œ์  ๋น„๊ณ 
setState() ๋™๊ธฐ (์ฆ‰์‹œ ์‹คํ–‰) ์‹ค์ œ ์ƒํƒœ ๋ฐ˜์˜์€ ๋‚˜์ค‘์—(Batcing์œผ๋กœ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌ)
๋ Œ๋”๋ง (return) ์ƒํƒœ ๋ณ€๊ฒฝ ์งํ›„ JSX → Virtual DOM ๊ณ„์‚ฐ
useEffect() ๋ Œ๋”๋ง & DOM ์—…๋ฐ์ดํŠธ ์ดํ›„ ๋น„๋™๊ธฐ์ฒ˜๋Ÿผ ์ž‘๋™. ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์ฒ˜๋ฆฌ์šฉ

 

๐Ÿ“Œ ํ•ต์‹ฌ ๊ฐœ๋… ์ •๋ฆฌํ‘œ

๊ฐœ๋… ์„ค๋ช…
์Šค๋ƒ…์ƒท ๋ Œ๋”๋ง ์‹œ์ ์˜ ์ƒํƒœ, props, ํด๋กœ์ €๋“ค์ด ๊ณ ์ •๋œ ์ƒํƒœ
๋ฐฐ์นญ(Batching) ์—ฌ๋Ÿฌ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ํ•˜๋‚˜์˜ ๋ Œ๋”๋ง์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”
ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” React ๊ธฐ๋Šฅ
useEffect ์‹คํ–‰ ์‹œ์  ๋ Œ๋”๋ง ํ›„, ์‹ค์ œ DOM ์ปค๋ฐ‹ ์ดํ›„

 


 

 

๊ฒฐ๋ก 
React์˜ ์ƒํƒœ๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€๋งŒ, ๊ฒฐ๊ณผ๋Š” ๋น„๋™๊ธฐ์ฒ˜๋Ÿผ ๋ฐ˜์˜๋˜๋ฉฐ, ์ด ๋ชจ๋“  ๊ตฌ์กฐ๋Š” ๋ฐฐ์นญ๊ณผ ๋ Œ๋”๋ง ์Šค์ผ€์ค„๋ง ๋•๋ถ„์ด๋‹ค.

 

โœจ ๋งˆ๋ฌด๋ฆฌ ํฌ์ธํŠธ ์š”์•ฝ

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

  const handleClick = () => {
    setCount(count + 1);
    setCount(count + 1);
    console.log("clicked!", count); // โœ… ์—ฌ๊ธฐ์„œ๋Š” ์—ฌ์ „ํžˆ ์ด์ „ count ๊ฐ’
  };

  useEffect(() => {
    console.log("effect!", count); // โœ… ์—ฌ๊ธฐ๋Š” ์—…๋ฐ์ดํŠธ๋œ ๊ฐ’
  }, [count]);

  return <button onClick={handleClick}>Click</button>;
}

 

 

  • ์œ„์ฒ˜๋Ÿผ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ์ˆœ๊ฐ„์€ ์ด๋ฒคํŠธํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋‹ค ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ์ด๋‹ค.
  • ๊ทธ๋ž˜์„œ ์–ธ์ œ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๋Š”๊ฑธ๊นŒ ?

 

ํŠธ๋ฆฌ๊ฑฐ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์‹ค์ œ๋กœ ๋ฐ˜์˜๋˜๋‚˜? ๋น„๊ณ 
React ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ โœ… Yes ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ๋จ (๋ฐฐ์นญ ์ ์šฉ)
useEffect ๋‚ด๋ถ€ โœ… Yes ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ํ›„ ์ƒํƒœ ๋ฐ˜์˜ ๊ฐ€๋Šฅ
Promise.then / setTimeout โœ… Yes (React 18+) ์ž๋™ ๋ฐฐ์นญ ํ™•์žฅ๋จ
๋‹จ์ˆœ setState ํ˜ธ์ถœ ํ›„ console.log โŒ No ์•„์ง ๋ Œ๋”๋ง ์•ˆ ๋จ

 

๐Ÿ“Œ ๋‹ค์Œ์— ๋‹ค๋ฃฐ ๋‚ด์šฉ

  • useEffect์•ˆ์— fetch์™€ ๊ฐ™์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์žˆ์„๋•Œ๋ž‘ ๋™๊ธฐ ๋‚ด์šฉ๋งŒ ์žˆ์„๋•Œ๋ž‘ ๋˜ ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ๋™์ž‘์ด ๋‹ค๋ฅด๋”๋ผ๊ตฌ์š”
  • ๊ทธ๋ž˜์„œ ๋‹ค์Œ ๊ธ€์€ useEffect์—์„œ ์–ด๋–ป๊ฒŒ ํ๋ฆ„์ด ์ด์–ด์ง€๋Š”์ง€ ์•Œ์•„๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

Reference

https://react.dev/

 

React

React is the library for web and native user interfaces. Build user interfaces out of individual pieces called components written in JavaScript. React is designed to let you seamlessly combine components written by independent people, teams, and organizati

react.dev

https://sckimynwa.medium.com/react-mount-system-deep-dive-sync-mode-c89c1ace14af

 

React Mount System Deep Dive (Sync Mode)

Overview

sckimynwa.medium.com