์ด๋ฒ ๊ธ์์๋ 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);
};
- setCount(count + 1) ์คํ๋จ → ๋ณ๊ฒฝ ์์ฒญ์ด ๋ฆฌ์กํธ ๋ด๋ถ ํ์ ๋ค์ด๊ฐ
- React๋ ๋ฐ๋ก ๋ฆฌ๋ ๋๋งํ์ง ์๊ณ ํ์ฌ ์คํ ์ค์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
- ๋ชจ๋ ์ ๋ฐ์ดํธ ์์ฒญ์ด ๋๋ ํ ๋ฆฌ๋ ๋๋ง ์ค์ผ์ค๋ง๋จ
- ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋๊ณ ๊ทธ๋ ์ต์ 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
'Front-end' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Monorepo ๋์ ๊ธฐ: ํ๋ก ํธ์๋ ๋ง์ด๊ทธ๋ ์ด์ ์ค๊ณ ์ ๋ฆฌ (0) | 2025.08.17 |
|---|---|
| Next.js ์ด๊ธฐ ๋ ๋๋ง ์ ๋ค๊ตญ์ด ๋ฌธ๊ตฌ๊ฐ ๋น์ด ๋ณด์ด๋ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ (1) | 2025.06.15 |
| React key prop๊ณผ ์ํ ์ด๊ธฐํ (0) | 2025.02.23 |
| Timer Interval ์ง์ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ (2) | 2025.02.02 |
| React Server Component๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ (0) | 2024.12.15 |