2024-03-09.md
๐กDIL: ๋ชจ๋ ๋ฆฌ์กํธ ๋ฅ ๋ค์ด๋ธ, 1์ฃผ์ฐจ-6
์คํฐ๋: ์๊ฐ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์ค๋ ์งํ: ๊ฐ์ธ๊ณต๋ถ
DIL-week1-6_2024-03-09
| DIL ์ฃผ์ฐจ | ๋ฒ์ | ๋ด์ฉ | ์ค๋์ฐจ ์ง๋ | | -------- | ------ | ------------------------------ | ----------- | | 1์ฃผ์ฐจ | 1, 2์ฅ | ๋ฆฌ์กํธ ํต์ฌ์์์ ์๋ฐ์คํฌ๋ฆฝํธ | 162p~ |
์ค๋ ์ฝ์ ๋ด์ฉ์ markdown์ผ๋ก ๊ฐ๋จํ ๋ฉ๋ชจ
์ฝ์ ์๊ฐ: 10์~12์๋ฐ ์๊ฐ์ด ์๋ค!
๋น ๋ฅด๊ฒ ์ฝ๊ธฐ: ์ถ๊ฐ ๊ฒ์x, ์์ ๋ง๋ค๊ธฐx => ํ์ง๋ง ๋ง๋ค์์ฃ ?
๋ฐํ ๋งฅ๋ฝ ์ ํ๊ธฐ
์ฅํ ๋ง๋ค๋ฉด์ ์ถ๊ฐ ๊ณต๋ถ
๊ถ๊ธํ ์ ์ ์ ๋ฆฌํด์ ์ผ์์ผ 10์์ ํ ์
- ๋ ์๋ธ๋ผ๋ชจํ Dan Abramov์ ๋ธ๋ก๊ทธ ์ธ์ฉ์ด ๋ง์ด ๋์จ๋ค https://overreacted.io/
ํด๋์ค ์ปดํฌ๋ํธ์ ํ๊ณ
- ๋ฐ์ดํฐ์ ํ๋ฆ์ ์ถ์ ํ๊ธฐ ์ด๋ ต๋ค: state์ ์ ๋ฐ์ดํธ ์์น ์ด๋? ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋ ์ฝ๋์ ํ๋ฆ ํ์ ํด์ผํจ
- ์ฌ์ฌ์ฉ์ด ์ด๋ ต๋ค: HOC๋ก ๊ฐ์ธ๊ฑฐ๋, props๋ฅผ ์ ๋ฌํด์ ์ฌ์ฌ์ฉ ์, wrapper hell์ ๋น ์ง ์ ์๋ค. ์ปดํฌ๋ํธ ์์์ผ๋ก ์ฌ์ฌ์ฉ ์, ํด๋์ค์ ํ๋ฆ์ ์ซ์์ผ ํจ
- ์ปดํฌ๋ํธ๊ฐ ์ปค์ง๋ค: ๋ก์ง, ๋ด๋ถ ๋ฐ์ดํฐ ํ๋ฆ์ด ๋ณต์กํ๋ฉด ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ๋ง์ด ์จ์ ์ปดํฌ๋ํธ๊ฐ ๋ฑ๋ฑํด์ง
- ์๋์ ์ผ๋ก ์ด๋ ต๋ค: JS ๊ฐ๋ฐ์๋ค์ด class ๋ฌธ๋ฒ์ ์ต์ํ์ง ์๊ณ , ํผ๋์ JS this
- ์ฝ๋ ํฌ๊ธฐ ์ต์ ํ ์ด๋ ค์: ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ธฐ ์ด๋ ต๋ค. ๋ฉ์๋๋ช ์ด minified๋์ง ์๊ณ , ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋๊ฐ ํธ๋ฆฌ์์ดํน ๋์ง ์์
- hot reloading์ ๋ถ๋ฆฌ
- class component: ์ต์ด ๋๋๋ง ์ instance๋ฅผ ์์ฑ => ๋ด๋ถ์์ state ๊ฐ ๊ด๋ฆฌ. instance ๋ด๋ถ์ ์๋ render()๋ฅผ ์์ ํ ์, instance๋ฅผ ์๋ก ๋ง๋ฆ => state์ด ์ด๊ธฐํ๋จ
- function component: state ๊ฐ์ ํด๋ก์ ์ ์ ์ฅ, ํจ์๊ฐ ๋ค์ ์คํ๋๋ state์ ์์ง ์์
ํจ์ ์ปดํฌ๋ํธ
- 16.8 ๋ฒ์ ์ด์ ์๋ ๋ฌด์ํ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ์๋จ
์๋ช ์ฃผ๊ธฐ ๋ฉ์๋
- componentDidMount, componentDidUpdate, componentUnmount๋ฅผ useEffect๋ฅผ ์ฌ์ฉํด ๋น์ทํ๊ฒ ๊ตฌํ
- useEffect๋ ์๋ช ์ฃผ๊ธฐx => ๊ทธ๋ฅ ๋๊ธฐ์ ์ธ side effect ๋งค์ปค๋์ฆ
ํจ์ ์ปดํฌ๋ํธ์ ๋๋๋ง๋ ๊ฐ
| ๊ตฌ๋ถ | ์ฐจ์ด์ | props | ์ค๋ช | | ------------------ | --------------------------- | ------------ | --------------------------------------------------------------------------- | | class component | ๋๋๋ง๋ ๊ฐ์ ๊ณ ์ ํ์ง ์์ | this.props | ๋ฐ๋ผ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๊ฐ ๋ณ๊ฒฝ๋ nextProps ๊ฐ์ ์ฝ์ ์ ์๋ค (๋ณํํ๋ this) | | function component | ๋๋๋ง๋ ๊ฐ์ ๊ณ ์ ํจ | props๋ ์ธ์ | ๋๋๋ง์ด ์ผ์ด๋ ๋, ๊ทธ ์๊ฐ์ props, state์ ๊ธฐ์ค์ผ๋ก ๋๋๋ง |
- class component์์ props๋ฅผ ๊ณ ์ ํ๊ณ ์ถ๋ค๋ฉด?
- ๋ฏธ๋ฆฌ ํจ์๋ฅผ ์คํํด ์ธ์์ ์ ๋ฌํด๋๋๋ค
- render(){ ์ฌ๊ธฐ } ๋ด์ ๊ฐ์ ๋ฃ๋๋ค. ์ด์ํด
๋๋๋ง์ ์ด๋ป๊ฒ ์ผ์ด๋๋๊ฐ?
- ๋ฆฌ์กํธ ๋๋๋ง: ๋ธ๋ผ์ฐ์ ๊ฐ ๋๋๋ง์ ํ์ํ DOM ํธ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ณผ์
- ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ํธ๋ฆฌ ์์ ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์ด ํ์ฌ ์์ ๋ค์ด ๊ฐ์ง๊ณ ์๋ props์ state์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ป๊ฒ UI๋ฅผ ๊ตฌ์ฑํ๊ณ , ์ด๋ฅผ ๋ฐํ์ผ๋ก ์ด๋ค DOM ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ์ ๊ณตํ ๊ฒ์ธ์ง ๊ณ์ฐํ๋ ์ผ๋ จ์ ๊ณผ์
๋ฆฌ์กํธ์์ ๋๋๋ง์ด ๋ฐ์ํ๋ ์ด์
- ์ต์ด ๋๋๋ง
- ์ฌ์ฉ์๊ฐ ์ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์
- ๋ธ๋ผ์ฐ์ ์ ๋๋๋งํ ๊ฒฐ๊ณผ๋ฌผ(์ ๋ณด)๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ต์ด ๋๋๋ง ์ํ
- ๋ฆฌ๋๋๋ง
- ํด๋์ค ์ปดํฌ๋ํธ
- setState ์คํ
- forceUpdate ์คํ(shouldComponentUpdate๋ฅผ ๊ฑด๋๋, render ๋ด๋ถ์์ ์คํํ๋ฉด? ๋ฌดํ ๋ฃจํ)
- ํจ์ ์ปดํฌ๋ํธ
- useState์ setter ์คํ
- useReducer์ dispatch ์คํ
- key props๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ
- ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋๋๋ง ๋ ๊ฒฝ์ฐ
- props๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ
- ํด๋์ค ์ปดํฌ๋ํธ
key props?
- ๋ฆฌ๋๋๋ง์ด ๋ฐ์ํ๋ ๋์, ํ์ ์์๋ค ์ฌ์ด์์ ๋์ผ ์์๋ฅผ ์๋ณํ๋ ๊ฐ
- key๊ฐ ์๋ค๋ฉด? ํ์ด๋ฒ ๋ด๋ถ์ sibling ์ธ๋ฑ์ค๋ง ๊ธฐ์ค์ผ๋ก ํ๋จํ๊ฒ ๋จ
- key๋ฅผ ์ฌ์ฉํด ๊ฐ์ ๋ก ๋ฆฌ๋๋๋ง ํ๋ ๊ฒ๋ ๊ฐ๋ฅ
๋ฆฌ์กํธ์ ๋๋๋ง ํ๋ก์ธ์ค
- ๋๋๋ง ํ๋ก์ธ์ค๊ฐ ์์๋๋ฉด, ์ปดํฌ๋ํธ ๋ฃจํธ์์๋ถํฐ ์๋์ชฝ์ผ๋ก ๋ด๋ ค๊ฐ๋ฉฐ ์
๋ฐ์ดํธ๊ฐ ํ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฐพ๋๋ค
- ๋ฐ๊ฒฌ ์, ํด๋์ค ์ปดํฌ๋ํธ๋ผ๋ฉด render()
- ๋ฐ๊ฒฌ ์, ํจ์ ์ปดํฌ๋ํธ๋ผ๋ฉด FunctionComponent()๋ฅผ ํธ์ถ ํ, ๊ฒฐ๊ณผ ์ ์ฅ
// ๊ฒฐ๊ณผ {type: MyComponent, props: {count: 0, required: true, children: "์๋ "}}
- JSX๋๊น createElement()๋ฅผ ํธ์ถํ๋ ๊ตฌ๋ฌธ์ผ๋ก ๋ณํ๋๋ค
- Reconciliation ์ฌ์กฐ์ : ์ปดํฌ๋ํธ์ ๋๋๋ง ๊ฒฐ๊ณผ๋ฌผ์ ์์ง, ๊ฐ์ DOM๊ณผ ๋น๊ตํด์ ์ค์ DOM์ ๋ฐ์ํ๊ธฐ ์ํ ๋ณ๊ฒฝ ์ฌํญ ์์งํ๋ ๊ณผ์ .
- ๋ณ๊ฒฝ ์ฌํญ์ ๋๊ธฐ ์ํ์ค๋ก DOM์ ์ ์ฉ
Render Phase์ Commit Phase
- ๋๋ Render Phase
- ์ปดํฌ๋ํธ๋ฅผ ์คํ: render(), return
- ๊ฒฐ๊ณผ์ ์ด์ ๊ฐ์ DOM์ ๋น๊ต
- type, props, key ์ค ๋ณ๊ฒฝ์ด ์๋ค๋ฉด ๋ณ๊ฒฝ์ด ํ์ํ ์ปดํฌ๋ํธ
- ์ปค๋ฐ Commit Phase
- ๋๋ ๋จ๊ณ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ค์ DOM์ ์ ์ฉ
- ์
๋ฐ์ดํธ ์, ๋ง๋ DOM ๋
ธ๋ ๋ฐ ์ธ์คํด์ค๋ฅผ ๋ฆฌ์กํธ ๋ด๋ถ์ ์ฐธ์กฐ๋ฅผ ์
๋ฐ์ดํธ
- componentDidMount, componentDidUpdate ๋ฉ์๋, useLayoutEffect ํ ํธ์ถ
- ์ปค๋ฐ ์ดํ, ๋ธ๋ผ์ฐ์ ์ ๋๋๋ง์ด ๋ฐ์ํ๋ค
- ๋ฆฌ์กํธ์ ๋๋๋ง์ด ์ผ์ด๋๋ ๋๋ ๋จ๊ณ์์ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํ ์ ์๋ค๋ฉด? ์ปค๋ฐ ๋จ๊ณ๊ฐ ์๋ต๋์ด ๋ธ๋ผ์ฐ์ DOM ์ ๋ฐ์ดํธ๊ฐ ์ผ์ด๋์ง ์์ ์ ์๋ค
๋ฉ๋ชจ์ด์ ์ด์
์ปดํฌ๋ํธ์ ํจ์์ ๋ฌด๊ฑฐ์ด ์ฐ์ฐ์ ๊ธฐ์ต useMemo, useCallback, HOC memo
๊ฐ๋ก ์๋ฐ ๐ค๐ค
memoization ๋ฐ๋ํ
- memoization์ ๋น์ฉ์ด๋ค.
- ๊ฐ์ ๋น๊ตํ๊ณ ๋๋๋ง ํน์ ์ฌ๊ณ์ฐ์ด ํ์ํ์ง ํ์ธํ๋ ์์
- ๊ฒฐ๊ณผ๋ฌผ์ ์ ์ฅํด ๋์๋ค๊ฐ ๋ค์ ๊บผ๋ด์ค๋ ์์
- ์ ์คํ๊ฒ ํด์ผํ๋ค.
- premature optimization / premature memoization ์ ๊ฒฝ๊ณํ์.
- ๋ฆฌ์กํธ๊ฐ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ PureComponent๋ก ๋ง๋ค๊ฑฐ๋, memo๋ก ๊ฐ์ธ๋ ์์ ์ ํ์ง ์์ ์ด์ : ํธ๋ ์ดํธ ์คํ๊ฐ ์๋ค. silver bullet์ด ์๋
memoization ์ฐฌ์ฑํ
- memoization์ ๋น์ฉ์? props์ ๋ํ ์์ ๋น๊ต, ๋ฆฌ๋๋๋ง ๋ฆฌ์กํธ์ Reconciliation ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ฐ๋ค. ์ด์ฐจํผ ๊ฒฐ๊ณผ๋ฌผ์ ์ ์ฅ ์ค
- ์ ์ฌ์ ์ํ ๋น์ฉ
- ๋๋๋ง ๋น์ฉ
- ์ปดํฌ๋ํธ ๋ด๋ถ์ ๋ณต์กํ ๋ก์ง ์ฌ์คํ
- ์์ ์ปดํฌ๋ํธ์์ ๋ฐ๋ณต์ ์ผ๋ก ์ผ์ด๋จ
- ๋ฆฌ์กํธ๊ฐ ๊ตฌ ํธ๋ฆฌ and ์ ๊ท ํธ๋ฆฌ ๋น๊ต
function useMath(number: number) {
const [double, setDouble] = useState(0);
const [triple, setTriple] = useState(0);
useEffect(() => {
setDouble(number * 2);
setTriple(number * 3);
});
return useMemo(() => ({ double, triple }), [double, triple]);
}
- ๋ฉ๋ชจ์ด์ ์ด์
์์ :
./2024-03-09_sample.tsx