์ปดํฌ๋ํธ๊ฐ ๊ฐ์ง ์ ์๋ ์ํ
์ปดํฌ๋ํธ์ ์ํ๋ฅผ ์์ฑํ๊ณ ๊ฐํธํ๊ฒ ์
๋ฐ์ดํธ ํ ์ ์๊ฒ ํด์ค๋ค.
ํ์ฌ ์ํ๊ฐ์ state์, state๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋๋ setState ํจ์๋ฅผ ์ด์ฉ.
state๊ฐ ๋ณ๊ฒฝ์ด ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ ์๋์ผ๋ก ์ฌ๋ ๋๋ง ๋๋ค.
const [state, setState] = useState(์ด๊ธฐ๊ฐ)
setState(๋ณ๊ฒฝ)
๐กLazy Initial State
state์ ์ด๊ธฐ๊ฐ์ ๊ฐ์ ธ์ฌ ๋ ๋ฌด๊ฑฐ์ด ์์
์ ํด์ผ ํ๋ค๋ฉด (ex. ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ณ์ฐ..) ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ๊ทธ ์์
๋ํ ๋ฐ๋ณตํ๊ฒ ๋ ๊ฒ์ด๋ค.
const heavyWork = () => {
console.log('์์ฒญ ์์ฒญ ๋ฌด๊ฑฐ์ด ์์
!!!!');
return 12345
}
const [number, setNumber] = useState(heavyWork)
state์ ์ด๊ธฐ๊ฐ์ด ์ฒ์ ๋ ๋๋ง ์์๋ง ๋ถ๋ ค์ง๊ฒ ํ๊ณ ์ถ๋ค๋ฉด ์ด๊ธฐ๊ฐ์ ๋ฃ๋ ์ธ์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฃ์ด ์ฃผ๊ณ ๋ฆฌํด๊ฐ์ผ๋ก ๋ฌด๊ฑฐ์ด ์์
์ ํ๋ ํจ์๋ฅผ ๋ถ๋ฌ์ฃผ๋ฉด ๋๋ค.
heayWork๋ ์ต์ด ๋ ๋๋ง ํ ๋๋ง ์คํ ๋๊ฒ ๋ ๊ฒ์ด๋ค.
const [number, setNumber] = useState(() => {heavyWork})
mount(ํ๋ฉด์ ์ฒซ ๋ ๋๋ง), update(๋ค์ ๋ ๋๋ง), unmount(ํ๋ฉด์์ ์ฌ๋ผ์ง๋)๋์์ ๋ ํน์ ์์ ์ ํ๋ ์ฝ๋๋ฅผ ์คํ์์ผ์ฃผ๊ณ ์ถ๋ค๋ฉด useEffect๋ฅผ ์ฌ์ฉํ๋ค.
1. useEffect(() => {//์์
})
2. useEffect(() => {//์์
}, [value])
CleanUp
์ ๋ฆฌํ๊ณ ์ถ์ ํจ์(์๊ฐ or ์ด๋ฒคํธ ๋ฆฌ์ค๋)๊ฐ ์๋ค๋ฉด return ๋ค์ ์ ๋ฆฌํ๋ ์์
์ ์ฒ๋ฆฌํด์ฃผ๋ฉด ๋๋ค.
useEffect(() => {
// ๊ตฌ๋
...
return () => [
// ๊ตฌ๋
ํด์ง..
}
}, []);
ํจ์ํ ์ปดํฌ๋ํธ์์ useRef๋ฅผ ๋ถ๋ฅด๋ฉด ref๊ฐ์ฒด๋ฅผ ๋ฐํํด์ค๋ค.
์ด๊ธฐ๊ฐ์ผ๋ก ์ค์ ํด์ค ๊ฐ์ ref๊ฐ์ฒด์ current๊ฐ์ผ๋ก ์ ์ฅ๋๋ฉฐ ๊ฐ์ ์ธ์ ๋ ๋ณ๊ฒฝํด์ค ์ ์๋ค.
๋ฐํ๋ ref์ ๊ฐ์ ์ปดํฌ๋ํธ์ ์ ์์ ์ฃผ๊ธฐ๋์ ์ ์ง๋๋ค. ์ฆ, ๋ฆฌ๋ ๋๋ง๋๋๋ผ๋ unmount ๋ ๋๊น์ง ๊ฐ์ ๊ทธ๋๋ก ์ ์งํ ์ ์๋ค.
const ref = useRef(value)
ref = { current: 'value'}
๐ก Ref์ ๋ณ์์ ์ฐจ์ด!
๋ฆฌ๋ ๋๋ง ์ ์ปดํฌ๋ํธ ์์์๋ ์ด๊ธฐ์ ์์ฑํด๋์๋ ์ ์ธ๋ค์ด ๋ค์ ๋ฐ์ํ๋ค. ๊ทธ๋ฌ๋ฉด ๋ณ์์ ์์ฑํด๋์๋ ์ด๊ธฐ๊ฐ๋ ๋ค์ ์ ์ธ๋์ด ๋ฆฌ๋ ๋๋ง์ ๊ฑฐ์น๋ฉด์ ์ด๊ธฐ๊ฐ์ผ๋ก ๋์๊ฐ๊ฒ ๋๋ ๊ฒ์ด๋ค. ํ์ง๋ง Ref๋ ์ด๊ธฐ๊ฐ์ผ๋ก ๋ค์ ๋์๊ฐ์ง ์์ ๊ทธ๋๋ก ์ ์ง ๋๋ค.
document.querySelector()๊ณผ ๋น์ทํ ๊ธฐ๋ฅ.
์ ๊ทผํ๊ณ ์ ํ๋ ํ๊ทธ์ ref์์ฑ์ ๋ฃ์ด์ฃผ๊ฒ ๋๋ฉด ์ ๊ทผ๊ฐ๋ฅํ๋ค.
React๋ก ๋ง๋ค์ด์ง ์ฑ์ ์ฌ๋ฌ๊ฐ์ ์ปดํฌ๋ํธ๋ค๋ก ๊ตฌ์ฑ์ด ๋์ด์๋ค. ์ต์์ ์ปดํฌ๋ํธ์์ ์์ํด์ ํธ๋ฆฌํํ๋ก ๋ป์ด๋๊ฐ๋๋ฐ ๋ฐ์ดํฐ ํ๋ฆ์ ์์์ ์๋๋ก ์ฆ, props๋ฅผ ํตํด ๋ถ๋ชจ์์ ์์์๊ฒ ์ ๋ฌ์ด ๋๋ ํํ์ด๋ค.
์ด๋ ์ ์ญ์ ์ผ๋ก ํ์ํ ๋ฐ์ดํฐ(ex. User, Theme, Language)๋ฅผ props๋ก ์ผ์ผ์ด ๋จ๊ณ์ ์ผ๋ก ๋๊ฒจ์ฃผ์ด์ผํ๋ค๋ฉด ๊ต์ฅํ ๋ณต์กํ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ ๊ฒ์ด๋ค. ์ ์ง๋ณด์ ๋ํ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ํ๋ ๊ฒ์ด Context๋ก ์ฑ์์์ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ๋ data๋ฅผ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ค์ด ๊ณต์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ฃผ๋ ๊ฒ์ด๋ค.
Context๋ props๋ก ๋ฐ์ดํฐ๋ฅผ ์ผ์ผ์ด ์ ๋ฌํ์ง ์์๋ ํธ๋ฆฌ ์์ ์ด๋์ ์์นํด ์๋ ์๊ด์์ด ํด๋น ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค.
๐ฉ Prop Drilling
props๋ฅผ ์ค๋ก์ง ํ์ ์ปดํฌ๋ํธ๋ก๋ง ์ ๋ฌํ๋ ์ฉ๋๋ก ์ฐ์ด๋ component๋ฅผ ๊ฑฐ์น๋ฉด์ React component ํธ๋ฆฌ์ ํ ๋ถ๋ถ์์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ฐ์ดํฐ๋ก ์ ๋ฌํ๋ ๊ณผ์ .
props์ ๋ฌ์ด ๋๋ฌด๋๋ ๋ง์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค๋ฉด ๋์ค์ ์ถ์ ์ด ์ด๋ ค์์ง๊ณ ์ ์ง๋ณด์์ ์ข์ง ์๋ค.
๊ณผ๋ํ prop drilling์ ํผํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๋ค์ํ์ง๋ง ๊ทธ ์ค ํ๋๋ก useContext๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ค๋ง Context๋ ๋ค์ํ ๋ ๋ฒจ์ ์๋ ์ปดํฌ๋ํธ๋ค์๊ฒ ์ ์ญ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํจ์ด ์ฃผ๋ ๋ชฉ์ ์ด๊ธฐ ๋๋ฌธ์ ๊ผญ ํ์ํ ๋๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
Context๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ ์ง ์ ์๊ณ Prop drilling์ ํผํ๊ธฐ ์ํ ๋ชฉ์ ์ด๋ผ๋ฉด Component Composition(์ปดํฌ๋ํธ ํฉ์ฑ)์ด ๋ ์ข์ ๋ฐฉ๋ฒ์ผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ Component, ๊ทธ ์ค ํจ์ํ ์ปดํฌ๋ํธ๋ ๋ง๊ทธ๋๋ก ํจ์์ด๊ธฐ ๋๋ฌธ์ ๋ ๋๋ง์ด ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ด๋ถ์ ๋ณ์๊ฐ ์ด๊ธฐํ๋๋ค. state์ props์ ๋ณํ๋ก ์ฆ์ ๋ ๋๋ง์ด ๋ฐ์ํ๊ฒ ๋๋ฉด ๋ด๋ถ์ ๋ฌด๊ฑฐ์ด ์์ ์ด ์์ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์๊ฒ ๋ถ๋ด์ด ์ปค์ง ๊ฒ์ด๋ค.
Component ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํ hook์ผ๋ก๋ useMemo์ useCallback์ด ์๋ค.
๊ทธ ์ค useMemo์ Memo๋ Memoization์ ๋ปํ๋ค. ์ฆ, ํจ์๊ฐ ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณตํด์ผ ํ ๋, ์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํจ์ผ๋ก์จ ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณต ์ํ์ ์ ๊ฑฐํ์ฌ ํ๋ก๊ทธ๋จ์ ์คํ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ ์ ์๋ค.
useMemo๋ ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ฝ๋ฐฑํจ์(memoizationํด์ค ๊ฐ์ ๊ณ์ฐํด์ ๋ฆฌํดํด์ค ๊ฐ)๋ฅผ ๋๋ฒ์งธ ์ธ์๋ก ์์กด์ฑ ๋ฐฐ์ด์ ๋ฐ๋๋ค. ์ฝ๋ฐฑํจ์์๋ ์์ฃผ ์ฐ์ด๋ ๊ฐ์ memoization ํด์ฃผ๋ ๊ฒ์ด๋ค.
const value = useMemo(() => {
return calculate();
}, [item]);
useMemo๋ ์์ฃผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์คํ๋ ค ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค.
useCallback์ useMemo์ ๋น์ทํ์ง๋ง ์ธ์๋ก ์ ๋ฌํ ์ฝ๋ฐฑํจ์ ๊ทธ ์์ฒด๋ฅผ memoization ํ๋ ๊ฒ์ด๋ค.
useCallback์ ์ฒซ๋ฒ์งธ ์ธ์๋ก memoization ํด์ค ์ฝ๋ฐฑํจ์, ๋๋ฒ์งธ ์ธ์๋ก๋ ์์กด์ฑ ๋ฐฐ์ด์ ๋ฐ๋๋ค.
useCallback(() => {
return value;
}, [item])