Hook
Hook ( ๊ฐ๊ณ ๋ฆฌ )
: ๋พฐ์กฑํ๊ณ ๊ตฌ๋ถ๋ฌ์ง ๋ ๋ก ๋ค๋ฅธ ๋ฌผ์ฒด์ ๊ฑธ์ด ์ฐ๊ฒฐํ๋ ๋๊ตฌ
๊ฐ๊ณ ๋ฆฌ๋ ๋ฌผ๊ฑด์ ์ก๊ฑฐ๋ ๊ฑธ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋๊ตฌ์
๋๋ค. hook์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์์ ์ํ๋ ๋ผ์ดํ์ฌ์ดํด์ ์ก๊ฑฐ๋ ๊ฑธ์ด์ ์ฌ์ฉํ ์ ์๋ ๋๊ตฌ๋ผ๋ ์๋ฏธ์์ ์ ๋๋์์ต๋๋ค.
์ปดํฌ๋ํธ์์ ์ํ์ ๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ๋ฅผ ์ํ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ์ ๊ณตํ๋ API
hook ์ข ๋ฅ
โข
์ํ ๊ด๋ฆฌ์ฉ hook
โข
๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ์ฉ hook
โข
๊ธฐํ hook
์ํ๊ด๋ฆฌ hook
์ด๋ฆ | ์ค๋ช
|
useState() | ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ธฐ๋ณธ hook์
๋๋ค. |
useReducer() | ์ํ๋ฅผ ๋ณต์กํ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํ hook์
๋๋ค. |
useContext() | ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ์์ ์ปดํฌ๋ํธ์์ ๊ณต์ ํ๊ธฐ ์ํ hook์
๋๋ค. |
๋ผ์ดํ์ฌ์ดํด hook
์ด๋ฆ | ์ค๋ช
|
useEffect() | ์ปดํฌ๋ํธ์ ๋ผ์ดํ์ฌ์ดํด ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ hook์
๋๋ค. |
useLayoutEffect() | ์ปดํฌ๋ํธ์ ๋ ์ด์์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ hook์
๋๋ค. |
useRef() | ์ปดํฌ๋ํธ์ DOM ์์๋ ๋ฆฌ์กํธ ํ
์ ์ํ๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํ hook์
๋๋ค. |
๊ธฐํ hook
์ด๋ฆ | ์ค๋ช
|
useMemo() | ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ๊ฐ์ ๊ณ์ฐํ์ง ์๊ณ , ์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ hook์
๋๋ค. |
useCallback() | ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ํจ์๋ฅผ ์ฌ์คํํ์ง ์๊ณ , ์ด์ ์ ์คํํ ํจ์๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ hook์
๋๋ค. |
useImperativeHandle() | ์ปดํฌ๋ํธ์ ์ํ๋ ๋ผ์ดํ์ฌ์ดํด์ imperativeํ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํ hook์
๋๋ค. |
hook ์ด ๋์ ๋ ์ด์
ํจ์ํ ์ปดํฌ๋ํธ์์ ์ํ ๋ฐ ๋ผ์ดํ์ฌ์ดํด ๊ด๋ จ ๋ก์ง์ ๋ ๊ฐํธํ๊ฒ ์์ฑํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํจ์
๋๋ค. ์ด์ ์๋ ํด๋์คํ ์ปดํฌ๋ํธ์์๋ง ์ํ(state) ๋ฐ ๋ผ์ดํ์ฌ์ดํด ๊ด๋ จ ๋ก์ง์ ๋ค๋ฃฐ ์ ์์์ง๋ง, Hooks๊ฐ ๋์
๋๋ฉด์ ํจ์ํ ์ปดํฌ๋ํธ์์๋ ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ต๋๋ค.
hook ์ฅ์
hook์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค.
โข
๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋
์ฑ ์๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
โข
์ํ ๊ด๋ฆฌ์ ๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ๋ฅผ ๋ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
โข
๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๋ ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
hook์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ๊ฐ๋ฐ์ ๋ณด๋ค ํธ๋ฆฌํ๊ณ ํจ์จ์ ์ผ๋ก ํ ์ ์๋๋ก ํด์ฃผ๋ ์ ์ฉํ ๊ธฐ๋ฅ์
๋๋ค.
ํด๋์ค ์ปดํฌ๋ํธ์ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋ vs hooks
Class Component
Lifecycle Method | Hooks |
componentDidMount | useEffect(() => {}, []) |
componentDidUpdate | useEffect(() => {}, [/* dependency array */]) |
componentWillUnmount | useEffect(() => { return () => {} }, []) |
getDerivedStateFromProps | useState๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ์
๋ฐ์ดํธ` |
shouldComponentUpdate | ์ต์ ํ ๊ธฐ์ ์ฌ์ฉ (์: React.memo) |
getSnapshotBeforeUpdate | useEffect ๋๋ useLayoutEffect ๋ฑ์ ์ฌ์ฉํ์ฌ DOM ์ํ ์ฒ๋ฆฌ` |
componentDidMount
โข
Class Component
componentDidMount() {
// ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ ์คํ๋๋ ์ฝ๋
}
JavaScript
๋ณต์ฌ
โข
Functional Component (hook)
useEffect(() => {
// ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ ์คํ๋๋ ์ฝ๋
}, []);
JavaScript
๋ณต์ฌ
componentDidUpdate
โข
Class Component
componentDidUpdate(prevProps, prevState) {
// ์ปดํฌ๋ํธ๊ฐ ์
๋ฐ์ดํธ๋ ๋ ์คํ๋๋ ์ฝ๋
}
JavaScript
๋ณต์ฌ
โข
Functional Component (hook)
useEffect(() => {
// ์ปดํฌ๋ํธ๊ฐ ์
๋ฐ์ดํธ๋ ๋ ์คํ๋๋ ์ฝ๋
}, [/* dependency array */]);
JavaScript
๋ณต์ฌ
componentWillUnmount
โข
Class Component
componentWillUnmount() {
// ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋ ๋ ์คํ๋๋ ์ฝ๋
}
JavaScript
๋ณต์ฌ
โข
Functional Component (hook)
useEffect(() => {
return () => {
// ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋ ๋ ์คํ๋๋ ์ฝ๋
};
}, []);
JavaScript
๋ณต์ฌ
getDerivedStateFromProps
โข
Class Component
static getDerivedStateFromProps(nextProps, nextState) {
// props๋ก๋ถํฐ ํ์๋ ์ํ๋ฅผ ์
๋ฐ์ดํธ
return null;
}
JavaScript
๋ณต์ฌ
โข
Functional Component (hook)
useState()
JavaScript
๋ณต์ฌ
shouldComponentUpdate
โข
Class Component
shouldComponentUpdate(nextProps, nextState) {
// ์ปดํฌ๋ํธ ์
๋ฐ์ดํธ ์ฌ๋ถ๋ฅผ ๊ฒฐ์
return true; // ๋๋ false
}
JavaScript
๋ณต์ฌ
โข
Functional Component (hook)
React.memo ๋ฅผ ํตํ ์ต์ ํ
JavaScript
๋ณต์ฌ
getSnapshotBeforeUpdate
โข
Class Component
getSnapshotBeforeUpdate(prevProps, prevState) {
// ์ปดํฌ๋ํธ ์
๋ฐ์ดํธ ์ ์ DOM ์ํ๋ฅผ ์บก์ฒ
return null;
}
JavaScript
๋ณต์ฌ
โข
Functional Component (hook)
useEffect์ useLayoutEffect ๋ฑ์ ํ์ฉํ์ฌ DOM ์ํ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
JavaScript
๋ณต์ฌ
์ useEffect ๊ฐ 2๋ฒ ํธ์ถ๋๋์?
StrictMode ์ธ ๊ฒฝ์ฐ, useEffect() ์ 2๋ฒ ํธ์ถ๋๋ ํ์์ด ์์ต๋๋ค.
StrictMode์์ useEffect๊ฐ ๋ ๋ฒ ํธ์ถ๋๋ ๊ฒ์ ๋ง์ผ๋ ค๋ฉด, ํด๋ก์ ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ์ state๋ props๋ฅผ ์ฐธ์กฐํ์ง ์๋๋ก ํด์ผ ํฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
โข
useEffect ๊ฐ 2๋ฒ ํธ์ถ๋๋ ํ์์ ํด๊ฒฐํ๋ ค๋ฉด ์๋ 2๊ฐ์ง ๋ฐฉ๋ฒ ์ค 1๊ฐ์ง๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๋ค๋ง, ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
์ด์
StrictMode
StrictMode๋ React์ ์ฝ๋ ์คํ์ผ์ ๋ณด๋ค ์๊ฒฉํ๊ฒ ๊ฒ์ฌํ๋ ๋ชจ๋์
๋๋ค. StrictMode๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ด ์์ต๋๋ค.
โข
์ฝ๋์ ์ผ๊ด์ฑ์ ๋์ด๊ณ ๋ฒ๊ทธ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
โข
์ฝ๋์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
โข
์ฝ๋์ ํ
์คํธ ๊ฐ๋ฅ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
StrictMode๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
โข
๋ ๋๋ง ๋จ๊ณ์ ๋ถ์์ฉ ๊ฒ์ฌ
โข
ํด๋์ค ์ปดํฌ๋ํธ์ ์์ ํ์ง ์์ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋ ๊ฒ์ฌ
โข
useState(),ย useEffect(),ย useContext()ย ํ
์ ๋ถ์ ์ ํ ์ฌ์ฉ ๊ฒ์ฌ
โข
๋ฆฌ์กํธ API์ ์๋ชป๋ ์ฌ์ฉ ๊ฒ์ฌ
StrictMode๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋์ React.StrictMode ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
import React, { StrictMode } from "react";
function App() {
return (
<StrictMode>
// StrictMode ์๋์ ์๋ ์ปดํฌ๋ํธ๊ฐ ๊ฒ์ฌ๋ฉ๋๋ค.
<MyComponent />
</StrictMode>
);
}
JavaScript
๋ณต์ฌ
ํ์ ํ์ธ
const App = () => {
const [count, setCount] = useState(0);
useEffect(() => {
// ํ์ด๋จธ๋ฅผ ์ค์ ํฉ๋๋ค.
setInterval(() => setCount(count + 1), 1000);
}, [count]);
return (
<div>
<h1>ํ์ฌ ์นด์ดํธ: {count}</h1>
</div>
);
};
JavaScript
๋ณต์ฌ
์ด ์ฝ๋์์๋ incrementCount ํจ์๋ฅผ ํด๋ก์ ๋ก ์์ฑํ์ง ์์ต๋๋ค. ๋์ , setInterval() ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ ์ฝ๋ฐฑ ํจ์์์ count ๋ณ์์ ์ง์ ์ ๊ทผํฉ๋๋ค. ๋ฐ๋ผ์, useEffect()๊ฐ ๋ ๋ฒ ํธ์ถ๋ ๋๋ง๋ค count ๋ณ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
(
ํ์ ํด๊ฒฐ ๋ด์ฉ ์์ ์ค )
ํ์ ํด๊ฒฐ
const App = () => {
const [count, setCount] = useState(0);
useEffect(() => {
// ํด๋ก์ ๋ฅผ ์ปดํฌ๋ํธ์ props๋ก ์ด๋ํฉ๋๋ค.
const incrementCount = () => setCount(count + 1);
// ์ฝ๋ฐฑ ํจ์์์ ํด๋ก์ ๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
return () => {
clearInterval(incrementCount);
};
}, [count]);
return (
<div>
<h1>ํ์ฌ ์นด์ดํธ: {count}</h1>
</div>
);
};
JavaScript
๋ณต์ฌ
ํด๋ก์ (closure) ๋?
ํด๋ก์ ๋ ํจ์์ ๊ทธ ํจ์๊ฐ ์ ์ธ๋ ํ๊ฒฝ์ ํจ๊ป ๋ฌถ์ ๊ฒ์
๋๋ค. ํด๋ก์ ๋ ํจ์๊ฐ ์ ์ธ๋ ํ๊ฒฝ์ ๋ณ์์ ์ ๊ทผํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
function outer() {
const inner = () => {
// inner ํจ์๋ outer ํจ์๊ฐ ์ ์ธ๋ ํ๊ฒฝ์ count ๋ณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
const count = 10;
return count;
};
return inner;
}
const closure = outer();
const result = closure();
console.log(result); // 10
JavaScript
๋ณต์ฌ
์ ์ฝ๋์์๋ outer() ํจ์์์ inner() ํจ์๋ฅผ ๋ฐํํฉ๋๋ค. inner() ํจ์๋ outer() ํจ์๊ฐ ์ ์ธ๋ ํ๊ฒฝ์ count ๋ณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค. closure ๋ณ์๋ outer() ํจ์์ ๋ฐํ๊ฐ์ธ inner() ํจ์๋ฅผ ์ฐธ์กฐํฉ๋๋ค. result ๋ณ์๋ closure() ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ฐํ๋ ๊ฐ์ ์ ์ฅํฉ๋๋ค.
ํด๋ก์ ๋ ๋ค์๊ณผ ๊ฐ์ ์ฉ๋๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
โข
ํจ์์ ๋ด๋ถ ์ํ๋ฅผ ์ ์งํฉ๋๋ค.
โข
๊ณ ์ฐจ ํจ์์์ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋ ํจ์์ ํ๊ฒฝ์ ์ ์งํฉ๋๋ค.
โข
์ฝ๋ฐฑ ํจ์์์ ์ธ๋ถ ํ๊ฒฝ์ ๋ณ์์ ์ ๊ทผํฉ๋๋ค.
ํด๋ก์ ๋ฅผ ์ฌ์ฉํ ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ์ฌํญ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
โข
ํด๋ก์ ๋ ํจ์๊ฐ ์ ์ธ๋ ํ๊ฒฝ์ ๋ณ์์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์, ๋ณ์์ ๋ฒ์๋ฅผ ์ ์ดํดํด์ผ ํฉ๋๋ค.
โข
ํด๋ก์ ๋ ๋ฉ๋ชจ๋ฆฌ ๋์์ ์์ธ์ด ๋ ์ ์์ผ๋ฏ๋ก, ์ฌ์ฉ์ด ์๋ฃ๋ ํ์๋ ์ญ์ ํด์ผ ํฉ๋๋ค.
useState()
๋ฆฌ์กํธ ํจ์ ์ปดํฌ๋ํธ์์ ์ํ ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ ํ
โข
์ํ ๊ฐ์ ์ ์ฅํ๊ณ , ์ํ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋งํฉ๋๋ค.
โข
useState๋ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค.
โฆ
์ฒซ ๋ฒ์งธ ์ธ์๋ ์ํ ๊ฐ์ ์ด๊น๊ฐ์
๋๋ค.
โฆ
๋ ๋ฒ์งธ ์ธ์๋ ์ํ ๊ฐ์ ๋ณ๊ฒฝํ๋ ํจ์์
๋๋ค.
๋ฌธ๋ฒ
const [์ํ, ์ํ๋ณ๊ฒฝํจ์] = useState(์ด๊ธฐ๊ฐ);
JavaScript
๋ณต์ฌ
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<button onClick={() => setCount(count + 1)}>+</button>
<button onClick={() => setCount(count - 1)}>-</button>
<p>{count}</p>
</div>
);
}
JavaScript
๋ณต์ฌ
useEffect()
๋ฆฌ์กํธ ํจ์ ์ปดํฌ๋ํธ์ ์๋ช
์ฃผ๊ธฐ์ ๊ด๋ จ๋ ์์
์ ์ํํ ์ ์๋ ํ
โข
์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋๊ฑฐ๋ ์ธ๋ง์ดํธ๋ ๋, ์ํ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ๋ฑ ํน์ ์์ ์ ์์
์ ์ํํ ์ ์์ต๋๋ค.
โข
useEffect๋ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค.
โฆ
์ฒซ ๋ฒ์งธ ์ธ์๋ ์์
์ ์ํํ๋ ํจ์์
๋๋ค.
โฆ
๋ ๋ฒ์งธ ์ธ์๋ ์์
์ ์ํํ ๋ ์ฐธ์กฐํด์ผ ํ๋ ์์กด์ฑ ๋ฐฐ์ด์
๋๋ค.
๋ฌธ๋ฒ
useEffect( () => {
// ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ์ดํ ์คํ
// ์ถ๊ฐ์ ์ผ๋ก, ์์กด์ฑ ๋ฐฐ์ด์ ๋ฐ๋ผ์ ์คํ๋จ
return () => {
// ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ ๋๊ธฐ ์ ์ ์คํ๋จ
}
}, ์์กด์ฑ๋ฐฐ์ด );
JavaScript
๋ณต์ฌ
1.
์์กด์ฑ ๋ฐฐ์ด์ [ ] ๋น ๋ฐฐ์ด๋ก ์ง์ ํ ๊ฒฝ์ฐ
2.
์์กด์ฑ ๋ฐฐ์ด์ ๋ณ์๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ
3.
์์กด์ฑ ๋ฐฐ์ด์ ์๋ตํ ๊ฒฝ์ฐ
์์กด์ฑ ๋ฐฐ์ด์ [ ] ๋น ๋ฐฐ์ด๋ก ์ง์ ํ ๊ฒฝ์ฐ
์ปดํฌ๋ํธ ๋ง์ดํธ์ ์ธ๋ง์ดํธ ์, useEffect() ๊ฐ ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
// ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ/์ธ๋ง์ดํธ ์ ํ ๋ฒ๋ง ์คํ
}, []);
return (
<div>
<button onClick={() => setCount(count + 1)}>+</button>
<button onClick={() => setCount(count - 1)}>-</button>
<p>{count}</p>
</div>
);
}
JavaScript
๋ณต์ฌ
์์กด์ฑ ๋ฐฐ์ด์ ๋ณ์๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ
์์กด์ฑ ๋ณ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค useEffect() ๊ฐ ์คํ๋ฉ๋๋ค.
function Counter() {
const [count, setCount] = useState(0);
const id = 1;
useEffect(() => {
// id์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ
}, [id]);
return (
<div>
<button onClick={() => setCount(count + 1)}>+</button>
<button onClick={() => setCount(count - 1)}>-</button>
<p>{count}</p>
</div>
);
}
JavaScript
๋ณต์ฌ
์์กด์ฑ ๋ฐฐ์ด์ ์๋ตํ ๊ฒฝ์ฐ
์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋๋ง๋ค, ์ํ๊ฐ ์
๋ฐ์ดํธ๋ ๋๋ง๋ค useEffect() ๊ฐ ์คํ๋ฉ๋๋ค.
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
// ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋๋ง๋ค, ๊ทธ๋ฆฌ๊ณ ์ํ๊ฐ ์
๋ฐ์ดํธ ๋ ๋๋ง๋ค ์คํ
});
return (
<div>
<button onClick={() => setCount(count + 1)}>+</button>
<button onClick={() => setCount(count - 1)}>-</button>
<p>{count}</p>
</div>
);
}
JavaScript
๋ณต์ฌ
๋ฉ๋ชจ์ด์ ์ด์ ์ด๋?
๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ๋์ผํ ์
๋ ฅ์ ๋ํด,
๋ค์ ๊ณ์ฐํ์ง ์๊ณ ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ์ต์ ํ ๊ธฐ๋ฒ
useMemo()
๋ฆฌ์กํธ ํจ์ ์ปดํฌ๋ํธ์์ ๊ณ์ฐ ๋น์ฉ์ด ๋์ ๊ฐ์ ๋ฉ๋ชจ์ด์ ์ด์
ํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ๋ ํ
โข
์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ๋ถํ์ํ ๊ณ์ฐ์ ๋ฐฉ์งํ๊ณ , ์ด์ ์ ๊ณ์ฐ๋ ๊ฐ์ ์ฌ์ฌ์ฉํฉ๋๋ค.
โข
useMemo๋ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค.
โฆ
์ฒซ ๋ฒ์งธ ์ธ์๋ ๋ฉ๋ชจ์ด์ ์ด์
ํ ๊ฐ์ ๊ณ์ฐํ๋ ํจ์์
๋๋ค.
โฆ
๋ ๋ฒ์งธ ์ธ์๋ ๊ฐ์ ๋ค์ ๊ณ์ฐํ ๋ ์ฐธ์กฐํด์ผ ํ๋ ์์กด์ฑ ๋ฐฐ์ด์
๋๋ค.
๋ฌธ๋ฒ
const ๋ฉ๋ชจ์ด์ ์ด์
๋๊ฐ = useMemo(() => {
// ๊ณ์ฐ ๋น์ฉ์ด ๋์ ์ฐ์ฐ
return ๊ณ์ฐ๋๊ฐ;
}, ์์กด์ฑ๋ฐฐ์ด);
JavaScript
๋ณต์ฌ
1.
์์กด์ฑ ๋ฐฐ์ด์ [ ] ๋น ๋ฐฐ์ด๋ก ์ง์ ํ ๊ฒฝ์ฐ
2.
์์กด์ฑ ๋ฐฐ์ด์ ๋ณ์๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ
3.
์์กด์ฑ ๋ฐฐ์ด์ ์๋ตํ ๊ฒฝ์ฐ
์์กด์ฑ ๋ฐฐ์ด์ [ ] ๋น ๋ฐฐ์ด๋ก ์ง์ ํ ๊ฒฝ์ฐ
์ปดํฌ๋ํธ ๋ง์ดํธ ์ ํ ๋ฒ๋ง ๊ฐ์ ๊ณ์ฐํ๊ณ , ์ดํ ๋ฆฌ๋ ๋๋ง ์์๋ ๋ฉ๋ชจ์ด์ ์ด์
๋ ๊ฐ์ ์ฌ์ฌ์ฉํฉ๋๋ค.
function ExpensiveComponent() {
const [count, setCount] = useState(0);
const expensiveValue = useMemo(() => {
// ์ปดํฌ๋ํธ ๋ง์ดํธ ์ ํ ๋ฒ๋ง ๊ณ์ฐ
return heavyCalculation();
}, []);
return (
<div>
<button onClick={() => setCount(count + 1)}>+</button>
<p>{count}</p>
<p>{expensiveValue}</p>
</div>
);
}
JavaScript
๋ณต์ฌ
์์กด์ฑ ๋ฐฐ์ด์ ๋ณ์๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ
์์กด์ฑ ๋ณ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๊ฐ์ ๋ค์ ๊ณ์ฐํฉ๋๋ค.
function ExpensiveComponent() {
const [count, setCount] = useState(0);
const [multiplier, setMultiplier] = useState(2);
const calculatedValue = useMemo(() => {
// multiplier์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ค์ ๊ณ์ฐ
return count * multiplier;
}, [multiplier]);
return (
<div>
<button onClick={() => setCount(count + 1)}>+</button>
<button onClick={() => setMultiplier(multiplier + 1)}>๋ฐฐ์ ์ฆ๊ฐ</button>
<p>{count}</p>
<p>{calculatedValue}</p>
</div>
);
}
JavaScript
๋ณต์ฌ
์์กด์ฑ ๋ฐฐ์ด์ ์๋ตํ ๊ฒฝ์ฐ
์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ๊ฐ์ ๋ค์ ๊ณ์ฐํฉ๋๋ค. (๋ฉ๋ชจ์ด์ ์ด์
ํจ๊ณผ๊ฐ ์์ต๋๋ค.)
function ExpensiveComponent() {
const [count, setCount] = useState(0);
const calculatedValue = useMemo(() => {
// ๋งค ๋ฆฌ๋ ๋๋ง๋ง๋ค ๋ค์ ๊ณ์ฐ (useMemo ์ฌ์ฉ ์๋ฏธ๊ฐ ์์)
return heavyCalculation(count);
});
return (
<div>
<button onClick={() => setCount(count + 1)}>+</button>
<p>{count}</p>
<p>{calculatedValue}</p>
</div>
);
}
JavaScript
๋ณต์ฌ
useCallback()
๋ฆฌ์กํธ ํจ์ ์ปดํฌ๋ํธ์์ ํจ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํ์ฌ ๋ถํ์ํ ์ฌ์์ฑ์ ๋ฐฉ์งํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ๋ ํ
โข
์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ํจ์๊ฐ ์๋ก ์์ฑ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ , ์ด์ ์ ์์ฑ๋ ํจ์๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
โข
useCallback์ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค.
โฆ
์ฒซ ๋ฒ์งธ ์ธ์๋ ๋ฉ๋ชจ์ด์ ์ด์
ํ ํจ์์
๋๋ค.
โฆ
๋ ๋ฒ์งธ ์ธ์๋ ํจ์๋ฅผ ๋ค์ ์์ฑํ ๋ ์ฐธ์กฐํด์ผ ํ๋ ์์กด์ฑ ๋ฐฐ์ด์
๋๋ค.
๋ฌธ๋ฒ
const ๋ฉ๋ชจ์ด์ ์ด์
๋ํจ์ = useCallback(() => {
// ์คํํ ํจ์ ๋ก์ง
}, ์์กด์ฑ๋ฐฐ์ด);
JavaScript
๋ณต์ฌ
1.
์์กด์ฑ ๋ฐฐ์ด์ [ ] ๋น ๋ฐฐ์ด๋ก ์ง์ ํ ๊ฒฝ์ฐ
2.
์์กด์ฑ ๋ฐฐ์ด์ ๋ณ์๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ
3.
์์กด์ฑ ๋ฐฐ์ด์ ์๋ตํ ๊ฒฝ์ฐ
์์กด์ฑ ๋ฐฐ์ด์ [ ] ๋น ๋ฐฐ์ด๋ก ์ง์ ํ ๊ฒฝ์ฐ
์ปดํฌ๋ํธ ๋ง์ดํธ ์ ํ ๋ฒ๋ง ํจ์๋ฅผ ์์ฑํ๊ณ , ์ดํ ๋ฆฌ๋ ๋๋ง ์์๋ ๋ฉ๋ชจ์ด์ ์ด์
๋ ํจ์๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
function Counter() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
// ์ปดํฌ๋ํธ ๋ง์ดํธ ์ ํ ๋ฒ๋ง ์์ฑ
console.log('Button clicked');
}, []);
return (
<div>
<button onClick={handleClick}>Click</button>
<button onClick={() => setCount(count + 1)}>+</button>
<p>{count}</p>
</div>
);
}
JavaScript
๋ณต์ฌ
์์กด์ฑ ๋ฐฐ์ด์ ๋ณ์๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ
์์กด์ฑ ๋ณ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํจ์๋ฅผ ๋ค์ ์์ฑํฉ๋๋ค.
function Counter() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
// count์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ค์ ์์ฑ
console.log('Current count:', count);
}, [count]);
return (
<div>
<button onClick={handleClick}>Show Count</button>
<button onClick={() => setCount(count + 1)}>+</button>
<p>{count}</p>
</div>
);
}
JavaScript
๋ณต์ฌ
์์กด์ฑ ๋ฐฐ์ด์ ์๋ตํ ๊ฒฝ์ฐ
์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ํจ์๋ฅผ ๋ค์ ์์ฑํฉ๋๋ค. (๋ฉ๋ชจ์ด์ ์ด์
ํจ๊ณผ๊ฐ ์์ต๋๋ค.)
function Counter() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
// ๋งค ๋ฆฌ๋ ๋๋ง๋ง๋ค ๋ค์ ์์ฑ (useCallback ์ฌ์ฉ ์๋ฏธ๊ฐ ์์)
console.log('Button clicked');
});
return (
<div>
<button onClick={handleClick}>Click</button>
<button onClick={() => setCount(count + 1)}>+</button>
<p>{count}</p>
</div>
);
}
JavaScript
๋ณต์ฌ
useRef()
๋ฆฌ์กํธ ํจ์ ์ปดํฌ๋ํธ์์ DOM ์์๋ ๊ฐ์ ์ฐธ์กฐํ๊ณ , ๋ฆฌ๋ ๋๋ง ์์ด ๊ฐ์ ์ ์งํ ์ ์๋ ํ
โข
useRef๋ .current ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ๋ณ๊ฒฝ ๊ฐ๋ฅํ ref ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
โข
ref ๊ฐ์ฒด์ .current ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋์ง ์์ต๋๋ค.
โข
useRef๋ ํ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค.
โฆ
์ด๊ธฐ๊ฐ: ref ๊ฐ์ฒด์ .current ํ๋กํผํฐ์ ์ค์ ๋ ์ด๊ธฐ๊ฐ์
๋๋ค.
๋ฌธ๋ฒ
const ref๊ฐ์ฒด = useRef(์ด๊ธฐ๊ฐ);
JavaScript
๋ณต์ฌ
1.
DOM ์์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ
2.
๊ฐ์ ์ ์งํ๋ ๊ฒฝ์ฐ (๋ฆฌ๋ ๋๋ง ๋ฐฉ์ง)
3.
์ด์ ๊ฐ์ ์ถ์ ํ๋ ๊ฒฝ์ฐ
DOM ์์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ
useRef๋ฅผ ์ฌ์ฉํ์ฌ DOM ์์์ ์ง์ ์ ๊ทผํ๊ณ ์กฐ์ํ ์ ์์ต๋๋ค.
function TextInput() {
const inputRef = useRef(null);
const focusInput = () => {
// DOM ์์์ ์ ๊ทผํ์ฌ ํฌ์ปค์ค ์ค์
inputRef.current.focus();
};
return (
<div>
<input ref={inputRef} type="text" />
<button onClick={focusInput}>Focus Input</button>
</div>
);
}
JavaScript
๋ณต์ฌ
๊ฐ์ ์ ์งํ๋ ๊ฒฝ์ฐ (๋ฆฌ๋ ๋๋ง ๋ฐฉ์ง)
useRef๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ์ฅํ๋, ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋์ง ์์ต๋๋ค.
function Counter() {
const [count, setCount] = useState(0);
const renderCount = useRef(0);
renderCount.current += 1;
return (
<div>
<button onClick={() => setCount(count + 1)}>+</button>
<p>Count: {count}</p>
<p>Render Count: {renderCount.current}</p>
</div>
);
}
JavaScript
๋ณต์ฌ
์ด์ ๊ฐ์ ์ถ์ ํ๋ ๊ฒฝ์ฐ
useRef๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ์ํ ๊ฐ์ ์ถ์ ํ๊ณ ๋น๊ตํ ์ ์์ต๋๋ค.
function Counter() {
const [count, setCount] = useState(0);
const prevCount = useRef();
useEffect(() => {
// ํ์ฌ count๋ฅผ ์ด์ ๊ฐ์ผ๋ก ์ ์ฅ
prevCount.current = count;
}, [count]);
return (
<div>
<button onClick={() => setCount(count + 1)}>+</button>
<p>Current Count: {count}</p>
<p>Previous Count: {prevCount.current}</p>
</div>
);
}
JavaScript
๋ณต์ฌ




