2024-03-07.md
๐กDIL: ๋ชจ๋ ๋ฆฌ์กํธ ๋ฅ ๋ค์ด๋ธ, 1์ฃผ์ฐจ-4
์คํฐ๋: ์๊ฐ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์ค๋ ์งํ: ๊ฐ์ธ๊ณต๋ถ
DIL-week1-4_2024-03-07
| DIL ์ฃผ์ฐจ | ๋ฒ์ | ๋ด์ฉ | ์ค๋์ฐจ ์ง๋ | | -------- | ------ | ------------------------------ | ----------- | | 1์ฃผ์ฐจ | 1, 2์ฅ | ๋ฆฌ์กํธ ํต์ฌ์์์ ์๋ฐ์คํฌ๋ฆฝํธ | 124p~143p |
์ค๋ ์ฝ์ ๋ด์ฉ์ markdown์ผ๋ก ๊ฐ๋จํ ๋ฉ๋ชจ
์ฝ์ ์๊ฐ: ์ ์ฌ ์๊ฐใ 12์๋ฐ~1์๋ฐ
์ ๋ ์ฝ์ ์ด์
JSX => JS
- ํ๋ฌ๊ทธ์ธ:
@babel/plugin-transform-react-jsx
const ComponentA = <A required={true}>Hello</A>;
// @babel/plugin-transform-react-jsx
const ComponentA = React.createElement(A, { required: true }, "Hello");
// automatic runtime: React 17, ๋ฐ๋ฒจ 7.9.0 ์ดํ
const ComponentA = (0, _jsxRuntime.jsx)(A, { required: true, children: "Hello" });
- JSXElement๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ์ธํด ์์๋ฅผ ์ ์ํ๋ค
- ์ต์ ๋์ธ JSXAttribute, JSXChildren, JSXString์ ์ดํ ์ธ์๋ก ์ ๋ฌํ๋ค
function TextOrHeading({
isHeading,
children,
}: PropsWithChildren<{ isHeading: boolean }>) {
return createElement(
isHeading ? "h1" : "p", // JSXElement
{ className: "text" }, // JSXAttribute (optional)
children, // JSXChildren (optional)
);
}
JSXNamespaceName, JSXMemberExpression์ React์์ ์ฌ์ฉํ์ง ์๋๋ค
๊ฐ์ DOM๊ณผ ๋ฆฌ์กํธ ํ์ด๋ฒ
๋ฆฌ์กํธ์ ํน์ง: ์ค์ DOM์ด ์๋ ๊ฐ์ DOM์ ์ฌ์ฉํด ๋ ๋๋ง์ ์ต์ ํํ๋ค.
์ ๋ง๋ค์์? ์ด๋ป๊ฒ ๋น ๋ฆ? ๊ฐ๋ ์? ์ฃผ์์ ์?
Document Object Model๊ณผ ๋ธ๋ผ์ฐ์ ๋๋๋ง
- DOM: ์น ํ์ด์ง์ ๊ตฌ์กฐํ๋ ํํ์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค
๋ธ๋ผ์ฐ์
๊ฐ ์ฌ์ฉ์๊ฐ ์์ฒญํ ์ฃผ์๋ฅผ ๋ฐฉ๋ฌธํด HTML์ ๋ฐ์์จ๋ค๋ธ๋ผ์ฐ์ ๋๋๋ง ์์ง
์ด HTML์ ํ์ฑํด DOM ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ค (DOM ๋ ธ๋๋ก ๊ตฌ์ฑ๋จ)- 2๋ฒ ๊ณผ์ ์์ CSS ํ์ผ์ ๋ฐ์์จ๋ค
๋ธ๋ผ์ฐ์ ๋๋๋ง ์์ง
์ด CSS๋ฅผ ํ์ฑํด CSSOM ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ค- 2๋ฒ์์ ๋ง๋ DOM ๋ ธ๋๋ฅผ ์ํํ๋ค. ์ฌ์ฉ์์ ๋์ ๋ณด์ด๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
- 5๋ฒ์ ๋ ธ๋๋ฅผ ๋์์ผ๋ก, ํด๋น ๋ ธ๋์ CSSOM ๋ ธ๋๋ฅผ ์ฐพ์ ์ ์ฉํ๋ค.
- ๋ ์ด์์ Layout/reflow: ๋ ธ๋์ ํฌ๊ธฐ์ ์์น๋ฅผ ๊ณ์ฐํ๋ค.
- ํ์ธํ
Painting: ๋
ธ๋๋ฅผ ํ๋ฉด์ ๊ทธ๋ฆฐ๋ค.
(๋ ์ด์์์ด ๋ฐ์ํ๋ฉด ํ์ธํ ๋ ๋ฐ์ํ๋ค)
๋ธ๋ผ์ฐ์ ๋๋๋ง
- How browsers work: Behind the scenes of modern web browsers
- ๋ธ๋ก๊ทธ: How web browsers work - parsing the CSS
๊ฐ์ DOM
๋ ์ด์์๊ณผ ํ์ธํ ์ ๋น์ฉ์ด ํฌ๋ค
- ์ฌ์ฉ์์ ์ํธ์์ฉ์ ๋ฐ๋ผ ๋ ์ด์์๊ณผ ํ์ธํ ์ด ๋ฐ๋ณต๋์ด์ผ ํ๋ค
- ๋ ์ด์์์ด ๋ฐ์ํ๋ฉด ํ์ธํ ๋ ๋ฐ์ํ๋ค
- ์์ ๋ ธ๋์ ๋ ์ด์์์ด ๋ณ๊ฒฝ๋๋ฉด ํ์ ๋ ธ๋์ ๋ ์ด์์๋ ๋ณ๊ฒฝ๋๋ค
SPA์ ๊ฒฝ์ฐ
- ํ๋์ ํ์ด์ง์์ ๊ณ์ํด์ ๋ ์ด์์๊ณผ ํ์ธํ ์ ๋ฐ๋ณตํ๋ค
- ๋ผ์ฐํ ์ด ๋ฐ์ํ๋ฉด, ํค๋, ํธํฐ ๋ฑ์ ์ ์ธํ ๋๋ถ๋ถ์ ๋ ธ๋๊ฐ ๋ณ๊ฒฝ๋๋ค
- DOM์ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํ๊ณ , ๋ณ๊ฒฝ๋ ๋ ธ๋๋ฅผ ์ฐพ์ ๋ ์ด์์๊ณผ ํ์ธํ ์ ๋ฐ๋ณตํ๋ค
๊ฐ์ DOM์ ํ์
react-dom
์ด ๊ด๋ฆฌํ๋ ๊ฐ์ DOM์ ์ค์ DOM๊ณผ ๋์ผํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค- ์น ํ์ด์ง๊ฐ ํ์ํด์ผํ DOM์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํ๋ค
๊ฐ์ DOM์ ์ฅ์
- ๋ ์ ๋ธ๋ผ๋ชจํ(dan_abramov)-๋ฆฌ์กํธ ๊ฐ๋ฐ์: ์ผ๋ฐ DOM์ ๊ด๋ฆฌํ๋ ๊ฑฐ๋ณด๋ค ๋ฌด์กฐ๊ฑด ๋น ๋ฅธ ๊ฒ์ด ์๋. ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์์ ๋งํผ์ ํฉ๋ฆฌ์ ์ด๊ณ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ์ ๊ณต.
๋ฆฌ์กํธ ํ์ด๋ฒ React Fiber
- React Fiber: ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด
- Fiber Reconciler: ๊ฐ์ DOM์ ๊ด๋ฆฌ
- reconcilation: ๊ฐ์ DOM๊ณผ ์ค์ DOM์ ๋ณ๊ฒฝ ์ฌํญ์ ๋น๊ตํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๋ค
๋ฆฌ์กํธ ํ์ด๋ฒ์ ํน์ง
๋ฆฌ์กํธ ํ์ด๋ฒ์ ๋์ ๋ฐฉ์
- ์์ ์ ์์ ๋จ์๋ก ๋ถํ ํ๊ณ , ์ฐ์ ์์๋ฅผ ์ ํ๋ค
- ๋ ๋๋ง์ ์ค๋จํ๊ณ , ๋ค์ ์์ํ ์ ์๋ค
- ์ด์ ์์ ์ ๋ค์ ์ฌ์ฌ์ฉํ๊ฑฐ๋, ํ๊ธฐํ ์ ์๋ค
๋๊ธฐ & ๋น๋๊ธฐ
- (๋๊ธฐ) ๊ณผ๊ฑฐ ๋ฆฌ์กํธ์ ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ stack์ ์ฌ์ฉํ๋ค (์ฑ๊ธ ์ค๋ ๋์ด๋ฏ๋ก ๋ธ๋กํน์ด ๋ฐ์ํ๋ค)
- (๋น๋๊ธฐ) ๋ฆฌ์กํธ ํ์ด๋ฒ๋ linked list๋ฅผ ์ฌ์ฉํด ์์ ์ ๋ถํ ํ๊ณ , ์ฐ์ ์์๋ฅผ ์ ํ๋ค
์์ ๋จ์
- ํ์ด๋ฒ๋ ์์ ๋จ์๋ก ๊ตฌ์ฑ, ์์ ์ ์ฒ๋ฆฌํ๊ณ , finishWork()๋ผ๋ ์์ ์ผ๋ก ๋ง๋ฌด๋ฆฌ
- ์์ ์ ์ปค๋ฐํด ์ค์ DOM์ ๋ฐ์ํ๋ค
๋ฆฌ์กํธ ํ์ด๋ฒ์ ๋จ๊ณ
- ๋๋ ๋จ๊ณ: ์ฌ์ฉ์์๊ฒ ๋ ธ์ถ๋์ง ์๋ ๋น๋๊ธฐ ์์ ์ ์ํํ๋ค. (์: ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์ , ๋ ์ด์์์ ๊ณ์ฐํ๋ ์์ )
- ์ด ๋จ๊ณ์์ ํ์ด๋ฒ: ์ฐ์ ์์๋ฅผ ์ ํ๊ฑฐ๋, ์ค๋จ ๋ฑ
- ์ปค๋ฐ ๋จ๊ณ: ์ค์ DOM์ ๋ฐ์ํ๋ค
- commitWork()๋ฅผ ์คํ, ๋๊ธฐ์์ผ๋ก ์ผ์ด๋๊ณ ์ค๋จ๋ ์ ์๋ค
ํ์ด๋ฒ ๊ฐ์ฒด
- ์ปดํฌ๋ํธ๊ฐ ์ต์ด๋ก ๋ง์ดํธ ๋๋ ์์ ์ ์์ฑ๋์ด, ๊ฐ๊ธ์ ์ฌ์ฌ์ฉ๋จ
function FiberNode(tag, pendingProps, key, mode) {
// Instance
this.tag = tag; // HostComponent(div๊ฐ์ ์์), FunctionComponent, ClassComponent
this.key = key;
this.elementType = null;
this.type = null;
this.stateNode = null; // ํ์ด๋ฒ ์์ฒด์ ๋ํ reference ์ ๋ณด
// Fiber (ํธ๋ฆฌ ๊ตฌ์กฐ)
this.return = null;
this.child = null; // ์ฒซ ๋ฒ์งธ ์์
this.sibling = null; // ๋ค์ ํ์
this.index = 0; // ํ์ฌ ์์์ ์ธ๋ฑ์ค
this.ref = null;
this.refCleanUp = null;
this.pendingProps = pendingProps; // workInProgress์ ๋ํ props
this.memoizedProps = null; // pendingProps๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ๋๋ง๋ ์ดํ์ props๋ฅผ ์ ์ฅ
this.updateQueue = null; // ์ํ ์
๋ฐ์ดํธ, ์ฝ๋ฐฑ ํจ์, ์ดํํธ ๋ฑ์ ์ ์ฅ
this.memoizedState = null;
this.dependencies = null;
this.mode = mode;
// Effects
this.flags = NoFlags;
this.subtreeFlags = NoFlags;
this.deletions = null;
this.lanes = NoLanes;
this.childLanes = NoLanes;
this.alternate = null;
// ์ดํ ํ๋กํ์ผ๋ฌ, __DEV__
}
- state๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋, ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด, ํ์ด๋ฒ ๊ฐ์ฒด๊ฐ ์ ๋ฐ์ดํธ๋๋ค
- ๋ฆฌ์กํธ๊ฐ ํ์ด๋ฒ๋ฅผ ์ฒ๋ฆฌํ ๋, ํ์ด๋ฒ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํด ์์ ์ ์ํํ๋ค
- ์ฐ์ ์์์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ค
Value UI
- ๊ฐ์ ๊ฐ์ง๊ณ ์๋ UI๋ฅผ ๊ด๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- UI๋ฅผ ๋ฌธ์์ด, ์ซ์, ๋ฐฐ์ด ๊ฐ์ผ๋ก ๊ด๋ฆฌ
๋ฆฌ์กํธ ํ์ด๋ฒ ํธ๋ฆฌ
- ํ์ด๋ฒ ํธ๋ฆฌ๋ ๋ฆฌ์กํธ ๋ด๋ถ์ 2๊ฐ์ ํธ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค
- ํ์ฌ ํธ๋ฆฌ(Current)์ ๋์ฒด ํธ๋ฆฌ(WorkInProgress)๋ก ๊ตฌ์ฑ๋๋ค: ๋๋ธ ๋ฒํผ๋ง
- ๋๋ธ ๋ฒํผ๋ง?
- ํ์ฌ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ ธ์ถํ๊ณ , ๋์ฒด ํธ๋ฆฌ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๋ค
- ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋๋ฉด, ํ์ฌ ํธ๋ฆฌ์ ๋์ฒด ํธ๋ฆฌ๋ฅผ ๊ต์ฒดํ๋ค
- ๋ถ์์ ํ ํธ๋ฆฌ๋ฅผ ๋ณด์ฌ์ฃผ์ง ์๊ธฐ ์ํด, ์ปค๋ฐ ๋จ๊ณ์์ ๋๋ธ ๋ฒํผ๋ง์ ์ฌ์ฉํ๋ค
- ๋์
- current์ ๊ธฐ์ค์ผ๋ก ์์ ์์
- ์ ๋ฐ์ดํธ๊ฐ ๋ฐ์ํ๋ฉด, ๋ฆฌ์กํธ์์ ๋ฐ์ ๋ฐ์ดํฐ๋ก workInProgress ํธ๋ฆฌ ๋น๋
- workInProgress ํธ๋ฆฌ ๋น๋๊ฐ ๋๋๋ฉด, ๋ค์ ๋๋๋ง์ ์ฌ์ฉ
- current๊ฐ workInProgress๋ก ๊ต์ฒด๋๋ค
ํ์ด๋ฒ์ ์์ ์์: Depth-First Search
- beginWork(): ํ์ด๋ฒ ์์ ์ ์์ํ๋ค, ์์์ด ์๋ ํ์ด๋ฒ๋ฅผ ๋ง๋ค ๋๊น์ง ์ํํ๋ค
- ๋ง์ฝ ํ์ ๊ฐ ์๋ค๋ฉด, completeWork(): ํ์ด๋ฒ ์์ ์ ์๋ฃํ๋ค.
- ๋ง์ฝ ํ์ ๊ฐ ์๋ค๋ฉด, ํ์ ๋ก ์ด๋ํ๋ค
- 2๋ฒ, 3๋ฒ์ด ๋๋๋ฉด return์ ์ฐพ์ ์ฌ๋ผ๊ฐ, ์์ ์ ์๋ฃํ๋ค
- props๋ฅผ ๋ฐ์ ํ์ด๋ฒ ๋ด๋ถ์์ ์์ ์ ์ํํ๋ค
- ์ฌ๊ท ์ํ ํธ๋ฆฌ ์ ๋ฐ์ดํธ ๊ณผ์ -> ๊ณผ๊ฑฐ ๋๊ธฐ, ํ์ฌ ๋น๋๊ธฐ
์ฐ์ ์์: ์ ๋๋ฉ์ด์ > ์ฌ์ฉ์ ์ ๋ ฅ > ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ > ๋ ์ด์์ ๊ณ์ฐ
ํ์ด๋ฒ์ ๊ฐ์ DOM
- Fiber: ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ 1:1
- ์ค์ DOM์ ๋ฐ์ํ๋ ๊ฒ์ ๋๊ธฐ์ ์ผ๋ก ์ผ์ด๋์ผ ํ๊ณ , ์ฒ๋ฆฌ๋์ด ๋ง์ -> ํ๋ฉด์ ๋ถ์์ ํ๊ฒ ํ์๋ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค
- ์์ ์ ๊ฐ์/๋ฉ๋ชจ๋ฆฌ์์์ ์ํํ๊ณ , ์ต์ข ๊ฒฐ๊ณผ๋ฌผ๋ง ์ค์ ๋ธ๋ผ์ฐ์ ์ ์ ์ฉํ๋ ๊ฒ์ด ๊ฐ์ DOM
- ๊ฐ์ DOM๊ณผ ๋ฆฌ์กํธ์ ํต์ฌ
- ๋น ๋ฅด๊ฒ ๋๋๋งํ๋ ๊ฒ์ด ์๋๋ผ, ๋ถ์์ ํ ํ๋ฉด์ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ์ง ์๋ ๊ฒ / ๋ฐ๋ก ๊ฐ์ผ๋ก UI๋ฅผ ํํํ๋ ๊ฒ
- ์ด๋ฐ ํ๋ฆ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ ๋งค์ปค๋์ฆ