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

Front-end

useState์˜ ๋น„๋™๊ธฐ์„ฑ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” useState๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์›๋ฆฌ์™€ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ ํŒจํ„ด์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


 

๋จผ์ € ๋น„๋™๊ธฐ์ ์ด๋ผ๋Š” ๊ฒƒ์€ setState๋ฅผ ํ˜ธ์ถœํ•œ ์งํ›„์— ์ƒํƒœ๊ฐ€ ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

const handleClick = () => {
  setCount(count + 1);
  console.log(count); // ์—ฌ์ „ํžˆ setCount ์ด์ „ ๊ฐ’์ธ 0์ด ์ถœ๋ ฅ๋จ
};

 

์œ„ ์ฝ”๋“œ์—์„œ handleClick์„ ํ˜ธ์ถœํ•˜๋ฉด setCount(count + 1)์ด ์‹คํ–‰๋˜์ง€๋งŒ, console.log(count)๋Š” ์—ฌ์ „ํžˆ ์ด์ „ ๊ฐ’์ธ 0์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

 

useState๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์›๋ฆฌ

์ด๋Ÿฌํ•œ ๋น„๋™๊ธฐ์„ฑ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ชจ์•„์„œ(batch) ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

// ํด๋ฆญ ์‹œ ํ˜ธ์ถœ
const handleClick = () => {
  setCount(count + 1);     
  console.log(count);      
};
  1. setCount(count + 1) ์‹คํ–‰๋จ → ๋ณ€๊ฒฝ ์š”์ฒญ์ด ๋ฆฌ์•กํŠธ ๋‚ด๋ถ€ ํ์— ๋“ค์–ด๊ฐ
  2. React๋Š” ๋ฐ”๋กœ ๋ฆฌ๋ Œ๋”๋งํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
  3. ๋ชจ๋“  ์—…๋ฐ์ดํŠธ ์š”์ฒญ์ด ๋๋‚œ ํ›„ ๋ฆฌ๋ Œ๋”๋ง ์Šค์ผ€์ค„๋ง๋จ
  4. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋˜๊ณ  ๊ทธ๋•Œ ์ตœ์‹  count ๊ฐ’์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง

์ฆ‰, setCount๋Š” ๋ฐ”๋กœ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋‹ค์Œ ๋ Œ๋” ์‚ฌ์ดํด์„ ์˜ˆ์•ฝํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋”๋ณด๊ธฐ

๋ Œ๋”๋ง์ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์ƒํ™ฉ๊ณผ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ ์‹œ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์ƒํ™ฉ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ ์‹œ์ 
โœ… ๋™๊ธฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€ (onClick, onChange, ๋“ฑ) ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰์ด ๋๋‚œ ์งํ›„
โฑ๏ธ setTimeout, Promise.then, fetch ๋“ฑ ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ ๋‚ด๋ถ€ ์ฝœ๋ฐฑ ์‹คํ–‰ ์ค‘์— ์ฆ‰์‹œ ๋ฆฌ๋ Œ๋”๋ง ๊ฐ€๋Šฅ
๐Ÿ”„ React ๋‚ด๋ถ€ ์Šค์ผ€์ค„๋ง (React 18 ์ด์ƒ, Concurrent Mode) React๊ฐ€ ํŒ๋‹จํ•œ ์ ์ ˆํ•œ ์‹œ์  (์šฐ์„ ์ˆœ์œ„ ๊ธฐ๋ฐ˜)

 

 

์ตœ์‹  ์ƒํƒœ ๊ฐ’์„ ํ™œ์šฉํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ํŒจํ„ด

์—…๋ฐ์ดํŠธ๋œ ์ƒํƒœ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๊ถŒ์žฅ๋˜๋Š” ์‚ฌ์šฉ ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. useEffect ์‚ฌ์šฉ

useEffect(() => {
  console.log("count ๋ณ€๊ฒฝ๋จ:", count); // ์—…๋ฐ์ดํŠธ๋œ ๊ฐ’ ๋ฐ˜์˜
}, [count]);

 

2. ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ ์‚ฌ์šฉ

์ƒํƒœ๊ฐ€ ์ด์ „ ๊ฐ’์— ์˜์กดํ•  ๊ฒฝ์šฐ, setCount(prev => prev + 1)์ฒ˜๋Ÿผ ์ด์ „ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

const handleClick = () => {
  setCount(prev => prev + 1);
};

 

์ด ๋ฐฉ๋ฒ•์€ ํ˜„์žฌ ์ƒํƒœ ๊ฐ’์„ ์ •ํ™•ํžˆ ๊ธฐ๋ฐ˜์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ์™€ ๊ด€๊ณ„์—†์ด ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

// ์ž˜๋ชป๋œ ์˜ˆ์‹œ
setCount(count + 1);
setCount(count + 1); // ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•ด๋„ count๋Š” 1๋งŒ ์ฆ๊ฐ€ํ•จ

 

์œ„ ์ฝ”๋“œ๋Š” count๊ฐ€ ์—ฌ์ „ํžˆ ์ด์ „ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋‘ ๋ฒˆ ๊ณ„์‚ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ณผ์ ์œผ๋กœ +1๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.


์•„๋ž˜์™€ ๊ฐ™์ด ์ด์ „ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜๋„ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

// ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ
setCount(prev => prev + 1);
setCount(prev => prev + 1); // ๊ฒฐ๊ณผ์ ์œผ๋กœ +2 ๋จ

const [value, setValue] = useState(0);

const handleClick = () => {
  setValue(value + 1);
  console.log("immediate:", value); // ์ด์ „ ๊ฐ’
  setTimeout(() => {
    console.log("delayed:", value); // ์—ฌ์ „ํžˆ ์ด์ „ ๊ฐ’
  }, 0);
};

 

์ด ๊ฒฝ์šฐ์—๋„ setTimeout ์•ˆ์˜ value๋Š” ์—ฌ์ „ํžˆ ํด๋กœ์ €์— ์บก์ฒ˜๋œ ์ด์ „ ๊ฐ’์ด๋ฏ€๋กœ, ์˜๋„ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ Œ๋” ์ดํ›„์˜ ๊ฐ’์„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด useEffect๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

์š”์•ฝ

- useState๋Š” ๋น„๋™๊ธฐ์ ์ด๋‹ค.
     - ์ƒํƒœ ๋ณ€๊ฒฝ์€ ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์ง€ ์•Š๊ณ , ๋ Œ๋”๋ง ์ฃผ๊ธฐ์— ๋งž์ถฐ ์ฒ˜๋ฆฌ๋จ
- useEffect, ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ์ดํ›„์˜ ๊ฐ’์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

  • references
 

useState – React

The library for web and native user interfaces

react.dev

 

Queueing a Series of State Updates – React

The library for web and native user interfaces

react.dev

 

state ์—…๋ฐ์ดํŠธ ํ – React

The library for web and native user interfaces

ko.react.dev