useEffect vs useMemo vs useCallback vs useRef vs React.memo
๐ฆ ์ก๋์ฌ๋
ํ๋์ ํค์๋๋ฅผ ์ก๊ณ ์ข ํธํ๊ฒ ์ ๋ฆฌํ๊ณ ์ถ์ด ๋ง๋ ์ก๋์ฌ๋
์ก๋์ฌ๋๋ ์กฐ์ ํ๊ธฐ ํ์
์์ ๋ณต
์ด ํธ์ฐฌํ์ก๋์ฐ์ด(้ๅๆฃ็ฐ)
์์ ์ ๋๋ ๋ง์ด๋ค.
์ก๋์ฐ์ด๋์ก๊ธฐ(้่จ)
์ ํํ๋ฅผ ๋น๋ ค์จ ์ฑ ์ผ๋ก ๊ตฌ์ฒด์ ์ธ ์ฒด๊ณ๊ฐ ์กํ์์ง ์์ ํ์์ด๋ค.
ํญ๋ชฉ์ด ๋ค์ ๋์กํ๊ณ ๋ด์ฉ์ ๊ตฌ๋ถ์ด ํผ๋๋์ด์๋ค๊ณ ํ๋ค. ๐คฃ
๐๏ธ useEffect vs useMemo vs useCallback vs useRef vs React.memo
- ํ ๋ค์ ๋ค์ ๋ณต์ตํ๋๋ฐโฆ ์ด ๋ ์๋ค ์ ๋ง ๋ฌํ๊ฒ ์์ฃผ ๋ฌํ๊ฒ ๋ค๋ฅด๋ค.
- ๊ฐ๊ฐ์ ๋ชฉ์ ๊ทธ๋ฆฌ๊ณ ์ด๋ฆ์ ๋ด๊ธด ์๋ฏธ, ํ์ฉ์ ๊ฐ๋จํ๊ฒ ๊ธฐ๋กํด๋๋ ค ํ๋ค.
useEffect
- ์ฌ๊ธฐ์ Effect๋
Side Effect
๋ฅผ ์๋ฏธํ๋ค. - ๋ฆฌ์กํธ๋ ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฌผ์ ํ๋ฉด์ ๋ฐ์ํ๋ ๊ฒ์ด ์ฃผ๋ชฉ์ ์ด๋ค.
- ์ด ๋, ๋ ๋๋ง๊ณผ ๋ฌด๊ดํ ์์
๋ค์
Side Effect
๋ผ๊ณ ํ ์ ์๋ค. useEffect
๋ ์ด๋ฌํSide Effect
๋ฅผ ์ํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.- ์๋ฅผ ๋ค์ด
useEffect
๋ฅผ ์ฌ์ฉํ์ฌfetch
์์ฒญ์ ๋ณด๋ด๊ฑฐ๋,๋ก๊ทธ
๋ฅผ ๋จ๊ธฐ๊ฑฐ๋,ํ์ด๋จธ
๋ฅผ ์ค์ ํ ์ ์๋ค.
import { useEffect } from 'react';
function Example() {
// ...
useEffect(() => {
fetch('https://api.example.com/items')
.then((res) => res.json())
.then((data) => {});
return () => {
// cleanup
};
}, [x]);
return <div></div>;
}
์์ ์์ ์ฝ๋์์ useEffect ๋ด์ ํจ์๋ fetch
์์ฒญ์ ๋ณด๋ด๊ณ , cleanup
ํจ์๋ฅผ ๋ฐํํ๋ค.
์ด ๋, x๊ฐ ์์ด ๋น ๋ฐฐ์ด์ด๋ผ๋ฉด ์ฒซ mount ๋ fetch ํจ์๊ฐ ์คํ๋๊ณ unmount ๋ cleanup ํจ์๊ฐ ์คํ๋๋ค.
x๊ฐ ์์ ๊ฒฝ์ฐ, ์ฒซ ๋ง์ดํธ ๋ ๊ทธ๋ฆฌ๊ณ x๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค fetch ํจ์๊ฐ ์คํ๋๊ณ , x๊ฐ ๋ณ๊ฒฝ๋๊ธฐ ์ง์ ์ ๊ทธ๋ฆฌ๊ณ unmount ๋ cleanup ํจ์๊ฐ ์คํ๋๋ค.
์ฆ, useEffect๋ ๋ ๋๋ง๊ณผ ๋ฌด๊ดํ ์์ ์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ hook์ด๋ค.
useMemo
- Memo๋ Memory์ ์ฝ์๋ก,
๋ฉ๋ชจ๋ฆฌ
๋ฅผ ์๋ฏธํ๋ค. ์ฆ, ์ ์ ๊ธฐ์ตํด๋๊ธฐ ์ํ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค. - useMemo๋ ์ ๋ฌ๋๋ ํจ์์ ๋ฐํ๊ฐ์ ๊ธฐ์ตํ๋ค.
const memoValue = useMemo(() => {
return 'memo value!';
}, [x]);
- x์ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ธฐ ์ ๊น์ง๋ โmemo value!โ๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ค๊ฐ, x์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ค์ ํจ์๋ฅผ ์คํํ์ฌ ๋ฐํ๊ฐ์ ๊ธฐ์ตํ๋ค.
- ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋
์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋์ด ๋ฐํํ๋ ๊ฐ
์ ๊ธฐ์ตํ๋ค.
useCallback
- Callback์ด๋
ํจ์
๋ฅผ ์๋ฏธํ๋ค. ์ฆ, ํจ์๋ฅผ ๊ธฐ์ตํ๊ธฐ ์ํ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
const callback = useCallback(() => {
return 'callback function!';
}, [x]);
- x์ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ธฐ ์ ๊น์ง๋
์ ๋ฌ๋ ์ฝ๋ฐฑ ํจ์ ์์ฒด๋ฅผ ๊ธฐ์ต
ํ๊ณ ์๋ค๊ฐ, x์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ค์ ๊ทธ ์ฝ๋ฐฑ ํจ์๋ฅผ ๊ธฐ์ตํ๋ค.
const memoCallback = useMemo(
() => () => {
return 'callback function!';
},
[x],
);
- useMemo๋ฅผ ํตํด ์ฝ๋ฐฑ ํจ์๋ฅผ ๊ธฐ์ตํ๊ณ , ๊ทธ ์ฝ๋ฐฑ ํจ์๋ฅผ useCallback์ ํตํด ๊ธฐ์ตํ๋ ๊ฒ๊ณผ ๋์ผํ๋ค.
useRef
- Ref๋
์ฐธ์กฐ
๋ฅผ ์๋ฏธํ๋ค. ์ฆ, ์ฐธ์กฐ๋ฅผ ์ํ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค. - useRef๋ ์ ๋ฌ๋๋ ๊ฐ์
์ฐธ์กฐ
๋ฅผ ๊ธฐ์ตํ๋ค.
const ref = useRef('ref value!');
// ref.current === 'ref value!'
- ref.current๋ ์ ๋ฌ๋ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ๊ธฐ์ตํ๋ค.
- ref.current๋ ๋ณ๊ฒฝ๋์ง ์๋๋ค.(๋ํ๋์๊ฐ ์๋ค.)
- ์ฃผ๋ก
DOM
์ ์ฐธ์กฐํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
React.memo
- ์ปดํฌ๋ํธ๋ฅผ ํ์ดํ ํจ์๋ก ์์ฑํ์ ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- ํด๋น ์ปดํฌ๋ํธ ์์ฒด์
๋ ๋๋ง ๊ฒฐ๊ณผ๋ฌผ
์ ๊ธฐ์ตํ๋ค. - ๋ณ์๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ, ํด๋น ์ปดํฌ๋ํธ๋ ๋ค์ ๋ ๋๋ง๋์ง ์๋๋ค.
const MemoComponent = React.memo(({ value, handleFunction }) => {
return <div>MemoComponent</div>;
});
- value์ handleFunction์ด ๋ณ๊ฒฝ๋์ง ์๋ ํ, MemoComponent๋ ๋ค์ ๋ ๋๋ง๋์ง ์๋๋ค.
- value๋ ๋ณ๊ฒฝ๋์ง ์์ง๋ง, handleFunction์ ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฏ๋ก, handleFunction์ useCallback์ ํตํด ๊ธฐ์ตํด๋๋๋ก ํ๋ค.