3. React์ Hook
1. React Hook
Hook์ React ๋ฒ์ 16.8๋ถํฐ React ์์๋ก ์๋ก ์ถ๊ฐ๋ ๊ธฐ๋ฅ Hook์ ์ด์ฉํด ๊ธฐ์กด Class ๋ฐํ์ ์ฝ๋๋ฅผ ์์ฑํ ํ์ ์์ด ์ํ ๊ฐ๊ณผ ์ฌ๋ฌ React์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ React๋ฅผ ์ฐ๋ ๋ฐฉ์์ ์์ ํ ๋ฐ๊พผ ์ปค๋ค๋ ๋ณํ โ ์์ ์ผ๋ก ๋์๊ฐ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅ
Hook์ ํ์ ๋ฐฐ๊ฒฝ
๊ธฐ์กด ๋ฐฉ์์ ์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
1. Wrapper Hell (HoC)
์ปดํฌ๋ํธ ์ฌ์ด์์ ์ํ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ (render props, ๊ณ ์ฐจ ์ปดํฌ๋ํธ) โ ๐ก Hook์ ๊ณ์ธต์ ๋ณํ ์์ด ์ํ ๊ด๋ จ ๋ก์ง์ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ๋์์ค ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ํ ๊ด๋ จ ๋ก์ง์ ์ถ์ํํ๊ณ , ์ด๋ฅผ ์ด์ฉํด ๋ ๋ฆฝ์ ์ธ ํ ์คํธ์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅ
2. Huge Components, ์ดํดํ๊ธฐ ์ด๋ ค์ด ๋ณต์กํ ์ปดํฌ๋ํธ
componentDidMount, componentDidUpdate ๋ฑ ์ํ ๊ด๋ จ ๋ก์ง, ์ฌ์ด๋ ์ดํํธ๊ฐ ์๋ ์ปดํฌ๋ํธ โ ๐ก Hook์ ํตํด ์๋ก ๋น์ทํ ๊ฒ์ ํ๋ ์์ ํจ์์ ๋ฌถ์์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋๋๋ ๋ฐฉ๋ฒ ์ฌ์ฉ
3. Confusing Classes, ์ฌ๋๊ณผ ๊ธฐ๊ณ๋ฅผ ํผ๋์ํค๋ Class
React์์ Class๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด JavaScript์ this๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์์์ผ ํจ JavaScript์ this๋ ๋๋ถ๋ถ์ ๋ค๋ฅธ ์ธ์ด์์์๋ ๋ค๋ฅด๊ฒ ์๋ํ๊ธฐ ๋๋ฌธ์ ํผ๋ ์ ๋ฐ, ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ๊ตฌ์ฑ์ ๋งค์ฐ ์ด๋ ต๊ฒ ๋ง๋ฆ โ ๐ก Hook์ Class์์ด React ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ ์
Class Component vs Function Component
์์ฑ ๋ฐฉ๋ฒ
๋ฆฌ์กํธ์์ ์ ๊ณตํ๋ ์ปดํฌ๋ํธ๋ผ๋ ํด๋์ค๋ฅผ extends, ์์ํด์ ๋ง๋ฆ
ํจ์๋ก ๊ฐ๋จํ๊ฒ ์์ฑ
์ฉ๋
์ปดํฌ๋ํธ์ state๊ฐ ์๊ณ , ์ํ์ ๋ฐ๋ผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธ ๋์ผ ํ๋ฉด ํด๋์ค ์ปดํฌ๋ํธ ์ฌ์ฉ
์ปดํฌ๋ํธ์ state๊ฐ ์๊ณ , ํญ์ ์ ์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ํ๊ธฐ๋ ์ ํจ์ ์ปดํฌ๋ํธ ์ฌ์ฉ
lifecycle methods
lifecycle methods ์กด์ฌ ์ปดํฌ๋ํธ์ ์ํ์ ๋ฐ๋ผ์ ํจ์๋ฅผ ๊ตฌํํด ๋์ผ๋ฉด ๋ฆฌ์กํธ๊ฐ ์์์ ๋ถ๋ฌ์ฃผ๋ ๋ฉ์๋
๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋ X ํจ์๋ ํ ๊ฐ์ง์ ์ผ์ ์ํํ๋ ๋จ์
React Hooks
ํจ์ ์ปดํฌ๋ํธ ์์์ state๋ฅผ ๊ฐ์ง ์ ์๊ณ , ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋๋ ์ฌ์ฉ ๊ฐ๋ฅ(React 16.8 Ver.)
๊ธฐ์กด
์ํ๋ฅผ ๊ฐ์ง ์ปดํฌ๋ํธ๋ Class Component๋ก ๋ง๋ค๊ณ , props๋ง ์ฌ์ฉํ๋ ์ฌ์ฌ์ฉ์ด ์ฉ์ดํ ์์ ์ปดํฌ๋ํธ๋ Function Component๋ก ์์ฑ
Redux์์๋ ๋น์ทํ ๊ตฌ๋ถ์ด ์กด์ฌ
ํ์ฌ
๊ทธ๋ฅ Function Component๋ง ์ฌ์ฉ
์ํ ๊ด๋ฆฌ ์ ๋ฌด๋ฅผ ๋ฐ๋ก ์๊ธฐ ์ด๋ ค์ = ์ ๊ฒฝ์ฐ์ง ์์๋ ๋จ
๋ณต์กํ ์์๋ ์ ๋ถ Hook์ผ๋ก ๊ฒฉ๋ฆฌ ๋ฐ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
๊ณ ์ฐจ ์ปดํฌ๋ํธ, HoC (Higher-Order Components)
๊ณ ์ฐจ ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ ์ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ ํจ์ ์ปดํฌ๋ํธ๋ props๋ฅผ UI๋ก ๋ณํํ๋ ๋ฐ๋ฉด์, ๊ณ ์ฐจ ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ๋ฅผ ์๋ก์ด ์ปดํฌ๋ํธ๋ก ๋ณํ
๊ณ ์ฐจ ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ React์ ๊ณ ๊ธ ๊ธฐ์ ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)๋ React API์ ์ผ๋ถ๊ฐ ์๋๋ฉฐ, React์ ๊ตฌ์ฑ์ ํน์ฑ์์ ๋์ค๋ ํจํด
์ปดํฌ๋ํธ๋ฅผ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ๊ฐ์ธ๊ณ props๋ก ๋ด๋ ค์ฃผ๋ ๊ธฐ์ ๋ถํ์ํ ์ปดํฌ๋ํธ๊ฐ ๊ณ์ ์๊ธฐ๋ ๋จ์ ์ด ์กด์ฌ
const EnhancedComponent = higherOrderComponent(WrappedComponent);
2. Hooks
๊ธฐ๋ณธ 3๊ฐ์ง
useState(State Hook) โ React์ State
useEffect โ Side-effect
useContext
useState
useState State Hook ์ฌ์ฉํ๊ธฐ
useState(State Hook) โ React์ State๋ฅผ ๋ค๋ฃธ
// "state"๋ผ๋ ์๋ก์ด ์ํ ๊ฐ์ ์ ์
const [state, setState] = useState(initialState);
์ํ๊ฐ๊ณผ ๊ทธ ๊ฐ์ ๊ฐฑ์ ํ๋ ํจ์๋ฅผ ๋ฐํ ์ต์ด๋ก ๋ ๋๋ง์ ํ๋ ๋์, ๋ฐํ๋ state๋ ์ด๊ธฐ๊ฐ(initialState)๊ณผ ๊ฐ์
setState(newState);
setState ํจ์๋ state๋ฅผ ๊ฐฑ์ ํ ๋ ์ฌ์ฉ ์ state ๊ฐ์ ๋ฐ์ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง์ ํ์ ๋ฑ๋ก useState๋ฅผ ํตํด ๋ฐํ๋ฐ์ ์ฒซ ๋ฒ์งธ ๊ฐ์ ํญ์ ๊ฐฑ์ ๋ ์ต์ state
setState((prevState) => prevState + 1);
๊ธฐ์กด ์ํ๋ฅผ ์ป๊ณ ์ถ์ ๋๋ ํจ์๋ฅผ ๋ฃ์ด์ค
useEffect
useEffect Effect Hook ์ฌ์ฉํ๊ธฐ useEffect ์๋ฒฝ ๊ฐ์ด๋ - by Dan Abramov
useEffect โ Side-effect๋ฅผ ๋ค๋ฃธ
useEffect(didUpdate);
์ผ๋ถ component๋ ๋ฆฌ์กํธ๊ฐ ์๋ ์ธ๋ถ ์์คํ ๊ณผ ๋๊ธฐํํด์ผ ํจ โ ์ฌ์ด๋ ์ดํํธ๋ผ๊ณ ํจ ๊ทธ๋ฐ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด useEffect๋ฅผ ์ฐ์ง ์๋ ๊ฒ์ด ์ข์
๋ ๋๋ง ์ดํ ํด์ผ ํ ์ผ, ์ฆ React์ ์ธ๋ถ์ ๊ด๋ จ๋ ์ผ์ ์ฒ๋ฆฌ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๋๋ง ๋๋ง๋ค ์คํ๋๋ฏ๋ก, ์์กด์ฑ ๋ฐฐ์ด์ ํตํด ์ธ์ ์ดํํธ๋ฅผ ์คํํ ์ง ์ง์ ๊ฐ๋ฅ(๋ถํ์ํ ๊ฒฝ์ฐ์ ๊ฑด๋๋ฐ๊ธฐ)
ํจ์๋ฅผ ๋ฆฌํดํจ์ผ๋ก์จ ์ข ๋ฃ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์
๐ค side effects
๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ๊ตฌ๋ (subscription) ์ค์ ํ๊ธฐ, ์๋์ผ๋ก React ์ปดํฌ๋ํธ์ DOM์ ์์ ํ๋ ๊ฒ ๋ฑ
์ ๋ฆฌ(clean-up)๋ฅผ ์ด์ฉํ๋ Effects โ ํจ์๋ฅผ ๋ฐํ ์ธ๋ถ ๋ฐ์ดํฐ์ ๊ตฌ๋ (subscription)์ ์ค์ ํด์ผ ํ๋ ๊ฒฝ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ์ง ์๋๋ก ์ ๋ฆฌ
์ ๋ฆฌ(Clean-up)๋ฅผ ์ด์ฉํ์ง ์๋ Effects โ ์ด๋ค ๊ฒ๋ ๋ฐํํ์ง ์์ React๊ฐ DOM์ ์ ๋ฐ์ดํธํ ๋ค ์ถ๊ฐ๋ก ์ฝ๋๋ฅผ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ Ex. ๋คํธ์ํฌ ๋ฆฌํ์คํธ, DOM ์๋ ์กฐ์, ๋ก๊น ๋ฑ์ ์ ๋ฆฌ(clean-up)๊ฐ ํ์ ์๋ ๊ฒฝ์ฐ
๐ค ํ
React์ class ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋์ ์น์ํ๋ค๋ฉด, useEffect Hook์ componentDidMount์ componentDidUpdate, componentWillUnmount๊ฐ ํฉ์ณ์ง ๊ฒ์ผ๋ก ์๊ฐํด๋ ์ข์
useContext
context ๊ฐ์ฒด๋ฅผ ๋ฐ์ ๊ทธ context์ ํ์ฌ ๊ฐ์ ๋ฐํ, context ๊ฐ์ ํธ๋ฆฌํ๊ฒ ์กฐํ ๐ก context์ ๊ฐ์ ์ ๊ทผํ ๋, Consumer๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋จ useContext๋ก ์ ๋ฌํ ์ธ์๋ context ๊ฐ์ฒด ๊ทธ ์์ฒด์ด์ด์ผ ํจ
const value = useContext(MyContext);
// ํ๋ฆฐ ์ฌ์ฉ: useContext(MyContext.Consumer)
// ํ๋ฆฐ ์ฌ์ฉ: useContext(MyContext.Provider)
ํด๋์ค์์์ static contextType = MyContext ๋๋ <MyContext.Consumer>์ ๋์ผ ํด๋์ค ๋ฉ์๋์์๋ context์ ๋ฃ์ด ๋ ํจ์ ํธ์ถ ๊ฐ๋ฅ ํ ํด๋์ค์์ ํ๋์ context๋ง ์ฌ์ฉ ๊ฐ๋ฅ
useContext๋ฅผ ํธ์ถํ ์ปดํฌ๋ํธ๋ context ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํญ์ ๋ฆฌ๋ ๋๋ง ๋ฐ์
๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ต์ ํ ๊ฐ๋ฅ
context์ ํ์ฌ ๊ฐ์ Hook์ ํธ์ถํ๋ ์ปดํฌ๋ํธ์ ๊ฐ์ฅ ๊ฐ๊น์ด <MyContext.Provider>์ value prop์ ์ํด ๊ฒฐ์
<MyContext.Provider>๊ฐ ๊ฐฑ์ ๋๋ฉด Hook์ provider์๊ฒ ์ ๋ฌ๋ ๊ฐ์ฅ ์ต์ ์ context value๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋
์์ ์ปดํฌ๋ํธ์์ React.memo ๋๋ shouldComponentUpdate๋ฅผ ์ฌ์ฉํ๋๋ผ๋ useContext๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์ปดํฌ๋ํธ ์์ฒด์์๋ถํฐ ๋ค์ ๋ ๋๋ง
โ ๏ธ Context API๋ ํ๋กญ์ค ๋๋ฆด๋ง์ ํผํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒ, ์ ์ญ ์ํ๊ด๋ฆฌ๊ฐ ์๋
React์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ธฐ๋ณธ ์์น์ธ ๋จ๋ฐฉํฅ์ฑ ๋๋ฌธ์ Props Drilling(ํ๋กญ์ค ๋๋ฆด๋ง) ๋ฌธ์ ๊ฐ ๋ฐ์
์ฌ๋ฌ ์ปดํฌ๋ํธ์ ๋์ผํ ๊ฐ์ ์ ๊ทผํ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ๋ api(ํต๋ก์ ๊ฐ๋ )
์์ฃผ ๋ณ๊ฒฝ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ค๋ฉด ์ฉ๋์ ๋ง๊ฒ ๊ตฌ๋ถํด์ ์ฌ์ฉํ๋ฉด ๋จ
useRef
const refContainer = useRef(initialValue);
useRef๋ .current ํ๋กํผํฐ๋ก ์ ๋ฌ๋ ์ธ์(initialValue)๋ก ์ด๊ธฐํ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ref ๊ฐ์ฒด๋ฅผ ๋ฐํ ๋ฐํ๋ ๊ฐ์ฒด๋ ์ปดํฌ๋ํธ์ ์ ์์ ์ฃผ๊ธฐ๋ฅผ ํตํด ์ ์ง๋ ๊ฒ
ref๋ ์ ๋ฌ๋์ง ์์
๊ณ ์ฐจ ์ปดํฌ๋ํธ๋ ๋ชจ๋ props๋ฅผ ๋ํ๋ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๋ ๊ฒ์ด ์์น์ด์ง๋ง, refs์์๋ ์๋ํ์ง ์์ ์ด๋ React์์ ref๊ฐ ์ค์ prop์ด ์๋ key์ฒ๋ผ ํน๋ณํ๊ฒ ์ทจ๊ธ๋๊ธฐ ๋๋ฌธ ์ปดํฌ๋ํธ๊ฐ HOC์ ๊ฒฐ๊ณผ์ธ ์๋ฆฌ๋จผํธ์ ref๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ, ref๋ ๋ํ๋ ์ปดํฌ๋ํธ๊ฐ ์๋ ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ ์ปจํ ์ด๋ ์ปดํฌ๋ํธ์ ์ธ์คํด์ค๋ฅผ ๋ํ๋
useLayoutEffect
useLayoutEffect โ useEffect์ ์กฐ๊ธ ๋ค๋ฆ
์ด๋ ํ์ด๋ฐ์ ์ ํํ๊ฒ ์คํ๋๋์ง๋ฅผ ๋ณผ ๋ ์ฐจ์ด๊ฐ ์กด์ฌ
useEffect์ ๋์ผํ์ง๋ง, ๋ชจ๋ DOM ๋ณ๊ฒฝ ํ์ ๋๊ธฐ์ ์ผ๋ก ๋ฐ์ DOM์์ ๋ ์ด์์์ ์ฝ๊ณ ๋๊ธฐ์ ์ผ๋ก ๋ฆฌ๋ ๋๋งํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ๊ฒ useLayoutEffect์ ๋ด๋ถ์ ์์ ๋ ๊ฐฑ์ ์ ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ธฐ ์ด์ ์์ ์ ๋๊ธฐ์ ์ผ๋ก ์ํ
๋จผ์ useEffect
๋ฅผ ์ฌ์ฉํด ๋ณด๊ณ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด useLayoutEffect
๋ฅผ ์ฌ์ฉํด ๋ณด๋ ๊ฒ์ด ๊ถ์ฅ๋จ
3. useEffect ํ์ด๋จธ ์์
React์ ์ธ๋ถ์ ์ฐ์ํ๊ฒ ์ ๊ทผ ์ด ์ ๋๋ useEffect๋ฅผ ์ ์ด๋ค๊ณ ํฌ๊ฒ ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง, ์ด๋ ๊ฒ ์ฐ๋ ์ต๊ด์ ๋ค์ด๋ฉด ์ข์ ๋๋๋ก์ด๋ฉด ํจ์๋ฅผ ์ดํํธ ์์ผ๋ก ์ฎ๊ธฐ๊ธฐ
useEffect(() => {
document.title = `Now: ${new Date().getTime()}`;
});
ํ์ด๋จธ๋ฅผ on/offํ๋ ๊ธฐ๋ฅ์ ๊ทธ๋ฅ ๋ง๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์
// TimerControl.tsx
function Timer() {
useEffect(() => {
setInterval(() => {
document.title = `Now: ${new Date().getTime()}`;
}, 100);
});
return (
<p>Playing</p>
);
}
export default function TimerControl() {
const [playing, setPlaying] = useState(false);
const handleClick = () => {
setPlaying(!playing);
};
return (
<div>
{playing ? (
<Timer />
) : (
<p>Stop</p>
)}
<button type="button" onClick={handleClick}>Toggle</button>
</div>
);
}
ํ ๊ธ์ ๋๋ฌ setInterval์ ๋๋ ค๊ณ ํด๋ ๊ณ์ ์คํ๋๋ ์ค๋ฅ
์ข
๋ฃ ์ฒ๋ฆฌ
ํจ์๋ฅผ ๋ฆฌํดํด์ clean-up
// TimerControl.tsx
useEffect(() => {
const savedTitle = document.title;
const id = setInterval(() => {
document.title = `Now: ${new Date().getTime()}`;
}, 100);
return () => {
document.title = savedTitle;
clearInterval(id);
};
});
์์กด์ฑ ๋ฐฐ์ด
์์กด์ฑ ๋ฐฐ์ด์์ ์๋ฌด ๊ฒ๋ ์ง์ ํ์ง ์์ผ๋ฉด ๋งจ ์ฒ์์ ๋ฑ ํ๋ฒ๋ง ์คํ ์ฃผ๋ก API๋ฅผ ํธ์ถํด์ ๋ฐ์ดํฐ๋ฅผ ์ป์ ๋ ์ฌ์ฉ ๋น ๋ฐฐ์ด([])์ ์ ๋ฌํ๋ค๋ฉด effect ์์ ์๋ props์ state๋ ํญ์ ์ด๊ธฐ๊ฐ์ ๊ฐ์ง๊ฒ ๋ ๊ฒ
export default function TimerControl() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log('effect');
}, []);
return (
<div>
<button type='button' onClick={() => setCount(count + 1)}>Increase</button>
</div>
)
}
๐จ onClick={() => setCount(count + 1)}
์ onClick={setCount(count + 1)}
๋ก ์๋ชป ์ด๋ค๋ฉด ๋ฌดํ ๋ฆฌ๋ ๋๋ง ๋ฐ์
์ฒ์์ ํ๋ฒ๋ง ์คํํ๊ธฐ
์์กด์ฑ ๋ฐฐ์ด์ด ์์ ๊ฒฝ์ฐ ๋ฌดํ ๋ฆฌ๋ ๋๋ง
products๋ฅผ ์ป๋ ๊ณณ์์ ์ฌ์ฉ(๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋งจ ์ฒ์)
// App.tsx
const [products, setProducts] = useState<Product[]>([]);
useEffect(() => {
const fetchProducts = async () => {
const url = 'http://localhost:3000/products';
const response = await fetch(url);
const data = await response.json();
setProducts(data.products);
};
fetchProducts();
}, []);
์์กด์ฑ ๋ฐฐ์ด์ ์ด์ฉํด Fetchํ ๋ ์ฃผ์์ฌํญ
useEffect(() => {
let ignore = false;
async function startFetching() {
const json = await fetchTodos(userId);
if (!ignore) {
setTodos(json);
}
}
startFetching();
return () => {
ignore = true;
};
}, [userId]);
4. React StrictMode
StrictMode๋ ์์๋ค์ ๋ํ ๋ถ๊ฐ์ ์ธ ๊ฒ์ฌ์ ๊ฒฝ๊ณ ๋ฅผ ํ์ฑํ ๊ฐ๋ฐ ๋ชจ๋์์๋ง ํ์ฑํ๋๊ธฐ ๋๋ฌธ์, ํ๋ก๋์ ๋น๋์๋ ์ํฅ์ ๋ผ์น์ง ์์
์์ ํ์ง ์์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ ๋ฐ๊ฒฌ
๋ ๊ฑฐ์ ๋ฌธ์์ด ref ์ฌ์ฉ์ ๋ํ ๊ฒฝ๊ณ
๊ถ์ฅ๋์ง ์๋ findDOMNode ์ฌ์ฉ์ ๋ํ ๊ฒฝ๊ณ
์์์น ๋ชปํ ๋ถ์์ฉ ๊ฒ์ฌ
๋ ๊ฑฐ์ context API ๊ฒ์ฌ
Ensuring reusable state
์ฌ์ฉ ๋ฐฉ๋ฒ
root.render((
<React.StrictMode>
<App/>
</React.StrictMode>
));
<App />
์ปดํฌ๋ํธ ๊ฐ๊ฐ์ ์์๊น์ง ๊ฒ์ฌ๊ฐ ์ด๋ฃจ์ด์ง
์์์น ๋ชปํ ๋ถ์์ฉ ๊ฒ์ฌ
โ ๏ธ useEffect ๋ฑ์ ์ฌ์ฉํ ๋ ๋ ๋ฒ ์คํ๋๋ ๋ฌธ์ (์ฝ์์ ๋ ๋ฒ์ฉ ํธ์ถ ์ถ๋ ฅ)
์์์น ๋ชปํ ๋ถ์์ฉ ๊ฒ์ฌ <React.StrictMode>๋ก ์ปดํฌ๋ํธ ์ ์ฒด๋ฅผ ๊ฐ์ ๊ฒฝ์ฐ, ์์์น ๋ชปํ ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ฐพ์ผ๋ ค๊ณ Effect ๋ฑ์ ๋ ๋ฒ์ฉ ์คํ ๋ ๋ฒ ์ฒดํฌํด์ ๋ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ ํจ์์ ์ฌ์ด๋ ์ดํํธ๊ฐ ํฌ๋ค๊ณ ๊ฒฝ๊ณ ํ์์๋ ํฐ ๋ฌธ์ ๊ฐ ์์ง๋ง, API ๋ฑ์ ์ฌ์ฉํ๋ฉด ์ด์ํ๋ค๊ณ ๋๋ ์ ์์ผ๋ ์ฐธ๊ณ
Last updated