๐ ์ ๋ฆฌ์ผ: 2026-04-29
๐ ๋ฒ์: Props & State ์ฐ๋ / Component LifeCycle / Routing / ์ฑ๋ฅ ์ต์ ํ (useMemo, useCallback, React.memo)
๋ถ๋ชจ (state ๋ณด์ )
โ props๋ก state ์ ๋ฌ
์์ (UI ๋ ๋๋ง)
โ ๋ณ๊ฒฝ์ด ํ์ํ๋ฉด ๋ถ๋ชจ๊ฐ ์ค setState ํจ์ ํธ์ถ
๋ถ๋ชจ (state ์
๋ฐ์ดํธ)
โ ์ props ๋ค์ ์ ๋ฌ
์์ (๋ฆฌ๋ ๋๋ง)
| ์ํ | ์ค๋ช | ๋ฐ์ ์์ |
|---|---|---|
| ๋ง์ดํธ | ์ปดํฌ๋ํธ DOM์ด ์ต์ด ์์ฑ | ํ์ด์ง์ ์ปดํฌ๋ํธ๊ฐ ์ถ๊ฐ๋ ๋ |
| ์ ๋ฐ์ดํธ | DOM์ด ์์ ๋๋ ์ํ | state/props ๋ณ๊ฒฝ, ๋ถ๋ชจ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง ์ |
| ์ธ๋ง์ดํธ | DOM์ด ์ ๊ฑฐ๋๋ ์ํ | ํ์ด์ง์์ ์ปดํฌ๋ํธ๊ฐ ์ ๊ฑฐ๋ ๋ |
๐ก ์ถ๊ฐ ์ ๋ฆฌ: React์์ ๋ผ์ดํ์ฌ์ดํด์ ๋ค๋ฃจ๋ ํ ์
useEffect๋ค.
useEffect(() => {}, [])โ ๋ง์ดํธ ์ 1ํ ์คํuseEffect(() => {}, [state])โ state ๋ณ๊ฒฝ ์๋ง๋ค ์คํ (์ ๋ฐ์ดํธ)useEffect(() => { return () => {} }, [])โ return ์์ ํจ์๊ฐ ์ธ๋ง์ดํธ ์ ์คํ
| ๋ฐฉ๋ฒ | ์ฌ์ฉ ์์น | ์ฝ๋ |
|---|---|---|
<Link> ์ปดํฌ๋ํธ | JSX ๋ด ์ด๋ | <Link href="/page">์ด๋</Link> |
useRouter() | ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ | const router = useRouter(); router.push('/page') |
redirect() | ํด๋ผ์ด์ธํธ & ์๋ฒ ์ปดํฌ๋ํธ ๋ชจ๋ ๊ฐ๋ฅ | redirect('/page') |
โ ๏ธ ์ฃผ์: ํ์ด์ง ์ปดํฌ๋ํธ๋ ๋ฐ๋์ ํด๋ ํํ๋ก ๋ง๋ค์ด์ผ ํ๋ค. ์ฑ๊ธ ํ์ผ ๋ถ๊ฐ.
React๋ state๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋งํ๋ค.
๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ์ปดํฌ๋ํธ ํจ์ ๋ด๋ถ์ ๋ชจ๋ ์ฝ๋๊ฐ ๋ค์ ์คํ๋๊ณ , ํจ์๋ ์๋ก ์ ์ธ๋๋ค.
useMemo โ ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ์ ๊ธฐ์ตconst ๊ฒฐ๊ณผ๊ฐ = useMemo(() => {
// ๊ณ์ฐ ๋ก์ง
return ๊ณ์ฐ๋๊ฐ;
}, [์์กด์ฑ_์ํ]);
// โ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ํจ์ ์ฌํธ์ถ
const getLength1 = function () {
return boards.length;
};
// โ
boards๊ฐ ๋ฐ๋ ๋๋ง ์ฌ๊ณ์ฐ
const getLength2 = useMemo(() => {
return boards.length;
}, [boards]);
โ ๏ธ
useMemo๋ ๊ฐ์ ๋ฐํํ๋ค. ํธ์ถํ ๋getLength2()๊ฐ ์๋๋ผ{getLength2}๋ก ์ฌ์ฉ.
useCallback โ ํจ์ ์์ฒด๋ฅผ ๊ธฐ์ตconst ํจ์ = useCallback(function () {
// ํจ์ ๋ก์ง
}, [์์กด์ฑ_์ํ]);
[]์ด๋ฉด ๋ง์ดํธ ์ ๋ฑ 1๋ฒ๋ง ์ ์ธuseMemo | useCallback | |
|---|---|---|
| ๊ธฐ์ตํ๋ ๊ฒ | ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ | ํจ์ ์์ฒด |
| ๋ฐํ | ๊ฐ | ํจ์ |
| ์ฌ์ฉ ์ | {getLength2} | {getLength1()} (ํจ์์ด๋ฏ๋ก ํธ์ถ ๊ฐ๋ฅ) |
| ์ฃผ์ ์ฉ๋ | ๋ฌด๊ฑฐ์ด ๊ณ์ฐ ์บ์ฑ | ์์์๊ฒ ๋๊ธธ ํจ์ ์์ ํ |
// โ
boards๊ฐ ๋ฐ๋ ๋๋ง ํจ์ ์ฌ์ ์
const getLength1 = useCallback(function () {
return boards.length;
}, [boards]);
// โ
๋ง์ดํธ ์ 1๋ฒ๋ง ์ ์ (setBtitle์ด ์์ ์ ์ด๋ผ deps ๋ถํ์)
const handleBtitleChange = useCallback(function (event) {
setBtitle(event.target.value);
}, []);
// โ
์ํ ์
๋ฐ์ดํฐ ํจ์ ํํ๋ก ์ฐ๋ฉด boards๋ฅผ deps์ ์ ๋ฃ์ด๋ ๋จ
const removeBoard = useCallback((bno) => {
setBoards(prev => prev.filter(board => board.bno !== bno));
}, []);
const changeBoard = useCallback((bno) => {
setBoards(prev => prev.map(board =>
board.bno === bno
? { ...board, btitle: board.btitle + " (๋ณ๊ฒฝ)" }
: board
));
}, []);
๐ก ์ํ ์ ๋ฐ์ดํฐ ํจ์ ํจํด
setBoards(prev => ...)์ ์ฐ๋ฉด,boards๋ฅผ deps์ ๋ฃ์ง ์์๋ ํญ์ ์ต์ ๊ฐ์ ์ฐธ์กฐํ ์ ์์ด์[]๋ก ๋๋ ๊ฒ ๊ฐ๋ฅํ๋ค.
React.memo โ ์ปดํฌ๋ํธ ์์ฒด๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
// ์ปดํฌ๋ํธ ์ ์ ํ React.memo๋ก ๊ฐ์ธ์ export
export default React.memo(BoardListItem);
React.memo๋ props๋ฅผ ์์ ๋น๊ต(===) ๋ก ํ์ธuseCallback์ผ๋ก ํจ์ ์ฐธ์กฐ๋ฅผ ์ ์งํด์ผ React.memo๊ฐ ์ ๋๋ก ๋์ํจ// ๋ถ๋ชจ์์ useCallback์ผ๋ก ํจ์ ์์ ํ
const removeBoard = useCallback((bno) => { ... }, []);
// ์์์์ React.memo๋ก ๊ฐ์ธ๊ธฐ
export default React.memo(BoardListItem);
// โ ์ด์ board props๊ฐ ์ ๋ฐ๋๋ฉด ์์์ ๋ฆฌ๋ ๋๋ง ์ ๋จ โ
useMemo โ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ตํด์ ๋ถํ์ํ ์ฌ๊ณ์ฐ ๋ฐฉ์ง
useCallback โ ํจ์๋ฅผ ๊ธฐ์ตํด์ ๋ถํ์ํ ์ฌ์ ์ธ ๋ฐฉ์ง
React.memo โ ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ์ตํด์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ๋ฐฉ์ง
๊ต์๋ ์ง๋ฌธ ๋๋น: ์ด ํจ์๊ฐ ์ํ๋ฅผ ์ด ๊ฑด์ง ์ ์ด ๊ฑด์ง ์ด๋ป๊ฒ ํ๋จํ๋?
useState๋ก ๋ง๋ ๋ณ์(boards, bno, btitle ๋ฑ)๊ฐ ํจ์ ๋ชธํต ์์ ์ง์ ๋ณด์ด๋ฉด โ ์ํ๋ฅผ ์ด ๊ฒ
const [boards, setBoards] = useState([...]); // โ ์ํ
const [bno, setBno] = useState(6); // โ ์ํ
const [btitle, setBtitle] = useState(""); // โ ์ํ
์ด ์ด๋ฆ๋ค์ด ํจ์ ์์ ๋ณด์ด๋ฉด โ ์ํ ์, ์ ๋ณด์ด๋ฉด โ ์ํ ์ ์
// โ
์ํ ์ ์ โ deps []
const handleBtitleChange = useCallback(function (event) {
setBtitle(event.target.value);
// setBtitle์ setter โ ์ํ๋ฅผ "๋ฐ๊พธ๋" ๊ฒ์ด์ง "์ฝ๋" ๊ฒ ์๋
}, []);
// โ
์ํ ์ ์ โ deps []
const removeBoard = useCallback((bno) => {
setBoards(prev => prev.filter(board => board.bno !== bno));
// boards๋ผ๋ ์ด๋ฆ์ด ์ ๋ณด์. prev๋ก ๋ฐ์์ค๊ณ ์์
}, []);
// โ ์ํ ์ โ useCallback ํจ๊ณผ ์์, ๊ทธ๋ฅ ์ผ๋ฐ ํจ์๋ก ๋ฌ์ผ ํจ
const addBoard = function() {
const newBoard = { bno, btitle }; // bno, btitle ์ง์ ์ฝ์
setBoards([...boards, newBoard]); // boards ์ง์ ์ฝ์
setBno(bno + 1); // bno ์ง์ ์ฝ์
}
// โ deps์ [bno, btitle, boards] ๋ค ๋ฃ์ด์ผ ํด์
// ๊ฒฐ๊ตญ ๋งค๋ฒ ์๋ก ๋ง๋ค์ด์ง โ useCallback ์๋ฏธ ์์
// ๊ทธ๋์ ๊ต์๋์ด "์ด๊ฑด ๊ทธ๋ฅ ๋๋๋ ๊ฒ ์ข๋ค"๊ณ ํ์ ๊ฒ
// โ ์ํ ์ โ deps์ [boards] ํ์
const getLength1 = useCallback(function () {
return boards.length; // boards ์ง์ ์ฝ์
}, [boards]);
prev ํจํด// โ ์ํ ์ โ boards ์ด๋ฆ์ด ์ง์ ๋ณด์
setBoards(boards.filter(...));
// โ
์ํ ์ ์ โ prev๋ก ๋ฐ์์ค๋๊น boards ์ด๋ฆ ์์
setBoards(prev => prev.filter(...));
prev๋ React๊ฐ ์์์ ์ต์ ์ํ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๋งค๊ฐ๋ณ์๋ค. ๋ด๊ฐ ์ํ๋ฅผ ์ง์ ์ฝ์ ๊ฒ ์๋.
ํจ์ ๋ชธํต ์์ ์ํ ๋ณ์ ์ด๋ฆ(boards, bno, btitle...)์ด ๋ณด์ด๋ฉด?
YES โ ์ํ ์ โ deps์ ๊ทธ ์ํ ๋ฃ๊ธฐ
NO โ ์ํ ์ ์ โ deps []
โ ๏ธ setter๋ ์์ธ:
setBoards,setBno๊ฐ์ setter ํจ์๋ ์ฝ๋ ๊ฒ ์๋๋ผ ๋ฐ๊พธ๋ ๊ฒ.
React๊ฐ ํญ์ ์์ ์ ์ผ๋ก ๋ณด์ฅํ๋ฏ๋ก deps์ ๋ฃ์ง ์์๋ ๋จ.
์์ ์ค ํท๊ฐ๋ ธ๋ ๋ถ๋ถ์ ํ๋ฆ ์์๋๋ก ๋ค์ ์ ๋ฆฌํ ๋ด์ฉ
React๋ state๊ฐ ๋ฐ๋๋ฉด ์ปดํฌ๋ํธ ํจ์๋ฅผ ํต์งธ๋ก ๋ค์ ์คํํ๋ค.
function BoardList() {
const [btitle, setBtitle] = useState(""); // ์ด๊ฒ ๋ฐ๋๋ฉด
// โ ์ด ํจ์๋ ์๋ก ๋ง๋ค์ด์ง
const removeBoard = function(bno) { ... };
// โ ์ด ํจ์๋ ์๋ก ๋ง๋ค์ด์ง
const changeBoard = function(bno) { ... };
}
btitle(์ ๋ชฉ ์
๋ ฅ์ฐฝ)์ ๊ธ์ ํ๋ ์น ๋๋ง๋ค removeBoard, changeBoard๊ฐ ์๋ก ๋ง๋ค์ด์ง๋ค.
ํจ์๋ฅผ ๋ณ์์ ๋ด์ผ๋ฉด, ๊ทธ ๋ณ์์ ํจ์์ ์ฃผ์(์ฐธ์กฐ) ๊ฐ ๋ค์ด๊ฐ๋ค.
const fn1 = function() { return 1; };
const fn2 = function() { return 1; };
console.log(fn1 === fn2); // โ false โ ๋ด์ฉ์ด ๊ฐ์๋ ๋ค๋ฅธ ๋ฌผ๊ฑด!
๋ด์ฉ์ด ์์ ํ ๋๊ฐ์๋, ์๋ก ๋ง๋ค์ด์ง ํจ์๋ ๋ค๋ฅธ ์ฃผ์๋ฅผ ๊ฐ์ง๋ค.
๋ฆฌ๋ ๋๋ง๋ง๋ค ํจ์๊ฐ ์๋ก ๋ง๋ค์ด์ง๋ค = ๋งค๋ฒ ์ฃผ์๊ฐ ๋ฌ๋ผ์ง๋ค.
{boards.map((board) => (
<BoardListItem
board={board}
removeBoard={removeBoard} // โ btitle ๋ฐ๋ ๋๋ง๋ค ์ ํจ์ ์ ๋ฌ
changeBoard={changeBoard} // โ btitle ๋ฐ๋ ๋๋ง๋ค ์ ํจ์ ์ ๋ฌ
/>
))}
๊ธ์ ํ๋ ์ ๋ ฅํ ๋๋ง๋ค ์ผ์ด๋๋ ์ผ:
1. BoardList ๋ฆฌ๋ ๋๋ง
2. removeBoard ์๋ก ๋ง๋ค์ด์ง (์ฃผ์ ๋ฐ๋)
3. changeBoard ์๋ก ๋ง๋ค์ด์ง (์ฃผ์ ๋ฐ๋)
4. BoardListItem์ด ์ props๋ฅผ ๋ฐ์
5. props๊ฐ ๋ฐ๋์์ผ๋๊น โ BoardListItem ์ ๋ถ ๋ฆฌ๋ ๋๋ง ๐ฑ
๊ฒ์๋ฌผ์ด 100๊ฐ๋ฉด ๊ธ์ ํ๋ ์น ๋๋ง๋ค 100๋ฒ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๋ค.
const removeBoard = useCallback((bno) => {
setBoards(prev => prev.filter(board => board.bno !== bno));
}, []); // โ ๋น ๋ฐฐ์ด = ๋ง์ดํธ ๋ ๋ฑ ํ ๋ฒ๋ง ๋ง๋ค๊ณ ๊ทธ ์ฃผ์ ์ ์ง
useCallback์ ๋ฆฌ์กํธํํ
์ด๋ ๊ฒ ๋งํ๋ ๊ฒ:
"์ด ํจ์, ๋ฆฌ๋ ๋๋ง๋ผ๋ ๋ฒ๋ฆฌ์ง ๋ง๊ณ ์ฒ์ ๋ง๋ ๊ฑฐ ๊ณ์ ์จ."
๊ทธ๋ฌ๋ฉด removeBoard์ ์ฃผ์๊ฐ ๋ณํ์ง ์๋๋ค.
1. BoardList ๋ฆฌ๋ ๋๋ง
2. removeBoard โ useCallback์ด ์ด์ ํจ์ ๊ทธ๋๋ก ๋ฐํ (์ฃผ์ ๋์ผ)
3. BoardListItem์ด ๋ฐ๋ props โ ์ด์ ์ด๋ ๊ฐ์
4. ๋ฆฌ๋ ๋๋ง ์ ํด๋ ๋จ! ๐
[] โ ์ธ์ ๋ญ ๋ฃ๋?// ๋น ๋ฐฐ์ด โ ๋ง์ดํธ ์ ๋ฑ 1๋ฒ๋ง ํจ์ ์์ฑ
const removeBoard = useCallback((bno) => { ... }, []);
// [boards] โ boards๊ฐ ๋ฐ๋ ๋๋ง ํจ์ ์๋ก ์์ฑ
const getLength = useCallback(() => {
return boards.length; // boards๋ฅผ ์ง์ ์ฝ์ผ๋๊น deps์ ๋ฃ์ด์ผ ํจ
}, [boards]);
setBoards(prev => ...) ํจํด์ ์ฐ๋ฉด boards๋ฅผ ์ง์ ์ฝ์ง ์์ผ๋ฏ๋ก []๋ก ๋ฌ๋ ๋๋ค.
// โ boards๋ฅผ ์ง์ ์ฐธ์กฐ โ deps์ boards ํ์
const removeBoard = useCallback((bno) => {
setBoards(boards.filter(b => b.bno !== bno)); // boards ์ง์ ์ฝ์
}, [boards]);
// โ
prev๋ก ๋ฐ์์ค๋ฉด โ deps ๋น ๋ฐฐ์ด ๊ฐ๋ฅ
const removeBoard = useCallback((bno) => {
setBoards(prev => prev.filter(b => b.bno !== bno)); // boards ์ ์ฝ์
}, []);
export default React.memo(BoardListItem);
React.memo๋ ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ์ ์ด๋ ๊ฒ ๋งํ๋ ๊ฒ:
"๋ํํ ์ค๋ props๊ฐ ์ด์ ์ด๋ ๊ฐ์ผ๋ฉด, ๋ฆฌ๋ ๋๋ง ์ ํด๋ ๋ผ."
props๋ฅผ ๋น๊ตํ๋ ๋ฐฉ์์ด === ์์ ๋น๊ต๋ค.
์ด์ props: { board: {...}, removeBoard: ํจ์A, changeBoard: ํจ์B }
์ props: { board: {...}, removeBoard: ํจ์A, changeBoard: ํจ์B }
ํจ์A === ํจ์A ? โ true (๊ฐ์ ์ฃผ์)
โ props ์ ๋ฐ๋ โ ๋ฆฌ๋ ๋๋ง ๊ฑด๋๋ โ
// useCallback ์์ด
const removeBoard = function(bno) { ... }; // ๋งค ๋ ๋๋ง๋ง๋ค ์ ์ฃผ์
// React.memo๊ฐ ๋น๊ตํ ๋
์ด์ props: { removeBoard: ํจ์A }
์ props: { removeBoard: ํจ์B } // ๋ด์ฉ ๊ฐ์๋ ์ฃผ์๊ฐ ๋ค๋ฆ!
ํจ์A === ํจ์B ? โ false
โ props ๋ฐ๋ ๊ฒ์ผ๋ก ํ๋จ โ ๋ฆฌ๋ ๋๋ง ๋ฐ์ ๐ฅ
React.memo๋ "๋น๊ตํ๋ ๋ฌธ์ง๊ธฐ"๊ณ , useCallback์ "์ฃผ์๋ฅผ ์ ์ง์์ผ์ฃผ๋ ๊ฒ"์ด๋ค.
๋ฌธ์ง๊ธฐ ํผ์์ ์๋ฌด ์๋ฏธ ์๋ค. ๋์ ์ธํธ๋ก ์จ์ผ ํ๋ค.
๐ ์ ๋ชฉ ์
๋ ฅ์ฐฝ์ ๊ธ์ ์
๋ ฅ
โ
๐ BoardList ๋ฆฌ๋ ๋๋ง
โ
useMemo โ boards ์ ๋ฐ๋์์ผ๋ โ ์ด์ ๊ณ์ฐ๊ฐ ๊ทธ๋๋ก โ
useCallback โ removeBoard ํจ์ ์ฃผ์ ๊ทธ๋๋ก โ
useCallback โ changeBoard ํจ์ ์ฃผ์ ๊ทธ๋๋ก โ
โ
BoardListItem์ ์ ๋ฌ๋๋ props โ ์ด์ ์ด๋ ๊ฐ์
โ
React.memo โ props ์ ๋ฐ๋์์ผ๋ โ ๋ฆฌ๋ ๋๋ง ๊ฑด๋๋ โ
| ํ | ๋ฌด์์ ๊ธฐ์ต? | ๋ชฉ์ |
|---|---|---|
useMemo | ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ | ๋ฌด๊ฑฐ์ด ๊ณ์ฐ ๋ฐ๋ณต ๋ฐฉ์ง |
useCallback | ํจ์์ ์ฃผ์ | ์์ํํ ๋๊ธธ ํจ์ ์ฃผ์ ์ ์ง |
React.memo | ์ปดํฌ๋ํธ ๋ ๋ ๊ฒฐ๊ณผ | props ์ ๋ฐ๋๋ฉด ๋ฆฌ๋ ๋๋ง ๊ฑด๋๋ |
Element type is invalidUncaught Error: Element type is invalid: expected a string (for built-in components)
or a class/function (for composite components) but got: object.
Check the render method of `BoardList`.
์ํฌํธํ ์ปดํฌ๋ํธ๊ฐ undefined ๋๋ object๋ก ๋ค์ด์จ ๊ฒฝ์ฐ.
// โ export default์ธ๋ฐ named import๋ก ๊ฐ์ ธ์จ ๊ฒฝ์ฐ
import { BoardListItem } from './BoardListItem'; // undefined๊ฐ ๋จ
// โ
์ฌ๋ฐ๋ฅธ import
import BoardListItem from './BoardListItem';
// โ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํต์งธ๋ก importํ ๊ฒฝ์ฐ
import ReactDOM from 'react-dom'; // object โ ์ปดํฌ๋ํธ๋ก ์ฌ์ฉ ๋ถ๊ฐ
// โ
์ฌ๋ฐ๋ฅธ import
import { createRoot } from 'react-dom';
// return ์ง์ ์ console.log๋ก ์ํฌํธ๋ ๊ฐ ํ์ธ
console.log({ BoardListItem });
// {} ๋๋ undefined๋ก ์ฐํ๋ ๊ฒ ๋ฒ์ธ
Cannot read properties of undefined (reading 'length')useCallback ์์์ setBoards์ return์ ๋น ๋จ๋ ค์ undefined๊ฐ ์ ๋ฌ๋จ.
// โ return์ด ์์ด์ setBoards์ undefined ์ ๋ฌ
const changeBoard = useCallback((bno) => {
setBoards(aa => {
aa.map(board => { // map ๊ฒฐ๊ณผ๋ฅผ return ์ ํจ!
if (board.bno === bno) {
return { ...board, btitle: board.btitle + " (๋ณ๊ฒฝ)" };
} else {
return board;
}
}); // ์ฌ๊ธฐ์ return์ด ์์
});
}, [boards]);
// โ
์ฌ๋ฐ๋ฅธ ์ฝ๋
const changeBoard = useCallback((bno) => {
setBoards(aa => {
return aa.map(board => { // return ์ถ๊ฐ
if (board.bno === bno) {
return { ...board, btitle: board.btitle + " (๋ณ๊ฒฝ)" };
} else {
return board;
}
});
});
}, []);
์ค๊ดํธ {} ์ฌ์ฉ ์ฌ๋ถ | return ํ์ ์ฌ๋ถ |
|---|---|
ํ์ดํ ํจ์ () => ๊ฐ | return ๋ถํ์ (์๋ฌต์ ๋ฐํ) |
ํ์ดํ ํจ์ () => { ... } | return ๋ช ์ ํ์ |
๐ก
setBoards(prev => prev.map(...))์ฒ๋ผ ์ค๊ดํธ ์์ด ์ฐ๋ฉด ์ค์๋ฅผ ์ค์ผ ์ ์๋ค.
๋