๐งฉ 02. ์ํ(State)์ ์ง์ง ์๋ฏธ โ ๋ ๋๋ง์ ์ค๋ ์ท์ด๋ค
๐ ๊ฐ์
์ํ(State)๊ฐ ์ผ๋ฐ ๋ณ์์ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง, ์ ๋น๋๊ธฐ ์์์ ์๋ ๊ฐ์ ๋ณด๊ฒ ๋๋์ง(ํด๋ก์ ํจ์ ) ํํค์นฉ๋๋ค.
๐ฏ ์ด ์น์ ์ ์ฝ๊ณ ๋๋ฉด:
setState๋ฅผ ํธ์ถํด๋ ๋ฐ๋ก ๋ค์ ์ค์์ ๊ฐ์ด ๋ฐ๋์ง ์๋ ์ด์ ๋ฅผ ์ค๋ช ํ ์ ์๋ค.- ํ์ด๋จธ๋ ๋น๋๊ธฐ ํจ์์์ ์๋ ์ํ๊ฐ(ํด๋ก์ ํจ์ )์ ์ฐธ์กฐํ๋ ๋ฒ๊ทธ๋ฅผ ์ฆ์ ํ์ ํ ์ ์๋ค.
- ํจ์ํ ์ ๋ฐ์ดํธ(
setState(prev => prev + 1))๊ฐ ์ธ์ ์ ํ์ํ์ง ํ๋จํ ์ ์๋ค.
๐ ๋ชฉ์ฐจ
- ๐ค ์ ์์์ผ ํ๋๊ฐ: ๋ณ์๊ฐ ์๋ ์ค๋ ์ท
- ๐๏ธ ๋น์ ๋ก ๋จผ์ ์ดํดํ๊ธฐ
- ๐งฉ ํด๋ก์ (Closure)๊ฐ ๋ถ๋ฅธ ๋์ฐธ์ฌ
- ๐ฅ ์๋ฌ ํด๊ฒฐ ์นดํ๋ก๊ทธ
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 15๋ถ / ํต์ฌ ํํธ: 8๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ์์ฒ (์ ์ ): "์ด๋ผ? '๊ฐ์ ํ์ ๋ฉ์์ง ๋ณด๋ด๊ธฐ' ๋ฒํผ์ ๋๋ ๋๋ฐ, 5์ด ๋ค์ ๋จ๋ ํ์ ์ ๋ฐฉ๊ธ ์ ๋ ฅํ ์์ ์ ์ด๋ฆ์ด ์ ๋จ๊ณ ๋น์นธ๋ง ๋์์! ์ ๊ฐ ๊ท์ ์ ๋ณธ ๊ฑธ๊น์?"
- ์ํธ(๋ฆฌ๋): "์์ฒ ๋... ๋ฆฌ์กํธ ๋ ๋๋ง์ ๋์์์ด ์๋๋ผ '์ฌ์ง(์ค๋ ์ท)' ์ด์์. 5์ด ์ ์ ์ฐ์ด๋ ์ฌ์ง ์์๋ ๋น์ฐํ ๋น์นธ ์ ๋ ฅ์ฐฝ์ด ์ฐํ ์์๊ฒ ์ฃ !"
๐ค ์ ์์์ผ ํ๋๊ฐ: ๋ณ์๊ฐ ์๋ ์ค๋ ์ท
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ค์ด ์ฒ์ ๋ฆฌ์กํธ๋ฅผ ๋ง๋ฌ์ ๋ ๊ฐ์ฅ ๋นํฉํ๋ ์๊ฐ์ ์ธ์ ์ผ๊น? ๋ถ๋ช ํ ํจ์๋ฅผ ํตํด ๊ฐ์ ๋ฐ๊ฟจ๋๋ฐ, ์ฝ๋ ๋ฐ๋ก ์๋ซ์ค์์ ์ฝ์ ๋ก๊ทธ๋ก ๊ทธ ๊ฐ์ ์ฐ์ด๋ณด๋ฉด ๋ฐ๋๊ธฐ ์ ์ ๊ฐ ์ด ์ฌ์ ํ ๋์ฌ ๋์ผ.
๐ค ์ ๊น, ๋จผ์ ์๊ฐํด๋ด
์๋ ์ฝ๋์์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ฝ์ ์ฐฝ์ ์ด๋ค ์ซ์๊ฐ ์ฐํ๊น?
setCount(count + 1); console.log(count);
// โ ์์งํ ์ฝ๋ (Naive Approach)
function Counter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1);
console.log(count); // 0์ผ๊น, 1์ผ๊น?
};
// ...์ ์ฝ๋์์ count๋ 1์ด ๋์ง ์๊ณ ์ฌ์ ํ 0์ ์ถ๋ ฅํด. ์ ๊ทธ๋ด๊น?
React์์ useState๋ก ๋ง๋ ์ํ๋ ์ผ๋ฐ ๋ณ์๊ฐ ์๋๊ธฐ ๋๋ฌธ ์ด์ผ. ์์ฒ ์ด๋ ์ด๊ฑธ ์๋ฐ์คํฌ๋ฆฝํธ์ let count = 0์ฒ๋ผ ์ฌ๊ธฐ๊ณ ๊ฐ์ด ์ฆ์ ํ ๋น๋๋ ์ค ์์์ง๋ง, ๋ฆฌ์กํธ๋ ์ด ๊ฐ์ **์ค๋
์ท(Snapshot, ์ฌ์ง)**์ฒ๋ผ ์ทจ๊ธํด.
๐๏ธ ๋น์ ๋ก ๋จผ์ ์ดํดํ๊ธฐ
๐ง 5์ด์๊ฒ ์ค๋ช ํ๋ค๋ฉด?
๋ค๊ฐ ๋ฐฉ์ ๋ค์ด๊ฐ์ ๋ฐฉ๊ธ ํด๋ผ๋ก์ด๋ ์ฌ์ง์ ํ ์ฅ ์ฐฐ์นต ์ฐ์์ด. ๊ทธ ์ฌ์ง ์์ ์๊ณ๋ '12์ ์ ๊ฐ'์ ๊ฐ๋ฆฌํค๊ณ ์์ง.
๋๋ ์๋งํํ "์๋ง, ์ ๊ธฐ ๋ฒฝ์๊ณ 12์ 5๋ถ์ผ๋ก ๋๋ ค์ค!" ํ๊ณ ์๋ฆฌ์ณค์ด. (์ด๊ฒsetState์ผ).
์๋ง๊ฐ ๋ฒฝ์๊ณ๋ฅผ 5๋ถ ๋๋ ค๋จ์ง๋ง, ๋ค ์์ ๊ฝ ์ฅ๊ณ ์๋ ํด๋ผ๋ก์ด๋ ์ฌ์ง ์ ์๊ณ ๋ ์ฌ์ ํ 12์ ์ ๊ฐ์ด์ผ. ์ฌ์ง์ ์ค์๊ฐ ๋น๋์ค๊ฐ ์๋๋๊น!
๋ค์ ๋ฒ์ ์๋ง๊ฐ "์๊ณ ๋ฐ๊ฟจ์ผ๋ ์ฌ์ง ๋ค์ ์ฐ์ด๋ด!" ํ๊ณ ์๋ก ์ฐฐ์นต ์ฐ์ ๋(๋ค์ ๋ฆฌ๋ ๋๋ง), ๊ทธ์ ์์ผ 12์ 5๋ถ์ด ์ฐํ ์๋ก์ด ํด๋ผ๋ก์ด๋ ์ฌ์ง ์ ๋ฐ๊ฒ ๋๋ ๊ฑฐ์ผ.
โ
ํต์ฌ ์๋ฆฌ:
๋ ๋๋ง์ด๋, ๋ฆฌ์กํธ๊ฐ ์ปดํฌ๋ํธ(ํจ์)๋ฅผ ํธ์ถ ํ๋ ํ์์ผ. ๊ทธ ํจ์๊ฐ ํธ์ถ๋ ๋ฑ ๊ทธ ์๊ฐ์ state ๊ฐ๊ณผ props ๊ฐ์ ๊ฐ์ง๊ณ UI(JSX)๋ฅผ ๋ง๋ค์ด๋ด์ง. ๊ทธ ๋ ๋๋ง ์์์ ์ด์๊ฐ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ(handleClick) ์ญ์ ํจ์๊ฐ ๋ง๋ค์ด์ง๋ ๊ทธ ์๊ฐ์ ๊ณ ์ ๋ ์ค๋
์ท(์: count = 0) ์ ๊ฐํ๊ฒ ๋ผ. ์ด๋ฅผ ์ ๋ฌธ ์ฉ์ด๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ํด๋ก์ (Closure) ๋ผ๊ณ ํด.
๐งฉ ํด๋ก์ (Closure)๊ฐ ๋ถ๋ฅธ ๋์ฐธ์ฌ
โ ์์ฒ ์ด์ ํญํ ์ฝ๋: ์ข์์ 3๋ฐฐ ์ด๋ฒคํธ
์ปค๋ฎค๋ํฐ ๊ธ์ '3๋ฐฐ ์ข์์ ์ด๋ฒคํธ' ๋ฒํผ์ ๊ธด๊ธ ์ถ๊ฐํ๊ฒ ๋์์ด. ๋๋ฅด๋ฉด ์ข์์๊ฐ ํ ๋ฒ์ 3์ฉ ์ฌ๋ผ๊ฐ์ผ ํด.
// โ ์์งํ ์ฝ๋: ๋๋์ฒด ์ 3์ฉ ์ ์ค๋ฅผ๊น?
function LikeButton() {
const [likes, setLikes] = useState(0);
const handleTripleLike = () => {
setLikes(likes + 1);
setLikes(likes + 1);
setLikes(likes + 1);
};
return <button onClick={handleTripleLike}>์ข์์ {likes}</button>;
}์์ฒ ์ด๋ ํธ๊ธฐ๋กญ๊ฒ ๋ฒํผ์ ๋๋ ์ง๋ง, ๊ฒฐ๊ณผ๋ ์ถฉ๊ฒฉ์ ์ด๊ฒ๋ likes๊ฐ 1 ๋ง ์ฌ๋์ด. ์๋๊ณ ?
- ์ฒซ ๋ฒ์งธ ๋ ๋๋ง ์ค๋
์ท์์
likes๋ผ๋ ์์์ ๊ฐ์0์ด์ผ. setLikes(0 + 1)์ ์คํ. ๋ฆฌ์กํธ์ "๋ค์ ๋ ๋๋ง ๋ 1๋ก ์ค" ์์ฝ.setLikes(0 + 1)์ ์คํ. ์ฌ์ ํ ๋ด ํธ๋ค๋ฌ๊ฐ ๋ค๊ณ ์๋ ์ฌ์ง ์likes๋ 0์ด๋๊น!setLikes(0 + 1)์ ์คํ. ์ญ์๋ 0 + 1.
๊ฒฐ๊ตญ ๋ฆฌ์กํธ๋ ๋ ๋๋ง์ด ๋๋ ๋ ์ผ๊ด ์ฒ๋ฆฌ(Batching)๋ฅผ ํ๋ฉด์ "์, 1๋ก ๋ฐ๊ฟ๋ฌ๋ผ๋ ์์ฒญ์ด 3๋ฒ ์ฐ์์ผ๋ก ์๊ตฌ๋. ์์์ด, 1๋ก ๋ฎ์ด์์ธ๊ฒ." ํ๊ณ ์ต์ข ์ ์ผ๋ก 1๋ก ์ ๋ฐ์ดํธํด๋ฒ๋ฆฌ์ง.
โ ์ํธ์ ๋ฆฌํฉํ ๋ง: ํจ์ํ ์ ๋ฐ์ดํธ (Functional Update)
์ด๋ด ๋ ์ค๋
์ท(ํด๋ก์ )์ ๋ฒฝ์ ๋ซ๊ณ ๊ฐ์ฅ ์ต์ ํํ์ ๋ณด์ฅ๋ ์ํ ๋ฅผ ์ป์ด์ค๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น? ๋ฐ๋ก setState ์์ ๊ฐ์ ๋์ง๋ ๋์ ๊ท์น(ํจ์) ์ ์ง์ด๋ฃ๋ ๊ฑฐ์ผ.
// โ
์ฐ์ํ ์ฝ๋ (Pro Approach)
function LikeButton() {
const [likes, setLikes] = useState(0);
const handleTripleLike = () => {
// ๊ฐ์ ์ง์ ๊ณ์ฐํด ๋ฃ์ง ๋ง๊ณ , "์ด์ ๊ฐ์ ๋ฐ์์ ์ด๋ป๊ฒ ๋ณํํ ์ง" ๊ท์น์ ์ ๋ฌํด!
setLikes(prevLikes => prevLikes + 1);
setLikes(prevLikes => prevLikes + 1);
setLikes(prevLikes => prevLikes + 1);
};
return <button onClick={handleTripleLike}>์ข์์ {likes}</button>;
}๐ ์ฉ์ด:
ํจ์ํ ์ ๋ฐ์ดํธ (Functional Update)
์ํ ์ ๋ฐ์ดํธ ํจ์์ ๊ฐ ๋์(์ด์ _์ํ) => ๋ค์_์ํํํ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์.
์ด ํจ์๋ค์ ๋ฆฌ์กํธ ๋ด๋ถ์ ํ(Queue)์ ๋ด๊ฒจ์ ์ฐจ๋ก๋๋ก ์คํ๋๋ฏ๋ก, ๋ด ์ค์ฝํ์ ์ค๋๋ ์ค๋ ์ท ๊ฐ์ ๋ฌด์ํ๊ณ ํญ์ ์ต์ ์ ์ํ ๊ฒฐ๊ด๊ฐ(prevLikes) ์ ๋ฌผ๊ณ ์ด์ด์ง ์ ์๋ค.
๐ฅ ์๋ฌ ํด๊ฒฐ ์นดํ๋ก๊ทธ
โ ๋น๋๊ธฐ(setTimeout) ํ์ด๋จธ์ ์นจ๋ฌต ๋ฒ๊ทธ
์ธ์ ๋์ค๋๊ฐ?
const [message, setMessage] = useState('');
const handleSend = () => {
setTimeout(() => {
alert(`์๋ฒ์ ์ ์ก๋ ๋ด์ฉ: ${message}`); // ๐ฅ 5์ด ๋ค์ ํ
๋น ๋ฉ์์ง๊ฐ ๋ธ!
}, 5000);
};
// ... <input onChange={(e) => setMessage(e.target.value)} /> ...์์ธ: handleSend ๊ฐ ์คํ๋๋ ํ์ด๋ฐ์ ๋ ๋๋ง ์ค๋
์ท์์ message ๋ ํ
๋น ๋ฌธ์์ด์ด์์ด! ๋ค๊ฐ ๊ทธ 5์ด ์ฌ์ด์ ์ธํ์ฐฝ์ ๋ฏธ์น ๋ฏ์ด ํค๋ณด๋๋ฅผ ํ์ดํํด์ ์ปดํฌ๋ํธ ์ฌ์ง์ด 10์ฅ์ด๋ ์๋ก ์ฐํ์ด๋, ํ์ด๋จธ ์์ ์ ์ด๋ ์ฝ๋๋ ์ฒ์ ๋ฒํผ์ ๋๋ ๋ 5์ด ์ ๋ก์ ์ฌ์ง ์ ๋น message ์ ์์ํ ๊ฐํ์์ด. ์ด๊ฒ ๋ฐ๋ก ์์ ์ํ๋ฅผ ๊ผญ ์ฅ๊ณ ๋์ง ์๋ 'ํด๋ก์ (Closure) ํจ์ ' ์ด์ผ.
ํด๊ฒฐ์ฑ
:
์ด๋ด ๋๋ ์ํ(์ค๋
์ท)๊ฐ ์๋๋ผ, ๋ ๋๋ง ์ค๋
์ท๊ณผ ๋ฌด๊ดํ๊ฒ ์ธ์ ๋ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์์ ์ต์ ๊ฐ์ ๊บผ๋ด๋ณผ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ๋น๋ฐ ์ฐฝ๊ณ , useRef ๋ฅผ ์จ์ผ ํด.
๐ ์ด๋ฒ์ ๋ฐฐ์ด ๋ด์ฉ ์ด์ ๋ฆฌ
| ์ํฉ | โ ๋์ ์ (์ค๋ ์ท ํจ์ ) | โ ์ข์ ์ (ํจ์ํ ์ ๋ฐ์ดํธ / Ref) |
|---|---|---|
| ์ํ ์ฐ์ ์ ๋ฐ์ดํธ | setCount(count + 1); setCount(count + 1); | setCount(c => c + 1); setCount(c => c + 1); |
| ๋น๋๊ธฐ ํ์์์ ์์์ ์ต์ ๊ฐ ํ์ | setTimeout(() => console.log(state), 1000) | ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ref.current = state๋ก ๋๊ธฐํ ํ, ref.current๋ก ์ฝ๊ธฐ |
๐ก ํ ์ค๋ก ๊ธฐ์ตํ๊ธฐ
๋ฆฌ์กํธ์ ์ํ(State)๋ ๋ณ์๊ฐ ์๋๋ผ ํด๋ผ๋ก์ด๋ ์ฌ์ง(์ค๋ ์ท) ์ด๋ค.
๋น๋ฒํ ์ํ ์ ๋ฐ์ดํธ๋ ๋ด ์์ ๋ค๋ฆฐ ๊ทธ ๋ก์ ์ฌ์ง์ ๋นจ๊ฐํ์ ์น ํ๋ ๊ฒ ์๋๋ค. "๋ค์ ๋ฒ์ ์ด๋ฐ ํฌ์ฆ๋ก ์ฌ์ง ๋ค์ ์ฐ์ด์ฃผ์ธ์"ํ๊ณ ๋ฆฌ์กํธ ์คํ๋์ค ์ฌ์ฅ๋๊ป ์์ฝ์๋ฅผ ์ ์ํ๋ ํ์๋ค.
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
setState ๋ฐ๋ก ๋ค์ ์ค์ console.log ์ฐ์ด๋๊ณ ์ ๊ฐ์ด ์ ๋ฐ๋๋๊ณ ๋ฆฌ์กํธ ๋ฒ๊ทธ ์๋๋๋ฉฐ ์ฉ์ฉ๋๋ ๋ด ๋ชจ์ต์ด ๋ถ๋๋ฝ๋ค. ํด๋ก์ ๊ฐ๋
์ ์์ ์ ์ฑ
์์ ๋ณด๊ณ ๊ทธ๋ฅ ๋๊ฒผ๋๋ฐ, ์ด๊ฒ ๋น๋๊ธฐ ํ์ด๋จธ๋ ๋ง๋ฌผ๋ ค์ ๋๋ฅผ ์ด๋ ๊ฒ ๊ดด๋กญํ ์ค์ด์ผ.
๐ก "์ํ๋ ์ผ๋ฐ ๋ณ์๊ฐ ์๋๋ผ ํด๋ผ๋ก์ด๋ ์ฌ์ง(์ค๋ ์ท)์ด๋ค. ์ต์ ๊ฐ์ ๋ณด์ฅ๋ฐ๊ณ ์ถ๋ค๋ฉด ํจ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ฐ์!"
์ํธ ๋ฆฌ๋ ๋์ด '๋ฆฌ์กํธ ์คํ๋์ค ์ฌ์ฅ๋' ๋น์ ๋ฅผ ํด์ฃผ์
จ์ ๋ ์ง์ง ์ด๋ง๋ฅผ ํ ์ณค๋ค. ์์ผ๋ก ์ฝ๋ฐฑ ์ง์ฅ์ด๋ ํ์ด๋จธ ํจ์ ์ ๋น ์ง ๋๋ง๋ค ์ด ํด๋ผ๋ก์ด๋ ์ฌ์ง์ ๋ ์ฌ๋ ค์ผ์ง. ๋ทํ๋ฆญ์ค ๋ณด๋ฉฐ ์ ๋
๋จน๊ณ , ๋ด์ผ์ ์ค๋ ๋ฐฐ์ด useRef๋ก ๋ฒ๊ทธ ์ก์ผ๋ฌ ์ถ๊ทผํ์.
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. ๋ค์ ์ปดํฌ๋ํธ์์ ๋ฒํผ์ ํ ๋ฒ ํด๋ฆญํ๋ฉด, ํ๋ฉด์๋ ์ต์ข ์ ์ผ๋ก ์ด๋ค ๊ฐ์ด ๋ ๋๋ง๋ ๊น์?
function QuizOne() {
const [score, setScore] = useState(0);
const raiseScore = () => {
setScore(score + 5);
setScore(score + 5);
setScore(s => s + 2);
};
return <button onClick={raiseScore}>์ ์: {score}</button>;
}- A) 12
- B) 7
- C) 5
- D) 2
โ ์ ๋ต: B
๐ก ์์ธ ํด์ค: ์ฒซ ์ค setScore(0 + 5)๋ก ๊ฐ '5'๋ก ๊ต์ฒด ์์ฝ์ด ๋ค์ด๊ฐ๋๋ค. ๋ ๋ฒ์งธ ์ค setScore(0 + 5)์ญ์ ๋ด ์์ ์ค๋
์ท์ 0์ด๋ฏ๋ก '5'๋ก ๊ต์ฒด ์์ฝ(๋์ผ ๊ฐ์ผ๋ก ๋ฎ์ด์์)์ ํฉ๋๋ค. ๋ง์ง๋ง ์ค setScore(s => s + 2)๋ ํ(Queue) ์ฐ์ฐ์ด๋ฏ๋ก ํ์ ๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก ์์ธ ์ต์ ๊ฒฐ๊ณผ๊ฐ์ธ '5'๋ฅผ ๋ฌผ๋ ค๋ฐ์ 5 + 2 = 7์ ๋ฐํํฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์ ๋ฒ ์ค๋
์ท์ ๋ ๋๋ง ๊ฐ์ 7์ด ๋ฉ๋๋ค!
Q2. useRef๋ ์ํ ๋ณ์(useState)์ ๋ฌ๋ฆฌ ํด๋ก์ (์๋ ์ฌ์ง) ํจ์ ์ ๋น ์ง์ง ์์ต๋๋ค. ๊ทธ ๊ทผ๋ณธ์ ์ธ ์ด์ ๋ ๋ฌด์์ผ๊น์?
- A)
useRef๋ ๋ธ๋ผ์ฐ์ ์ ์ ์ญ ๊ฐ์ฒด์ธ Window์ ๊ฐ์ ์ง์ ์ ์ฅํ๊ธฐ ๋๋ฌธ. - B)
useRef๋ ๋ด์ฉ๋ฌผ์ด ๋ฐ๋๋ฉด ํ๋ฉด์ ๊ฐ์ ๋ก ์ฆ์ ๋ฆฌ๋ ๋๋ง์ํค๊ธฐ ๋๋ฌธ. - C) ์ปดํฌ๋ํธ์ ๋ ๋๋ง ์๋ช ์ฃผ๊ธฐ์ ๋ฌด๊ดํ๊ฒ, ํ(Heap) ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋์ ๋์ผํ ์ฃผ์(reference)๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์๊ตฌ ์ง์์ํค๊ธฐ ๋๋ฌธ.
- D)
useRef๋ ๋น๋๊ธฐ ํจ์ ์์์๋ง ๋์ํ๋๋ก ํน์ ์ค๊ณ๋ API์ด๊ธฐ ๋๋ฌธ.
โ ์ ๋ต: C
๐ก ์์ธ ํด์ค: useState๋ ๋ ๋๋ง๋ง๋ค ์๋ก์ด ์์(const) ๊ฐ์ ๋์ ธ์ฃผ์ง๋ง, useRef๋ ์ธ์ ๋ ๊ฐ์ ๋ฐ๊ตฌ๋์ธ { current: ๊ฐ }์ด๋ผ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ '๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์'๋ฅผ ๋์ ธ์ค๋๋ค. ํจ์๊ฐ ํด๋ก์ ํ์ ๊ณผ๊ฑฐ์ ๋ฐ๊ตฌ๋ ๊ป๋ฐ๊ธฐ๋ฅผ ์ฅ๊ณ ์๋๋ผ๋, ๊ทธ ๋ฐ๊ตฌ๋์ ์ฃผ์๊ฐ ์์ํ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ธ์ ๋ ๋๊ป(current)์ ์ด๋ฉด ๋๊ตฐ๊ฐ ์๋ก ์ง์ด๋ฃ์ ๊ฐ์ฅ ์ฉ์ฉํ ์ต์ ๊ฐ์ ๋ค์ฌ๋ค๋ณผ ์ ์์ต๋๋ค. ๋ ๋๋ง ํญํ์์ ์์ ๋ก์ด ๋จ ํ๋์ '์ค์์ค ์ํ ๋น๋ฐ ๊ธ๊ณ '์ธ ์
์ด์ฃ .
Q3. ๋ฆฌ์กํธ๋ ์ํ ์
๋ฐ์ดํธ๋ฅผ ์ ๊ตณ์ด ์ด๋ฐ '์์ฝ ๋ฐ ๋ ๋๋ง(Batching)' ๋ฐฉ์์ผ๋ก ๊ท์ฐฎ๊ฒ ์ค๊ณํ์๊น์? ๋ง์ฝ setState๋ฅผ ํธ์ถํ์๋ง์ ๋ณ์๊ฐ ๊ฐฑ์ ๋๊ณ ์ฆ์ ํ๋ฉด DOM์ ์ง์ ๊ณ ์ณ๋ฒ๋ฆฌ๋ ๋ฐฉ์์ด์๋ค๋ฉด ์๊ธธ ์น๋ช
์ ๋จ์ ์ ๋ฌด์์ผ๊น์?
โ ์ ๋ต ๋ฐ ์ฃผ๊ด์ ํด์ค:
ํผํฌ๋จผ์ค(์ฑ๋ฅ) ๋ถ๊ดด์
๋๋ค. ๋ฒํผ ํด๋ฆญ ํ ๋ฒ์ 10๊ฐ์ ๊ด๋ จ๋ ์ํ๊ฐ ์ฐ๋ฌ์ ๋ฐ๋๋ค๊ณ ์ณ๋ณผ๊ฒ์.
์ค์๊ฐ ๋๊ธฐ์์ผ๋ก ํ๋ฉด์ ๊ฐฑ์ ํ๋ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋ฌด๊ฑฐ์ด DOM ๊ตฌ์กฐ ๊ฐฑ์ ๋ฐ ํ์ธํธ ์ฐ์ฐ์ ์ฐ๋ฌ์ 10๋ฒ ์ํํด์ผ ํ๋ฉฐ, ์ด๋ ํ๋ฉด ๋ฉ์ถค(Jank)์ด๋ ๊ทน์ฌํ ๋ฒ๋ฒ
์์ ์ด๋ํฉ๋๋ค.
๋ฆฌ์กํธ๋ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ผ๊ด ์ฒ๋ฆฌ(Batching) ์ ๋ต์ ์ทจํ์ต๋๋ค.
์ฆ, ํ๋์ ์ด๋ฒคํธ ์ฌ์ดํด์์ ๋ฐ์ํ๋ ์๋ง์ ์
๋ฐ์ดํธ ์์ฝ๋ค์ ๋ฆฌ์กํธ ์ฃผ๋ฌธ์์ ์ฐจ๊ณก์ฐจ๊ณก ์์๋๋ค๊ฐ, ์ด๋ฒคํธ๊ฐ ์ ๋ถ ๋๋๋ ๋ง์ง๋ง ์๊ฐ์ ๋ฑ ํ ๋ฒ๋ง ๊ฐ์ ๋ ์ ํฉ์ฑ์ ๋ฐ์ ธ๋ณธ ํ ์ค์ DOM์ ๋จ 1ํ ๋ ๋๋งํฉ๋๋ค.
์ต์์ ํผํฌ๋จผ์ค๋ฅผ ์ป๊ธฐ ์ํ ์ฐ์ํ ํํ์ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ฐ๋ก ์ด '์ค๋
์ท' ์์คํ
์
๋๋ค.