๐ React์์ State ๊ด๋ฆฌํจ์ผ๋ก์จ props drilling์ ํผํ๋ค
React์์ State๋ ํฌ๊ฒ ์ง์ญ ์ํ, ์ ์ญ ์ํ๋ก ๋๋ ์ ์๋ค.
์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ด๋ฆฌ๋๋ ์ํ
ํ์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด์๋ props๋ฅผ ์ฌ์ฉ
ํ๋ก์ ํธ ์ ์ฒด์์ ๊ด๋ฆฌ๋๋ ์ํ
์ ์ญ์์ ๊ด๋ฆฌํ๋ ๋งํผ ์ํ์ ์์น์ ์๊ด์์ด ์ฌ์ฉ ๋ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ
๏ฅง(์๋ ๋ถ) ่ฎ(๋ณํ ๋ณ) ํ ๋นํ ๊ฐ์ด ๋ณํ๋ฉด ์๋๋ค๋ ๋ป
React ์์ React Hook useState
๋ก ํ ๋นํ ๊ฐ์ setState
๊ฐ ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ๋ถ๋ณ์ฑ์ ์ ์งํ ์ ์๋ค.
JS ์์ง์ ์ฝ ์คํ(Call Stack)๊ณผ ๋ฉ๋ชจ๋ฆฌ ํ(Memory Heap) 2๊ฐ์ง ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ง๊ณ ์๋ค.
์ฝ ์คํ(Call Stack)์๋ String, Boolean, Number ๋ฑ ์์ ํ์ ์ด ์ ์ฅ๋๋ ๊ณต๊ฐ์ด๊ณ
๋ฉ๋ชจ๋ฆฌ ํ(Memory Heap)์ Array, Object ๋ฑ์ด ์ฐธ์กฐ ํ์ ์ด ์ ์ฅ๋๋ ๊ณต๊ฐ์ด๋ค
์์ํ์ ์ Call Stack์ ๊ฐ์ ์ ์ฅ
์ฐธ์กฐํ์ ์ ์ค์ ๊ฐ์ Memory Heap์ ์ ์ฅ ๋๊ณ Memory Heap ์ฃผ์๊ฐ Call Stack์ ์ ์ฅ
๊ฐ์ ๋ณ๊ฒฝํ๊ฒ๋๋ฉด
์์ํ์ ์ Call Stack์ ์๋ก์ด ์ฃผ์๋ฅผ ์ถ๊ฐํด ๊ฐ์ ์ ์ฅ
์ฐธ์กฐํ์ ์ Call Stack์ ์ฃผ์ ๊ฐ์ด ๋ฐ๋์ง ์๊ณ ํด๋น Memory Heap์ ๊ฐ์ ๋ณ๊ฒฝ
๊ทธ๋ฐ๋ฐ React๋ state์ ๋ณํ๋ฅผ ์์ ๋น๊ต๋ก Call Stack์ ์ฃผ์๋ฅผ ๋น๊ตํด ๋ณํ๋ฅผ ๊ฐ์ง
์์ํ์ ์ ๊ฒฝ์ฐ ๋ณํ ๊ฐ์ง๊ฐ ๊ฐ๋ฅํ์ง๋ง
์ฐธ์กฐํ์ ์ ๊ฒฝ์ฐ ์๋ก์ด ์ฐธ์กฐํ์ ์ ๋ง๋ค์ง ์์ผ๋ฉด ๋ณํ๋ฅผ ๊ฐ์งํ์ง ๋ชปํจ
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ๋ถ๋ณ์ฑ์ ์ ์งํ๋?
import React, { useState } from "react";
const KeepState = () => {
const [arr, setArr] = useState([1, 2, 3, 4]);
const handleClickBtn = () => {
setArr([...arr, 5]);
};
console.log(arr);
return <button onClick={handleClickBtn}>Button</button>;
};
export default KeepState;
๋ถ๋ณ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ฒํผ์ ๋๋ฅด๋ฉด handleClickBtn
ํจ์๋ฅผ ํธ์ถํด
๊ธฐ์กด์ ์ ์ฅ๋ ๋ฐฐ์ด ...(์คํ๋ ๋ ๋ฌธ๋ฒ)arr์ ์ฌ์ฉํด ๊ฐ์ ๊ฐ์ ธ์์
setArr
๋ก ์๋ก์ด ๋ฐฐ์ด์ ๊ฐ์ผ๋ก ํ ๋นํด์ค๋ค.
์ด๋ ๊ฒ ํจ์ผ๋ก์จ ๋ถ๋ณ์ฑ์ ์ ์งํ๊ณ ๋ณํ๋ฅผ ๊ฐ์งํ ์ ์๊ฒ ํ๋ค.
๋๊ธฐ(Synchronous) - ์์ฒญ์ ๋ณด๋ธ ํ ์๋ต์ ๋ฐ์์ผ ๋ค์ ๋์์ด ์ด๋ฃจ์ด์ง๋ ๋ฐฉ์, ๋ชจ๋ ์ผ์ด ์์ฐจ์ ์ผ๋ก ์งํ๋๋ฉฐ ํน์ ์์ ์ด ์ํ ์ค์ด๋ผ๋ฉด ๋ค์ ์์ ์ ๋๊ธฐํ๋ค.
๋น๋๊ธฐ(Asynchronous) - ๋จผ์ ์คํ๋ ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์์ ์ ์ํํ๋ค. ํ๋ฒ์ ์ฌ๋ฌ ์์ ์ ์ฒ๋ฆฌํ๋ค.
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด setState๋ ๋น๋๊ธฐ๋ก ์๋ํ๋ค.
import React, { useState } from "react";
const Counter = () => {
const [count, setCount] = useState(0);
const handleClickBtn = () => {
setCount(count + 1);
console.log(count);
};
return (
<div>
<div>{count}</div>
<button onClick={handleClickBtn}>+1</button>
</div>
);
};
export default Counter;
์ ์ฝ๋์์ ๋ฒํผ์ 3๋ฒ ๋๋ฅด๋ฉด console
์ 1, 2, 3 ์ด๋ ๊ฒ ์์ฐจ์ ์ผ๋ก ๋์ค๋ ๊ฒ์ ์์ํ๋ค.
ํ์ง๋ง ๊ฒฐ๊ณผ๋ ์ฐ๋ฆฌ๊ฐ ์์ํ ๊ฐ๊ณผ ๋ค๋ฅด๊ฒ ๋ฒํผ์ ๋๋ ์ ๋ 0, 1, 2๊ฐ ๋์๋ค.
๊ทธ ์ด์ ๋ setCount
๊ฐ ๋น๋๊ธฐ๋ก ์๋์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
React์์๋ State ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ฉด ๋ณ๊ฒฝ๋ ๊ฐ๋ค์ ๋ชจ์ ํ๋ฒ์ ์ ๋ฐ์ดํธ๋ฅผ ์งํํ์ฌ ๋ ๋๋ง์ ์ค์ด๊ธฐ ํํ Batch ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค.
๐ฅ Batch์ ์ ๋ฐ์ดํธ๋ 16ms ์ฃผ๊ธฐ์ด๋ค!
๋ง์ฝ State๊ฐ ๋ง๊ณ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋๋ง๋ค ๋ ๋๋ง์ ํ๊ฒ ๋๋ฉด React๋ ๋งค๋ฒ ๋ ๋๋ง๋ง ํ๊ณ ๊ฒฐ๊ตญ ์๋๊ฐ ๋๋ ค์ง๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด Batch ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ์ด ๋๋ฌธ์ setCount
๊ฐ ๋น๋๊ธฐ๋ก ์๋์ ํด ๊ทธ ํ์ ์ค๋ console.log
๊ฐ ์คํ์ด ๋๊ณ ๊ทธ ํ setCount
๊ฐ ์๋์ ํ๋ ๊ฒ์ด๋ค.