App
)๋ ๊ฒฐ๊ตญ ํ๋์ ์์
์ ์ํํ ๊ฒ์ด๋ฉฐ, JSX ์ฝ๋๋ฅผ ๋ฐํํ๋ค.return (
<div className="app">
<h1>Hi there!</h1>
<DemoOutput show={showParagraph} />
<Button onClick={allowToggleHandler}>Allow Toggling</Button>
<Button onClick={toggleParagraphHandler}>Toggle Paragraph!</Button>
</div>
);
<DemoOutput show={showParagraph} />
DemoOutput
์ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์๋ฅผ ๋ค์ด๋ณด์.const DemoOutput = (props) => {
console.log("DemoOutput RUNNUNG");
return <MyParagraph>{props.show ? "This is New!" : ""}</MyParagraph>;
};
DemoOutput
์ปดํฌ๋ํธ ๋ด๋ถ์ ํ
์คํธ("This is New!")๋ ๋ ๋๋ง๋์ง ์์ ์๋ ์๋ค. ๋ฆฌ์กํธ๋ ๋จ์ํ ์ต์ ํ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์์ ์ง์ ํ๊ฐ์ ๊ฒฐ๊ณผ์ ๋น๊ตํด์ ๋ฆฌ์กํธ์ DOM
์ ์ ๋ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๋ชจ๋ ์ปดํฌ๋ํธ์ ํด๋น ๋๋ค.DOM
์ ์ ๋ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ฆฌ์กํธ DOM
์ ํตํด index.js
ํ์ผ์ ๋ ๋๋งํ๊ณ ๋ฆฌ์กํธ DOM
์ ์ด ๋ณ๊ฒฝ ์ฌํญ์ ๋ธ๋ผ์ฐ์ ์ ์ค์ DOM
์ ์ ์ฉํ๋ฉฐ, ๋ณ๊ฒฝ๋์ง ์์ ๊ฒ๋ค์ ๊ทธ๋๋ก ๋๋ค.return (
<div className="app">
<h1>Hi there!</h1>
<DemoOutput show={showParagraph} />
<Button onClick={allowToggleHandler}>Allow Toggling</Button>
<Button onClick={toggleParagraphHandler}>Toggle Paragraph!</Button>
</div>
);
DemoOutput
์ปดํฌ๋ํธ์ ์๋์ Button
์ปดํฌ๋ํธ ๋๊ฐ๋ฅผ ์ฌ์คํ ํ ๊ฒ์ด๋ค.const DemoOutput = (props) => {
console.log("DemoOutput RUNNUNG");
return <MyParagraph>{props.show ? "This is New!" : ""}</MyParagraph>;
};
export default React.memo(DemoOutput);
DemoOutput
๋ React.memo
๋ฅผ ํตํด ํ์ ์ปดํฌ๋ํธ์ ๋ถํ์ํ ์ฌ์คํ์ ๋ง์๊ณ , ๋ฆฌ์กํธ์๊ฒ props๊ฐ ์ค์ ๋ก ๋ณ๊ฒฝ๋์์ ๋๋ง ์ปดํฌ๋ํธ ํจ์๋ฅผ ์ฌ์คํํ๊ณ ์๋ก์ด ๊ฐ์ด ์์ ๋ ํจ์๋ฅผ ์ฌ์คํํ์ง ์๋๋ก ํ ์ ์๊ฒ ๋์๋ค.App
์ปดํฌ๋ํธ ์์ ์๋ ๋ชจ๋ ๊ฒ๋ค์ด ๋ค์ ์คํ๋๋ค๋ ์ฌ์ค์ ์์ง ๋ชปํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ด์ํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์์ง๋ ๋ชจ๋ฅธ๋ค. ์๋ฅผ ๋ค์ด๋ณด์. ํจ์ ์์ ํจ์๋ฅผ ๋ง๋ค๊ณ ํด๋น ํจ์๋ฅผ props๋ฅผ ํตํด ์ปดํฌ๋ํธ์ ์ ๋ฌํ๋ฉด ์๋ก์ด ํจ์ ๊ฐ์ฒด๋ฅผ ์ป์ ์ ์๋ค. ์ด๋ ๊ฒ ๋๋ฉด React.memo
๋ฅผ ํตํ ๋ถํ์ํ ์ฌ์คํ์ ๋ง์ ์ ์์ ๊ฒ์ด๋ค. ์์์ ์ค๋ช
ํ๋ฏ์ด ๊ฐ์ฒด(๋ฐฐ์ด, ํจ์)๋ ์ฐธ์กฐ ๊ฐ์ด๋ฉฐ, React.memo
๊ฐ ๋ด๋ถ์ ์ผ๋ก ์คํํ๋ ์ผ๋ฐ์ ์ธ ๋น๊ต ์ฐ์ฐ์๋ฅผ ํตํ ๋น๊ต๋ ์ด ์ฐธ์กฐ ๊ฐ์ ๋ํด์๋ ํต์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค."
React.memo()
๊ฐ ํ๋ ์ผ์ props ์ ๊ฐ์ ํ์ธํ๊ณ , ์ด์ ์ props ์ ๊ฐ์ฅ ์ต๊ทผ์ props ์ค๋ ์ท์ ๋น๊ตํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋น๊ต ์์ ์ ์ผ๋ฐ์ ์ธ ๋น๊ต ์ฐ์ฐ์๋ฅผ ํตํด ์ด๋ค์ง๋ค. ์ผ๋ฐ์ ์ธ ์์ ๊ฐ์ด๋ผ๋ฉด ์ด๋ฐ ์ผ๋ฐ์ ์ธ ๋น๊ต ์ฐ์ฐ์๋ฅผ ํตํด์ ๋น๊ต๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด๋ค. ํ์ง๋ง ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด, ํจ์๋ฅผ ๋น๊ตํ๋ค๋ฉด ๋ง์ด ๋ฌ๋ผ์ง๋ค. ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด, ํจ์๋ ์ฐธ์กฐ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ ๋น๊ต ์ฐ์ฐ์๋ฅผ ํตํด์๋ ๋์ผํ ๊ฐ์ผ๋ก ์ทจ๊ธํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค."
useCallback
๋ฅผ ์ฌ์ฉํ๋ค. ๋ฐ๋ก ์ด useCallback
์ ํตํด ์ฐธ์กฐ ๊ฐ๋ ๋น๊ตํ์ฌ ๋ถํ์ํ ์ฌ์คํ์ ๋ง์ ์ ์๋๋ก ํ ๊ฒ์ด๋ค."
useCallback
์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปดํฌ๋ํธ ์คํ ์ ๋ฐ์ ๊ฑธ์ณ ํจ์๋ฅผ ์ ์ฅํ ์ ์๋๋ก ํ๋ hook ์ผ๋ก์จuseCallback
๋ฅผ ํตํด์ ๊ฐ์ผ ํจ์๋ฅผ ์ ์ฅํ์ฌ ์ด ํจ์๊ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋งค๋ฒ ์คํ๋ ๋๋ง๋ค ์ฌ์์ฑํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ React์ ์๋ฆฌ๋ ์ญํ ์ ํ๋ค.useCallback
์ ์ฌ์ฉํ์ฌ ํน์ ํจ์๋ฅผ ๊ฐ์ผ๋ค๋ฉด, ์ด ํจ์ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋์ผํ ์์น์ ์ ์ฅ๋๋ฏ๋ก ์ด๋ฅผ ํตํด ๋น๊ต ์์ ์ ํ ์ ์๊ฒ ๋๋ค. "
useCallback
์ ํตํด ๋ฆฌ์กํธ์๊ฒ useCallback
์ผ๋ก ํน์ ํจ์๋ฅผ ๊ฐ์ธ์ ํจ์๋ฅผ ์ ์ฅํ๋๋ก ํ๊ณ , ํด๋น ํจ์๊ฐ ์ฌ์คํ๋์ด๋ ํน์ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ์๋๋ผ๋ฉด ํจ์ ์ฌ์์ฑ์ ๋ง์ ์ ์๋ค.useState
hook ์ ์ฌ์ฉํ๋ ๊ฒ ๋ฐ๋ก ๊ทธ ์์๊ฐ ๋ ์ ์๋ค. useState
๋ฅผ ํตํด ์ปดํฌ๋ํธ์ ์ํ(state)๊ฐ์ ์ํธ ์์ฉ์ ์ฒ๋ฆฌํ๋ค.๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ํํ์ ์ํ(state) ๊ด๋ฆฌ๋ useState
ํ
์ ์ด์ฉํ๋ ๊ฒ์ด๋ค. useState
๋ฅผ ์ด์ฉํ๋ฉด ์๋ก์ด ์ํ(state)๋ฅผ ๋ง๋ค์ด์ ์๋์ ์ผ๋ก useState
๋ฅผ ํธ์ถํ ์ปดํฌ๋ํธ์ ์ด๋ฅผ ์ฐ๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฐ ์ข
๋ฅ์ '์ฐ๊ฒฐ'๋ ๋ฆฌ์กํธ๊ฐ ๋ด๋นํ๋ ์ญํ ์ด๋ค.
useState
๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด ๋ฆฌ์กํธ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ด๋ฅผ ๊ด๋ฆฌํ๊ณ , ์ปดํฌ๋ํธ์ ์ด๋ฅผ ๋ฌถ์ด์ค ์๋ก์ด ์ํ(state) ๋ณ์๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์ ์ ํ์ต์์๋ ๊ฐ์กฐํ๋ฏ์ด useState
๋ฅผ ํธ์ถํ์์๋ App
์ปดํฌ๋ํธ ํจ์๊ฐ ๋งค๋ฒ ๋ค์ ์คํ๋๋ ๊ฒ์ ํ์คํ ์ด์ํด ๋ณด์ธ๋ค. ์๋ํ๋ฉด ์์ ๊ฑฐ๋ก ํ ๋ฌธ์ ๋ก ์ธํด์ ์ํ(state)์ ๋ํ ์ด๋ค ์ข
๋ฅ์ ์์ค์ด ๋ฐ์ํ๊ฑฐ๋ ์ํ(state) ์ด๊ธฐํ๊ฐ ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ง๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
useState
๋ ๋ฆฌ์กํธ๊ฐ ์ ๊ณตํ๋ ํ
์ด๋ฉฐ, ๋ฆฌ์กํธ๋ ์ํ(state)๋ฅผ ๊ด๋ฆฌํ๊ณ ์ปดํฌ๋ํธ์์ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ฆฌ์กํธ์ ๊ด๋ฆฌ ํ๋ก์ธ์ค์ ์ผ๋ถ๋ก ๋ฆฌ์กํธ๋ useState
์ ์ฌ๊ธฐ์ ์ ๋ฌ๋ '๊ธฐ๋ณธ ๊ฐ'์ ๋ํด์๋ ํ ๋ฒ๋ง ๊ณ ๋ คํ๋๋ก ์ฒ๋ฆฌ๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ํ ๋ฒ๋ง ๊ณ ๋ คํ๋ค๋ ๋ง์ ๋ฌด์์ผ๊น? ๋ฐ๋ก App
์ปดํฌ๋ํธ(์์)๊ฐ ์ต์ด ์คํ๋ ๋์๋ง ๊ณ ๋ คํ๋ค๋ ๋ง์ด๋ค.import React, { useState, useCallback } from "react";
function App() {
const [showParagraph, setShowParagraph] = useState(false);
const [allowToggle, setAllowToggle] = useState(false);
...
}
App
์ปดํฌ๋ํธ๊ฐ ์ต์ด ์คํ๋๊ณ useState
๊ฐ ์คํ๋๋ฉด, ๋ฆฌ์กํธ๊ฐ ๊ด๋ฆฌํ๋ ์๋ก์ด ์ํ(state) ๋ณ์๋ฅผ ๋ง๋ค๊ฒ ๋๋ค. ๊ทธ๋ฐ ํ, ๋ฆฌ์กํธ๋ ์ด ๋ณ์๊ฐ ์ด๋ ์ปดํฌ๋ํธ์ ์ํ๋์ง๋ฅผ ๊ธฐ์ตํด๋๋ค. (์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ App
์ปดํฌ๋ํธ๊ฐ ๋ ๊ฒ์ด๋ค.) ๊ทธ๋ฆฌ๊ณ useState
์ ์ ๋ฌ๋ ๊ธฐ๋ณธ ๊ฐ์ ์ฌ์ฉํด์ ์ํ(state) ๊ฐ์ ์ด๊ธฐํํ๋ค. ์ดํ App
์ปดํฌ๋ํธ๋ฅผ ์ฌํ๊ฐํ๊ฒ ๋ ๋ useState
๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด(์ปดํฌ๋ํธ ํจ์๊ฐ ์ฌํ๊ฐ ๋ ๋๋ง๋ค ํด๋น ์ปดํฌ๋ํธ ํจ์์ ๋ชจ๋ ์ฝ๋๋ค์ ์ฌ์คํ-ํธ์ถ ๋๋ค.) ์๋ก์ด ์ํ(state)๋ ์์ฑ๋์ง ์๋๋ค. ๋ฆฌ์กํธ๋ ์ฌ๊ธฐ์์ App
์ปดํฌ๋ํธ์ ๋ํ ์ํ(state)๊ฐ ์ด๋ฏธ ์กด์ฌํจ์ ๊ธฐ์ตํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ด ์ํ(state)๋ฅผ ์
๋ฐ์ดํธํ๊ฒ ๋๋ค. App
์ปดํฌ๋ํธ ํจ์๊ฐ ์ฌ์คํ๋๊ณ ๋ช ๋ช์ ์ํ(state)๋ ์
๋ฐ์ดํธ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ๋ฆฌ์กํธ๋ ์ํ(state)์ ๊ด๋ฆฌ์ ๊ฐฑ์ ๋ง์ ๋ด๋นํ๋ค.DOM
์์ ์์ ํ ์ญ์ ๋๊ฑฐ๋ ํ์ง ์๋ ์ด์ ์ํ(state)์ ์ด๊ธฐํ๋ ๋ค์ ์ด๋ฃจ์ด์ง์ง ์๋๋ค. ๊ฒ๋ค๊ฐ ์ฐ๋ฆฌ๊ฐ ์์๋ก ๋ค๊ณ ์๋ App
์ปดํฌ๋ํธ๋ root ์ปดํฌ๋ํธ์ด๊ธฐ์ ์์ ๊ฑฐ๋ก ํ ์์ธ์ ์ธ ์ผ์ ์์ ๋ฐ์ํ์ง๋ ์์ ๊ฒ์ด๋ค. ๋ฌผ๋ก ํ์ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ๋ผ๋ฉด ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ ๋๋ง๋ ์๋ ์์ง๋ง ๋ง์ด๋ค. ์๋ฅผ ๋ค์ด, ํ์ ์ปดํฌ๋ํธ๊ฐ ์ญ์ ๋์๋ค๊ฐ ๋ค์ ์ฐ๊ฒฐ๋๋ค๋ฉด ์๋ก์ด ์ํ(state)๊ฐ ํธ์ถ๋๊ณ ๋ค์ ์ด๊ธฐํ๋ ์ ์์ ๊ฒ์ด๋ค. ํ์ง๋ง DOM
์ ์ปดํฌ๋ํธ๊ฐ ์ฐ๊ฒฐ๋๊ณ ์ ์ง๋๋ ๋์์๋ ์ํ(state)๋ ์ต์ด์ ์ด๊ธฐํ ์ดํ์๋ '๊ฐฑ์ '๋ง ๋๋ค. ์ด๋ ์์ฃผ ์ค์ํ ๊ฐ๋
์ด๋ค. ๋ฌผ๋ก useReducer
์ ๋ํด์๋ ์ด ๊ฐ๋
์ ๋์ผํ๊ฒ ์ ์ฉ๋๋ค.function MyProduct() {
const [currentState, setCurrentState] = useState("DVD");
}
MyProduct
์ปดํฌ๋ํธ๊ฐ ์กด์ฌํ๋ค. ์ด ์ปดํฌ๋ํธ ์์์๋ useState
ํ
์ ํตํด ์ผ๋ถ ์ํ(state)๋ค์ ๊ด๋ฆฌํ ์ ์๋ค. ์ฆ, ๋ฆฌ์กํธ๊ฐ ์ํ(state)๋ฅผ ๊ด๋ฆฌํด์ค ์ ์๋ค. MyProduct
์ปดํฌ๋ํธ ๋ด๋ถ์ currentState
์ํ(state)๋ 'DVD' ๋ผ๋ ๋ฌธ์์ด ์ด๊ธฐ๊ฐ์ ๊ฐ์ก๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์๋ง๋ ์ด๋ค ์ดํ๋ฆฌ์ผ์ด์
์ด ๋ ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ๋๋ฅด๊ฑฐ๋ ํ๋ฉด์ ํด๋น ์ปดํฌ๋ํธ ์์์ ์ํ(state)๊ฐ ์
๋ฐ์ดํธ๋๊ณ ๊ฐฑ์ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ํ(state) ์
๋ฐ์ดํธ ํจ์์ธ setCurrentState
๋ฅผ ํตํด์ ์๋ก์ด ๊ฐ์ผ๋ก ์
๋ฐ์ดํธ ๋ ๊ฒ์ด๋ค.function MyProduct() {
const [currentState, setCurrentState] = useState("DVD");
const buttonClickHandler = () => {
setCurrentState("BOOK");
};
}
buttonClickHandler
ํจ์์์ ๋ฐ์ํ๋ ์ผ์ setCurrentState
๊ฐ ์คํ๋์์์๋ ๊ธฐ์กด์ cuurentState
์ด๊ธฐ ๊ฐ์ธ 'DVD' ๊ฐ ์ฆ๊ฐ์ ์ผ๋ก ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ๋์ ์ ์ํ(state) ์
๋ฐ์ดํธ ํจ์์ธ setCurrentState
๋ฅผ ํธ์ถํ๋ฉด, 'BOOK' ๋ฐ์ดํฐ๋ก ์ํ(state) ์
๋ฐ์ดํธ๋ฅผ ํ๋๋ก ์์ฝ์ ํ๊ฒ ๋๋ค. ์ด๊ฒ์ด ์ํ(state) ๊ฐฑ์ ์์ฝ์ด๋ค.setCurrentState
๋ฅผ ํธ์ถํ๊ณ ์ํ(state) ์
๋ฐ์ดํธ๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ์ธ์งํ๊ณ ์๊ณ ๋ํ ์ฒ๋ฆฌํ ๊ณํ๊น์ง ์ค๋นํ๊ณ ์์ง๋ง ์ด๋ฅผ ์ฆ์ ์ฒ๋ฆฌํ์ง๋ ์๋๋ค. ์ฌ์ค ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ ์ํ(state) ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด ์ํ(state) ๊ฐฑ์ ์ ๋ํ ์ค์ผ์ค ์์
์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋ฐ์ํ๋ค. ๊ฑฐ์ ์ฆ๊ฐ์ ์ธ ๊ฑฐ๋ ๋ค๋ฆ ์๋ค. ์ค์ ๋ก๋ ์๊ฐ์ ์ผ๋ก ๋ฐ์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ, ์ฌ์ฉ์ ์ญ์ ์ด๋ฌํ '์ง์ฐ'์ ๋ํด์๋ ์์ง ๋ชปํ๋ค. ํ์ง๋ง ๋ฆฌ์กํธ๋ ์ด ์ํ(state) ๋ณํ๋ฅผ '์ง์ฐ' ์ํค๊ฒ ๋๋ค.function MyProduct() {
const [currentState, setCurrentState] = useState("DVD");
const buttonClickHandler = () => {
setCurrentState("BOOK");
};
}
const toggleParagraphHandler = useCallback(() => {
if (allowToggle) {
setShowParagraph((prevParagraph) => !prevParagraph);
}
}, [allowToggle]);
useEffect
์ ๋ํด ํ์ตํ๋ ์ ์ ๊ธฐ์ตํ ๊ฒ์ด๋ค.// Reducer์ ์ํ ๊ฐ์ ์ด์ฉํ ๊ฐ์ฒด ๊ตฌ์กฐ ๋ถํด ํ ๋น
const { isValid: emailValid } = emailState;
const { isValid: passwordValid } = passwordState;
useEffect(() => {
const identifier = setTimeout(() => {
console.log("Checking form validity!");
setFormIsValid(emailValid && passwordValid);
}, 500);
return () => {
console.log("CLEANUP");
clearTimeout(identifier);
};
}, [emailValid, passwordValid]);
useEffect
๋ด๋ถ์์ ์ด๋ฉ์ผ๊ณผ ๋น๋ฐ๋ฒํธ์ ์ ํจ ์ํ(state)๋ฅผ ํตํด ํผ์ ์ ํจ์ฑ์ ์
๋ฐ์ดํธํ๋ ๊ฒ์ด ์ข ๋ ์์ ํ๋ค๊ณ ํ๋ ๊ฒ์ ๊ธฐ์ตํ ๊ฒ์ด๋ค. ์ด์ ์ํ(state)์ ์ค๋
์ท์ ๊ธฐ๋ฐ์ผ๋ก ์ํ(state)๋ฅผ ๊ฐฑ์ ํ๊ธฐ ์ํด ํจ์ ํ์์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ useEffect
์ํ(state) ๋๋ ์ข
์๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์์กด์ฑ ๋ฉ์ปค๋์ฆ์ ํตํด ๋ด๋ถ์์ ์ ์ธํ ์ดํํธ๊ฐ ์ฌ์คํ ๋๋๋ก ํ๋ ๋ฐฉ๋ฒ ๋ง์ด๋ค. ์ด๋ฅผ ํตํด์ ์ปดํฌ๋ํธ ํจ์๊ฐ ์ฌ์คํ๋๋ฉด์ ๋งค๋ฒ ๋ฆฌํํธ ์ญ์ ๋ค์ ์ฌ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ฏธ์๋ฃ๋ ์ํ(state) ๋ณ๊ฒฝ ์์
์ด ๋น ์ง์์ด ์คํ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ์ดํํธ๋ ์ด ์ดํ์ ์คํ๋๊ธฐ์ ์ด๋ฐ ์์
์ด ์ํ๋ ๋๋ง๋ค ๊ฐ์ฅ ์ต์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๊ฒ ๋๋ค.useEffect
๋ฅผ ์ฌ์ฉํ๊ธฐ) ๋ํ ๊ธฐ์ตํด์ผ ํ๋ค.const exampleHandler = () => {
setFirstState(something1);
setSecondState(something2);
};
exampleHandler
ํจ์ ๋ด๋ถ์ ๋ ๊ฐ์ ์ํ(state) ๊ฐฑ์ ์ด ์ค์ผ์ค๋ง ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ์ปดํฌ๋ํธ ์ญ์ ์ฌ์คํ๋๊ณ ์ฌํ๊ฐ๋๋ค๋ ๊ฒ๋ ์๋ฏธํ๋ค. ์ฌ์ค ์ด๊ฒ๋ค์ ๋ฆฌ์กํธ๊ฐ ํ๋ ์ญํ ์ด ์๋๋ค. ์ด๋ ๊ฒ ๋ ๊ฐ์ ์ํ(state) ๊ฐฑ์ ์ด ๊ฐ์ ์ฝ๋ ์กฐ๊ฐ์ ์กด์ฌํ๋ค๋ฉด, ์ฆ ๊ฐ์ ํจ์๊ฐ ์๋ก ๋ค๋ฅธ ํ๋ก๋ฏธ์ค์ ์์ง ์๊ณ , ๊ฐ์ ๊ณณ์ ์กด์ฌํ๋ค๋ฉด ์ด ๋ ์ฌ์ด์ ์๊ฐ '์ง์ฐ'๊ณผ ๊ฐ์ ํ์์ ๋ฐ์ํ์ง ์๋๋ค.setFirstState(something1);
setSecondState(something2);
exampleHandler
)์ ์์นํ๊ณ ์ด ๋ ๋ชจ๋ ์ง๊ธ๊ณผ ๊ฐ์ด ์ํ(state) ๊ฐฑ์ ํจ์๋ฅผ ํธ์ถํ๋ค๋ฉด ๋ฆฌ์กํธ๋ ์ด๋ค์ ๋ํ ์ํ(state) ๊ฐฑ์ ์ ํ๋์ ๋๊ธฐํ ํ๋ก์ธ์ค์์ ๊ฐ์ด ์คํํ๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด์, ํ๋์ ํจ์๊ฐ ์ฒ์๋ถํฐ ๋๊น์ง ์ด๋ ํ ์ฝ๋ฐฑ์ด๋ ํ๋ก๋ฏธ์ค ์์ด ์คํ๋๋ค๋ฉด ๋ฆฌ์กํธ๋ ์ด ํจ์๋ก๋ถํฐ ๋ฐ์ํ๋ ๋ชจ๋ ์ํ(state) ๊ฐฑ์ ์์
์ ํ๋์ ์ํ(state) ๊ฐฑ์ ์์
์ผ๋ก ์ฒ๋ฆฌํ๋ค๋ ๋ป์ด๋ค.useCallback
์ฒ๋ผ ๋ ๋ค๋ฅธ ์ต์ ํ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ ์ ์๋ useMemo
ํ
์ ๋ํด์ ์์๋ณผ ๊ฒ์ด๋ค. ๊ทธ ์ ์ ๋จผ์ ์์ ์ ์ฝ๋์์ ์ฐ๋ฆฌ๊ฐ ์ด์ ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ธ useCallback
์ด ์ด๋ป๊ฒ ์ฌ์ฉ๋๊ณ ์๋์ง๋ฅผ ํ๋์ฉ ํ์ธํด๋ณผ ๊ฒ์ด๋ค.function App() {
const [listTitle, setListTitle] = useState("My List");
const changeTitleHandler = useCallback(() => {
setListTitle("New Title");
}, []);
return (
<div className="app">
<DemoList title={listTitle} items={[5, 3, 1, 10, 9]} />
<Button onClick={changeTitleHandler}>Change List Title</Button>
</div>
);
}
App
์ปดํฌ๋ํธ๋ฅผ ์ฒ์ฒํ ์ดํด๋ณด์. changeTitleHandler
ํจ์์์ ์ฌ์ฉํ๊ณ ์๋ useCallback
์ ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์๋ฅผ ์ ์ฅํ๋ฉฐ, ์ ์ฅ๋ ํจ์๋ฅผ ๋ค์ ์ฌ์คํํ๊ฑฐ๋ ์ฌํ๊ฐํ๋ ์ผ์ ์์กด์ฑ ๋ฐฐ์ด์ ์ํ ๋ณ๊ฒฝ์ ์ ์ธํ๊ณ ๋ ์๋๋ก ๋ง๋ค์ด์ค๋ค.<Button onClick={changeTitleHandler}>Change List Title</Button>
Button
์ปดํฌ๋ํธ์์ onClick props๋ฅผ ํตํด ํด๋น ํจ์๋ฅผ ์ ๋ฌํ๊ณ ์๋ค.export default React.memo(Button);
Button
์ปดํฌ๋ํธ๋ ๋ด๋ถ์ ์ผ๋ก React.memo
๋ฅผ ์ฌ์ฉํ๋ฉฐ useCallback
์ ํตํด ํจ์๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฒํผ์ props ๋ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฏ๋ก ์ด Button
์ปดํฌ๋ํธ๋ ๋ค์ ๋ ๋๋ง ๋์ง ์์ ๊ฒ์ด๋ค.const DemoList = (props) => {
const sortedList = props.items.sort((a, b) => a - b);
return (
<div className={classes.list}>
<h2>{props.title}</h2>
<ul>
{sortedList.map((item) => (
<li key={item}>{item}</li>
))}
</ul>
</div>
);
};
DemoList
์ปดํฌ๋ํธ๋ฅผ ํ์ธํด๋ณด๋ฉด, ๊ฐ๋จํ ๋ด์ฅ ์ ๋ ฌ ๋ฉ์๋(sort()
)๋ก ๋ฆฌ์คํธ๋ฅผ ์ ๋ฆฌํ ๊ฒ์ ์ ์ ์๋ค. ํ์ง๋ง ์ปดํฌ๋ํธ ๋ด๋ถ์ ์ด๋ฐ ๋ก์ง์ด ์๋ค๋ ๋ป์ ์ฑ๋ฅ ๋ฉด์์ ๋ฏผ๊ฐํ ์ ์๋ค๋ ๋ป์ด๊ธฐ๋ ํ๋ค. ๋ฌผ๋ก ์์ ์ฝ๋์ฒ๋ผ ๋ฆฌ์คํธ๊ฐ ์งง๋ค๋ฉด ์ ๋ ฌ ์๋ ์ญ์ ๋น ๋ฅด๊ฒ ์ง๋ง ๋ง์ฝ ๋ฆฌ์คํธ๊ฐ ๊ธธ๋ค๋ฉด ํน์ ๋ค๋ฅธ ์์
์ ์ํํ๋ ์ค์ด๋ผ๋ฉด ๋ถ๋ช
๊ธด ์๊ฐ์ ์์ํ๋ ๋ก์ง์ด ๋ ์๋ ์์ ๊ฒ์ด๋ค. ์ ์ฒด ์ปดํฌ๋ํธ๊ฐ ์ฌํ๊ฐ๋ ๋๋ง๋ค ์ด๋ฐ ๊ธด ์๊ฐ์ ์์ํ๋ ๋ก์ง์ ์คํํ๊ณ ์ถ์ง ์๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น? ์ด์ ์ ํ์ต์์ ๋ถํ์ํ ์ฌํ๊ฐ ๊ณผ์ ์ ํผํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ๋ค์ ์์๋ดค๋ค. React.memo
๊ฐ ๋ฐ๋ก ๊ทธ ์์ ์ค์ ํ๋์ผ ๊ฒ์ด๋ค.const DemoList = (props) => {
const sortedList = props.items.sort((a, b) => a - b);
return (
<div className={classes.list}>
<h2>{props.title}</h2>
<ul>
{sortedList.map((item) => (
<li key={item}>{item}</li>
))}
</ul>
</div>
);
};
export default React.memo(DemoList);
DemoList
์ปดํฌ๋ํธ๋ฅผ React.memo
๋ก ๊ฐ์ธ์ฃผ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ถํ์ํ ๋์์ ๋ง์ ์ ์์ ๊ฒ์ด๋ค. DemoList
์ปดํฌ๋ํธ ๋ด๋ถ์ ์ฝ์ ๋ก๊ทธ๋ก "DemoList RUNNING"๋ฅผ ์ถ๋ ฅํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ณ ๊ฐ๋ฐ์๋๊ตฌ์์ ํ ๋ฒ ํ์ธํด๋ณด์.๋น์ฐํ, ์ด๊ธฐ ํ๋ฉด์์๋ ์ด "DemoList RUNNING"๋ฅผ ํ์ธํ ์ ์๋ค. ์ฆ ๋ฆฌ์คํธ๊ฐ ์ ๋ ฌ๋์๋ค๋ ์๋ฏธ์ด๊ธฐ๋ ํ๋ค. ํ์ง๋ง ๊ทธ ๋ค์๋ ์คํ๋์ง ๋ง์์ผ ํ๋ค. ๋ฒํผ์ ๋๋ฅด๊ณ ํ์ด์ง์ ์ ๋ชฉ์ด ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ ๋ชฉ์ ๋ฆฌ์คํธ์ ์ผ๋ถ๋ถ์ด๋ค. ๋ฐ๋ผ์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด DemoList
์ปดํฌ๋ํธ๊ฐ ์ฌ์คํ๋๋ ๊ฒ์ด๋ค. props ์ ์ผ๋ถ๊ฐ ๋ฐ๋์๊ธฐ ๋๋ฌธ์ ์ ๋ชฉ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ ๋น์ฐํ ์ฌ์คํ ๋์ด์ผ ๋ง๋
ํ๋ค. ์ ๋ชฉ์ ์ค์ ๊ฐ์ ๋ณ๊ฒฝ์ด ์ผ์ด๋ฌ์ผ๋ฏ๋ก React.memo
๋ ์ ์ ์๋ํ๊ณ ์๋ ๊ฒ์ด๋ค. ์์ props์ ์ผ๋ถ๊ฐ ๋ฐ๋๊ณ ์ค์ ๊ฐ์ ๋ณ๊ฒฝ์ด ์ผ์ด๋ฌ๊ธฐ ๋๋ฌธ์ React.memo
๋ก ๊ฐ์ธ๋ ๋น์ฐํ ์ฌ์คํ์ ์ํํ๋ค.
๋ฌผ๋ก , ํ์ฌ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ(App
)๊ฐ ์ฌ๋ ๋๋ง ๋์์ผ๋ ์ธ์ ๋ ๋ค์ ์คํ์ด ๋๋ ๊ฒ์ด๋ค.
<DemoList title={listTitle} items={[5, 3, 1, 10, 9]} />
App
์ปดํฌ๋ํธ ๋ด๋ถ์ ์ฝ๋์์ DemoList
์ ์ ๋ฌํ๋ items
props์ ๋ฐฐ์ด์ด ๋ถ๋ชจ ์ปดํฌ๋ํธ(App
) ์ปดํฌ๋ํธ๊ฐ ์คํ๋ ๋๋ง๋ค ์ง์์ ์ผ๋ก ์ฌ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ ๋ชฉ์ด ๋ฐ๋์ง ์๋๋ผ๋ ์์ ๊ตฌ์ฑ ์ปดํฌ๋ํธ๊ฐ ์ฌํ ์ด์ ๋ก ์ฌ์คํ๋๋ฉด ์๋ก์ด ๋ฐฐ์ด([5, 3, 1, 10, 9]
)์ ์์ฑํ๊ธฐ ๋๋ฌธ์ DemoList
์ปดํฌ๋ํธ๋ ๋น์ฐํ ๋ค์ ์คํ๋๋ค. ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก, ๋ฐฐ์ด ์ญ์ ๊ฐ์ฒด์ด๊ณ ์ด ๊ฐ์ฒด๋ ์ฐธ์กฐ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ์ ๋ชฉ์ด ๋ฐ๋๋ค๋ ๊ฒ์ DemoList
๋ฅผ ๋ฆฌ๋น๋ ํด์ผ ํ๋ ํ๋นํ ์ด์ ๊ฐ ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ๊ณผ๊ฑฐ์ ํ๋ ๋ชจ๋ ์์
๋ค์ ๋ฐ๋ณตํ๊ณ ์ถ์ง ์์ ๋๋ ์๋ ๋ฒ์ด๋ค. ํนํ ๋ค์ ํด์ผ ํ ์์
์ด ์ฑ๋ฅ์ ๋ฏผ๊ฐํ ์์
์ด๋ผ๋ฉด ๋ง์ด๋ค. ๋ํ, ์ ๋ ฌ์ ์ปดํฌ๋ํธ์์ ์ํ ๊ฐ๋ฅํ ๋ํ์ ์ธ ์ฑ๋ฅ ์ง์ฝ์ ์์
์ค์ ํ๋์ด๋ค.
useCallback
์ ์ฌ์ฉํ์ฌ ํจ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ณ ์
๋ ฅ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ๋ฆฌ๋น๋ํ ์๋ ์๋ค. ๋ค๋ฅธ ์ข
๋ฅ์ ๋ฐ์ดํฐ์๋ ๋น์ทํ ์ญํ ์ ํ๋ ํ
์ด ์๋ค. ๋ฐ๋ก useMemo
์ด๋ค.useMemo
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฅ์ ํ ์ ์๋๋ฐ, useCallback
์ด ํจ์์ ๋ํ ๊ฒ์ ์ ์ฅํ๋ฏ์ด ๋ชจ๋ ์ข
๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.const sortedList = props.items.sort((a, b) => a - b);
useMemo
๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅํ๊ณ , ์ต์ ํ๋ฅผ ํ ๊ฒ์ด๋ค.const sortedList = useMemo(() => {
return props.items.sort((a, b) => a - b);
});
useMemo
๋ฅผ ํธ์ถํ์ฌ ํด๋น ์ ๋ ฌ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ตํ๊ฒ ํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ useMemo
์ ์ฒซ ๋ฒ์งธ ์ธ์์๋ ํจ์๊ฐ ๋ค์ด๊ฐ์ผ ํ๋ค. ์ด ๋ง์ธ ์ฆ์จ, useMemo
๊ฐ ํจ์๋ฅผ ๊ธฐ์ตํ๋๋ก ํ๋ ๊ฒ์ ์๋๋ฉฐ, ๋จ์ง ํจ์๊ฐ ์ ์ฅํ๊ณ ์ถ์ ๊ฒ์ ๋ฐํํ๊ณ ์ด ๋ฐํ๋ ๊ฒฐ๊ณผ ๊ฐ์ ์ ์ฅํ๋๋ก ํ ๋ฟ์ด๋ค. ์ด ๊ฒฝ์ฐ์๋ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ฐํํ ๊ฒ์ด๋ค.const sortedList = useMemo(() => {
return props.items.sort((a, b) => a - b);
}, []);
useCallback
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก useMemo
๋ ๋ ๋ฒ์งธ ์ธ์๊ฐ ํ์ํ๋ฐ, ์ด๋ ์ญ์ ์์กด์ฑ ๋ฐฐ์ด์ด๋ค. ์ด ์์กด์ฑ ๋ฐฐ์ด์ ํตํด ์ ์ฅ๋ ๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ธธ ๋๋ง๋ค useMemo
์ ์ ์ฅ๋ ๊ฐ์ ์
๋ฐ์ดํธํ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ณ ์๋ก์ด ๊ฐ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ์
๋ฐ์ดํธ ๋๋๋ก ํ ๊ฒ์ด๋ค.const sortedList = useMemo(() => {
return props.items.sort((a, b) => a - b);
}, [props]);
props
๋ฅผ ์ถ๊ฐํ ์๋ ์์ง๋ง(props
์ items
์ด๊ธฐ ๋๋ฌธ์ด๋ค.) ์ด๋ ์ ์ฒด props
๊ฐ์ฒด๊ฐ ์ฌ๊ธฐ์์์ ์์กด์ฑ ๊ฐ์ฒด๊ฐ ๋๋ฉฐ, ์ด๋ ํญ์ ์ฌ๊ณ์ฐ ๋๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ค.const { items } = props;
const sortedList = useMemo(() => {
return items.sort((a, b) => a - b);
}, [items]);
props
์์ ๊ฐ์ฒด ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ์ด์ฉํด์ items
๋ฅผ ๊บผ๋ด์ค๊ณ , ์ด๊ฒ์ useMemo
์ ์์กด์ฑ ๋ฐฐ์ด์ ์ถ๊ฐํ๋ค. props
๋ก items
๋ฅผ ์ง์ ๊บผ๋ด์์ ์ ๋ ฌํด์ฃผ์๋ ๋ก์ง๋ ๊ทธ๋ฅ items
๋ก ์์ ํด์ค๋ค. ์ด์ useMemo
์ ๋ก์ง์ ์์กด์ฑ ๋ฐฐ์ด์ธ items
์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ ๋๋ง ๋ฆฌ๋น๋๋ฅผ ์งํํ ๊ฒ์ด๋ค.const sortedList = useMemo(() => {
console.log("Items sorted");
return items.sort((a, b) => a - b);
}, [items]);
useMemo
๊ฐ ๋ฐํํ๋ ํจ์ ๋ด๋ถ์ "Items sorted"๋ฅผ ์ถ๋ ฅํ๋ ์ฝ์ ๋ก๊ทธ๋ฅผ ์ถ๊ฐํ๊ณ ์ ์ฅํ ๋ค ๊ฐ๋ฐ์ ๋๊ตฌ ์ฝ์์ ํ์ธํด๋ณด์.์๋ก ๊ณ ์นจ์ ํ๋ฉด ์ต์ด ์คํ์ด ๋๋ฉด์ "Items sorted"๋ฅผ ์ถ๋ ฅํ๋๋ฐ, ์ ๋ชฉ์ ๋ณ๊ฒฝํด๋ ์ฌ์ ํ "Items sorted"๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ ์ ์ ์๋ค. ์๊ฐ๋๋ก ๊ตฌ๋๋์ง ์๊ณ ์๋ ๊ฒ์ด๋ค. ์ ๊ทธ๋ด๊น?
์ด์ ์๋ ๋งํ๋ฏ์ด, useMemo
์ ์์กด์ฑ ๋ฐฐ์ด์ธ items
๊ฐ ๋ฐ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
<DemoList title={listTitle} items={[5, 3, 1, 10, 9]} />
items
๋ App
์ปดํฌ๋ํธ๊ฐ ์ฌ์คํ๋ ๋๋ง๋ค ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฐ์ด ์ญ์ ์ฌ์์ฑ ๋๋ค. ๊ทธ๋ฌ๋๊น ๊ธฐ์ ์ ์ผ๋ก๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๊ณ ๊ฐ์ ์์๋ก ๋ ๋น์ทํ ๋ฐฐ์ด์ด์ง๋ง, ๋ฉ๋ชจ๋ฆฌ์์์๋ ์๋ก์ด ๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์ ๋ดํฌํ ๊ฐ์ด ๊ฐ๋๋ผ๋ ๊ธฐ์กด ๋ฐฐ์ด๊ณผ ๋ค๋ฅธ ์๋ก์ด ๋ฐฐ์ด๋ก ์ทจ๊ธํ๋ค. ์ด ๋ฐฐ์ด์ด ์์ ์ฌ๋ฌ ๋ฒ ์ธ๊ธํ๋ ์ฐธ์กฐ ๊ฐ์ด๋ผ๋ ์ฌ์ค์ ์์ง ๋ง์์ผ ํ๋ค. ๋ฐ๋ผ์ ์ด์ ๋ถํ์ํ๊ฒ ์๋ก์ด ๋ฐฐ์ด์ ์ ๋ฌํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด์ ์ด ๋ฐฐ์ด์ useMemo
๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค.<DemoList title={listTitle} items={useMemo(() => [5, 3, 1, 10, 9], [])} />
useMemo
ํจ์๋ก ๋ฐฐ์ด์ ๋ํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋น ์์กด์ฑ ๋ฐฐ์ด์ ์ถ๊ฐํ๋ค. ์ด ๋น ์์กด์ฑ ๋ฐฐ์ด์ ๊ฐ์ ๋ณํจ์ด ์๋ค. ์ธ๋ถ ์์กด์ฑ์ด ์๊ณ ํ๋ ์ฝ๋ฉ๋์ด ์๋ค. ๋ฐ๋ผ์ useMemo
๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.const listItems = useMemo(() => [5, 3, 1, 10, 9], []);
useMemo
ํจ์๋ก ๋ํํ ๋ฐฐ์ด ๊ฐ์ ๋ณ์ listItems
์ ์ ์ฅํ๊ณ ,<DemoList title={listTitle} items={listItems} />
useMemo
๋๋ถ์ ์ ๋ฌ๋ ๋ฐฐ์ด์ด ์ฌ์ ๋ ฌ ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.useMemo
๋ useCallback
์ ๋นํด ์ฌ์ฉ๋น๋๊ฐ ๋ฎ์ ๊ฒ์ด๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ตํ๋ ๊ฒ๋ณด๋ค ํจ์๋ฅผ ๊ธฐ์ตํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๋์์ด ๋๋ฉฐ, ๋น๋์๋ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฌผ๋ก ๋ฐ์ดํฐ ์ฌ๊ณ์ฐ๊ณผ ๊ฐ์ ์ฑ๋ฅ ์ง์ฝ์ ์์
๋๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ผ ํ ํ์๋ ์์ผ๋, ์ด๋ฐ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ์ฌ์ฉํ ์ผ์ ์์ ๊ฒ์ด๋ค.useMemo
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ด๋ฉฐ ์ด๋ฐ useMemo
๋ฅผ ํตํ ํจ์ ์ ์ฅ ์ญ์ ์ผ์ ์ฑ๋ฅ์ ์ฌ์ฉํ๋ค๋ ๋ป์ด๊ธฐ๋ ํ๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ useMemo
๋ ์ฌ๋ฌ ์ฑ๋ฅ ๋ฉด์์ ๊ณ ๋ คํ์ฌ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ด๋ค. ๋ค๋ง ์ง๊ธ๊ณผ ๊ฐ์ด ๋ญ๊ฐ๋ฅผ ์ ๋ ฌํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์ดํ์ ์ปดํฌ๋ํธ ์
๋ฐ์ดํธ์์ ๋ถํ์ํ ์ ๋ ฌ์ ๋ง์ ์ ์์ผ๋ฏ๋ก useMemo
๋ฅผ ๊ณ ๋ คํด๋ณด๋ ๊ฒ๋ ๊ด์ฐฎ์ ๊ฒ์ด๋ค.๐จ ํด๋น ํฌ์คํ ์ Udemy์ โReact ์๋ฒฝ ๊ฐ์ด๋โ ๊ฐ์๋ฅผ ๋ฒ ์ด์ค๋ก ํ ๊ธฐ๋ก์ ๋๋ค.
โ๐ป ๊ฐ์ git repo ๋ฐ๋ก๊ฐ๊ธฐ