2024-04-09.md
๐กDIL: ๋ชจ๋ ๋ฆฌ์กํธ ๋ฅ ๋ค์ด๋ธ, 6์ฃผ์ฐจ-2
์คํฐ๋: ์๊ฐ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์ค๋ ์งํ: ๊ฐ์ธ๊ณต๋ถ
DIL-week6-\2_2024-04-09
| DIL ์ฃผ์ฐจ | ๋ฒ์ | ๋ด์ฉ | ์ค๋์ฐจ ์ง๋ | | -------- | ---------- | --------------------------------------------------------- | ----------- | | 6์ฃผ์ฐจ | 10์ฅ, 11์ฅ | ๋ฆฌ์กํธ 17๊ณผ 18 ๋ณ๊ฒฝ ์ฌํญ ์ดํด๋ณด๊ธฐ, Next.js 13๊ณผ ๋ฆฌ์กํธ 18 | 657~678p |
์ค๋ ์ฝ์ ๋ด์ฉ์ markdown์ผ๋ก ๊ฐ๋จํ ๋ฉ๋ชจ
์ฝ์ ์๊ฐ: 8์~9์, 10์20๋ถ~11์10๋ถ
๋ฆฌ์กํธ 17๊ณผ 18 ๋ณ๊ฒฝ ์ฌํญ ์ดํด๋ณด๊ธฐ
๋ฆฌ์กํธ 17
- 16 => 17
- ๋ฆฌ์กํธํ ์, 10๋ง ๊ฐ์ ์ปดํฌ๋ํธ ์ค ํธํ์ฑ์ด ๊นจ์ง๋ ๋ณ๊ฒฝ ์ฌํญ์ 20๊ฐ ๋ฏธ๋ง์ด๋ผ ํจ
์ ์ง์ ์ ๊ทธ๋ ์ด๋
- ๋ ๊ฑฐ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ด๋ฆฌ > ์ง์ ์ค๋จ๋ API ๊ณ ์น๋ ์์ > ๋ฒ๊ฑฐ๋ก์
- 17๋ถํฐ ์ผ๋ถ ํธ๋ฆฌ + ์ปดํฌ๋ํธ์ ๋ํด์๋ง 18์ ์ ํํ๋ "์ ์ง์ ์ ๊ทธ๋ ์ด๋"๊ฐ ๊ฐ๋ฅํ๋ค..
- ์
๊ทธ๋ ์ด๋๊ฐ ๋๋ฌด ๋ถ๋ด์ด ๋๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ ๊ณ ๋ ค
- ์ด๋ฐ ์ด์ ๋ก 17๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ค๋ฉด ์ ๋ฐ์ดํธ๋ฅผ ์ํ ์ ๋ฐ์ดํธ๋ผ ํ ์ ์์
ํ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ์ฌ๋ฌ ๋ฒ์ ์ ๋ฆฌ์กํธ๊ฐ ์กด์ฌํ๋ ์๋๋ฆฌ์ค
- https://github.com/wikibook/react-deep-dive-example/tree/main/chapter10/react-gradual-demo
- mordern(17)๊ณผ legacy(16)๋ก ๊ตฌ์ฑ๋ ์์ ๋ ํฌ
- mordern ์ ํ๋ฆฌ์ผ์ด์ ์ด legacy ์ ํ๋ฆฌ์ผ์ด์ ์ lazy๋ก ๋ถ๋ฌ์จ๋ค.
- ๋ฆฌ์กํธ 16์ ์ํ ๋ฃจํธ ์์๋ฅผ ๋ง๋๋ HOC lazyLegacyRoot
- ๋๋๋ง ๊ณผ์ ์์ ๋ฒ์ ๋ถ์ผ์น๋ก ์ธํ ์๋ฌ ๋ฐ์x
- ๋ ๊ฐ์ ๋ฆฌ์กํธ ๋ฃจํธ๋ -> ์ปดํฌ๋ํธ, ํ , Context๋ฅผ ์๋ก ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์๋ค
- mordern(17)๊ณผ legacy(16)๋ก ๊ตฌ์ฑ๋ ์์ ๋ ํฌ
- ์ด๋๊น์ง๋ ์ฐจ์ ์ฑ
์ด๋ฒคํธ ์์ ๋ฐฉ์์ ๋ณ๊ฒฝ๐ค
- ์ด๋ป๊ฒ?
import { useEffect, useRef } from "react";
export default function Button() {
const buttonRef = useRef<HTMLButtonElement | null>(null);
useEffect(() => {
if (buttonRef.current) {
buttonRef.current.onclick = function ์๊ฐ์น() {
alert("๐");
};
}
}, []);
function ์ค์ฌ์ฏ() {
alert("๐ ");
}
return (
<>
{/* ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์
์์ DOM์ onClick ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์ */}
{/* handler: noop(), no operation, ์๊ฒ๋ ํ์ง ์์ */}
<button onClick={์ค์ฌ์ฏ}>๋ฆฌ์กํธ ๋ฒํผ</button>
{/* DOM์ ์ฐธ์กฐํ ๋ค์, DOM์ onclick์ ์ง์ ํจ์ ์ถ๊ฐํ๋ ๊ณ ์ ์ ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ถ๊ฐ ๋ฐฉ์ */}
{/* handler: ์๊ฐ์น() */}
<button ref={buttonRef}>DOM ๋ฒํผ</button>
</>
);
}
๋ฆฌ์กํธ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ, ์ด๋ฒคํธ ์์
- ํด๋น ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํ ๊ฐ๊ฐ์ DOM ์์์ ๋ถ์ฐฉx
- ์ด๋ฒคํธ ํ์ ๋น ํ๋์ ํธ๋ค๋ฌ๋ฅผ ๋ฃจํธ์ ๋ถ์ฐฉํ๋ค
- ์ด๋ฒคํธ ๊ตฌ์ฑ ๋จ๊ณ | ๋จ๊ณ | ๋ด์ฉ | | --- | --- | | capture | ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํธ๋ฆฌ ์ต์๋จ ์์์์๋ถํฐ, ์ค์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ํ๊น ์์๊น์ง ๋ด๋ ค๊ฐ๋ ๊ฒ | | target | ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํ๊น ๋ ธ๋์ ๋๋ฌ / ์ด๋ฒคํธ ํธ์ถ | | bubbling | ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์์์๋ถํฐ ์ต์์ ์์๊น์ง ์ฌ๋ผ๊ฐ๋ ๊ฒ |
- ๋ฆฌ์กํธ์ ๊ฒฝ์ฐ, ์ต์ด ๋ฆด๋ฆฌ์ฆ๋ถํฐ event delegation์ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ๋ค. ์ด๋ฒคํธ๋ฅผ ๊ฐ ์์๊ฐ ์๋ document์ ์ฐ๊ฒฐํด์ ์ด๋ฒคํธ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ค.
- 16๋ฒ์ ๊น์ง๋ document, 17๋ถํฐ๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ์ต์๋จ ํธ๋ฆฌ(root element)
- ์ ์ง์ ์
๊ทธ๋ ์ด๋ ์ง์
- ๋ชจ๋ ์ด๋ฒคํธ๊ฐ docuemnet์ ์์
- ๋ค๋ฅธ ๋ฒ์ ์ ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฃจํธ ์์์์ ์ด๋ฒคํธ ์ ํ๋ฅผ ๋ง์ ์ ์๋ค
- ๋ฐ๋ผ์ ์ด๋ฒคํธ๋ฅผ ํด๋น ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ํธ๋ฆฌ ์์ค์ผ๋ก ๊ฒฉ๋ฆฌํ์ฌ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง ํผ์ ์ ๋ง์
- ์ ์ง์ ์ ๊ทธ๋ ์ด๋ ๋ฟ๋ง ์๋๋ผ JQuery ๋ฑ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ํต์ฉ๋จ
- ๊ทธ๋์ ๋ฆฌ์กํธ 16๋ฒ์ ์์ root element์ event stopPropagationํ๋ฉด ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ๋ง์ ์ ์์๋ค~
- ์ ์ง์ ์
๊ทธ๋ ์ด๋ ์ง์
- 16๋ฒ์ ๊น์ง๋ document, 17๋ถํฐ๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ์ต์๋จ ํธ๋ฆฌ(root element)
- document.addEventListener๋ฅผ ํ์ฉํด ๋ฆฌ์กํธ์ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ document์์ ํ์ธํ๋ ์ฝ๋๊ฐ ์๋ค? > ์ด๋ฒคํธ๊ฐ document๊น์ง ์ ํ๋์ง ์๋ ๊ฒฝ์ฐ ์์
JSX transfrom
- JSX๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋ ์ฝ๋๊ฐ ์๋
- ๋ฐ๋ฒจ, ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ
- 16๊น์ง๋ JSX ๋ณํ์ ์ํด 'react' import๊ฐ ํ์ํ๊ณ , ์์ผ๋ฉด ์๋ฌ์๋ค, react.createElement
- 17๋ถํฐ๋ ๋ฐ๋ฒจ๊ณผ ํ๋ ฅํด ์ด๋ฌํ import ๊ตฌ๋ฌธ ์์ด๋ JSX ๋ณํ, _jsxRuntime
- import ์ญ์ ํ๋๊น ๋ฒ๋ค๋ง ํฌ๊ธฐ ์กฐ๊ธ์ด๋๋ง ์ค์
- ์ปดํฌ๋ํธ ์์ฑ ๊ฐ๊ฒฐํ. ๋ด๋ถ ๋ก์ง๋ํ ๊ฐ๊ฒฐํ๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก import React ์ง์ฐ๊ณ , tsconfig.json์ jsx๋ "react-jsx"
event pooling ์ ๊ฑฐ
- ๋ฆฌ์กํธ 16์ ์ด๋ฒคํธ ํ๋ง
- SyntheticEvent ํ์ ๋ง๋ค์ด์, ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ๊ฐ์ ธ์จ ๊ฒ์ ์๋ฏธ
- SyntheticEvent: ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ์ด๋ฒคํธ๋ฅผ ํ ๋ฒ ๋ ๊ฐ์ผ ์ด๋ฒคํธ ๊ฐ์ฒด
- ํ ๋ฒ ๋ํํ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์ด๋ฒคํธ๋ฅผ ์๋ก ๋ง๋ค์ด์ผ ํ๋ฏ๋ก -> ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์
- ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฃผ๊ธฐ์ ์ผ๋ก ํด์ ํ๋ ๋ฒ๊ฑฐ๋ก์
- ์ด๋ฒคํธ ํ๋ง ์์คํ
- ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ํด
- ํฉ์ฑ ์ด๋ฒคํธ ํ์์ ํฉ์ฑ ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ ธ์ด
- ์ด๋ฒคํธ ์ ๋ณด๋ฅผ ํฉ์ฑ ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ฃ๋๋ค
- ์ ์ ๊ฐ ์ง์ ํ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์คํ
- ์ด๋ฒคํธ ๊ฐ์ฒด ์ด๊ธฐํ => ๋ค์ ์ด๋ฒคํธ ํ...
- ์ด๋ฒคํธ๊ฐ ์ข ๋ฃ๋์๋ง์ ์ด๊ธฐํํ๋ ๋ฐฉ์์ ์ง๊ด์ ์ด์ง ์์๋ค. ใ ใ
- ์ด๋ฒคํธ ํ๋ง ๋ฐฉ์์ผ๋ก, ์ด๋ฒคํธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
- ์ฌ์ฌ์ฉ ์ฌ์ด์ ๋ชจ๋ ์ด๋ฒคํธ ํ๋๋ฅผ null๋ก ๋ณ๊ฒฝ(์ฌ์ฌ์ฉ์ ์ํด ์ด๊ธฐํ)
- ์ด๊ธฐํ๋ ์ดํ์ e์ ์ ๊ทผํ๋ฉด null
- e.persist()๊ฐ์ ๋ณ๋ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค
- ์ฆ, ๋ณ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํฉ์ฑ ์ด๋ฒคํธ ๊ฐ์ฒด๋ฅผ ํ ๋นํด์ผ ํ๋ค. ์ฑ๋ฅ ํฅ์์ ๋์์ด ๋์ง ์์ผ๋ฏ๋ก event pooling ๊ฐ๋ ์ด ์ญ์ ๋์๋ค. ๋ํ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์ฑ๋ฅ์ด ๊ฐ์ ๋์ด, ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ์์ ์ด๋ฒคํธ ๊ฐ์ฒด์ ์ ๊ทผํ ๋ ๋น๋๊ธฐ๋ ๋๊ธฐ๋ ์๊ด์์
useEffect ํด๋ฆฐ์ ํจ์์ ๋น๋๊ธฐ ์คํ
- useEffect์ ํด๋ฆฐ์
ํจ์๋ 16๋ฒ์ ๊น์ง๋ ๋๊ธฐ์๋ค
- ๋ถํ์ํ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋ค
- 17๋ถํฐ๋ ํ๋ฉด์ด ์์ ํ ์
๋ฐ์ดํธ ๋ ์ดํ์ ํด๋ฆฐ์
ํจ์๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ค.
- ํด๋ฆฐ์ ํจ์๋ ์ปดํฌ๋ํธ์ ์ปค๋ฐ ๋จ๊ณ๊ฐ ์๋ฃ๋ ๋๊น์ง ์ง์ฐ๋๋ค
- "ํ๋ฉด์ ์
๋ฐ์ดํธ๊ฐ ์์ ํ ๋๋ ์ดํ"์ ์คํ๋๋๋ก ๋ฐ๋์์ผ๋ฉฐ, ์ฑ๋ฅ์ ์ด์ ์ด ๋์๋ค
- => Profiler๋ก commitTime ํ์ธํ ์ ์์
Profiler
https://react.dev/reference/react/Profiler
<Profiler>
lets you measure rendering performance of a React tree programmatically.
<Profiler id="App" onRender={onRender}>
<App />
</Profiler>
- ์ฝ์ ํ ์ด๋ธ ์ฐ์ผ๋ฉด์ ํผํฌ๋จผ์ค ํ์ธ ๊ฐ๋ฅ << ์ ๊ธฐํจ
์ปดํฌ๋ํธ์ undefined ๋ฐํ์ ๋ํ ์ผ๊ด์ ์ฒ๋ฆฌ
| react | ์ผ์ด์ค | ์๋ฌ ์ฌ๋ถ | | ------ | ---------------------------------------------------------------- | --------- | | 16, 17 | ์ปดํฌ๋ํธ๊ฐ undefined๋ฅผ ๋ฐํ | O | | 16 | memo, forwardRef๊ฐ undefined๋ฅผ ๋ฐํ | X | | 17 | memo, forwardRef๊ฐ undefined๋ฅผ ๋ฐํ | O | | 18 | ์ปดํฌ๋ํธ๊ฐ undefined๋ฅผ ๋ฐํ, memo, forwardRef๊ฐ undefined๋ฅผ ๋ฐํ | X |
17.0.0 ๋ ์ดํด๋ณด๊ธฐ
- https://github.com/facebook/react/releases/tag/v17.0.0
- ๋ฆฌ์กํธ 16 ํ๋ก์ ํธ๊ฐ ์๋ค๋ฉด 17๋ก ์
๋ฐ์ดํธ ํ๋ ๊ฒ์ด ์ข๋ค
- ์ ์ง์ ์ ๊ทธ๋ ์ด๋ ๋๋น
- ๊ณต์๊ฐ ํฌ๊ธฐ ์์