Skip to content

Commit

Permalink
๐Ÿ“ ๋ฐฑ๊ด‘์ธ 2024-03-08
Browse files Browse the repository at this point in the history
  • Loading branch information
RookieAND committed Mar 9, 2024
1 parent 993e5e8 commit eb288a3
Showing 1 changed file with 214 additions and 0 deletions.
214 changes: 214 additions & 0 deletions docs/RookieAND/dil/2024-03-08.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
# โœ’๏ธ JSX

### โœ๏ธ JSX ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

> JSX is a syntax extension for JavaScript that lets you write HTML-like markup inside a JavaScript file.
- JSX ๋Š” Meta ์—์„œ ๋…์ž์ ์œผ๋กœ ๊ฐœ๋ฐœํ•œ JS ๋‚ด์— HTML Markup ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๋ฌธ๋ฒ• ํ™•์žฅ ๊ธฐ๋Šฅ์ด๋‹ค.
- ECMAScript ๋‚˜ V8 ์—”์ง„์˜ ํ‘œ์ค€์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— JSX ์ฝ”๋“œ๋ฅผ ๊ทธ๋ƒฅ ์‹คํ–‰ํ•˜๋ฉด ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋ฉฐ, babel ๊ณผ ๊ฐ™์€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•œ ํ›„ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

# โœ’๏ธ JSX ์˜ ๊ตฌ์กฐ

JSX ๋Š” `JSXElement`, `JSXAttributes`, `JSXChildren`, `JSXString` ์˜ 4๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

### โœ๏ธ JSXElement

- JSX ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์š”์†Œ์ด๋ฉฐ, HTML Element ์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.
- JSXElement ๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜ ๋ชฉ๋ก ์ค‘ ํ•˜๋‚˜์˜ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•ด์•ผ ํ•œ๋‹ค.

1. JSXOpeningElement : ํŠน์ • ์š”์†Œ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์—ด๋ ธ์„ ๊ฒฝ์šฐ ์“ฐ์ธ๋‹ค (JSXClosingElement ์™€ ํ•œ ์Œ์„ ์ด๋ค„์•ผ ํ•œ๋‹ค.)
2. JSXClosingElement : ์•ž์„  ์š”์†Œ๊ฐ€ ์—ด๋ ธ์„ ๊ฒฝ์šฐ ์ด๋ฅผ ๋‹ซ๊ธฐ ์œ„ํ•ด ์“ฐ์ด๋Š” ํ˜•ํƒœ๋‹ค.
3. JSXSelfClosingElement : ์š”์†Œ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ์Šค์Šค๋กœ ์ข…๋ฃŒ๋˜๋Š” ํ˜•ํƒœ์ด๋‹ค.
4. JSXFragment : ํŠน์ • ์š”์†Œ๋ฅผ ๋‚ดํฌํ•˜๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ, ์ฃผ๋กœ ๋‹ค๋ฅธ JSX ๋ฅผ ๊ทธ๋ฃนํ•‘ํ•  ๋•Œ ์“ฐ์ธ๋‹ค.

### โœ๏ธ JSXElementName

- JSXElementName ์€ JSXElement ์š”์†Œ ๋ช…์œผ๋กœ ์“ฐ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

1. JSXIdentifier : Javascript ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‹๋ณ„์ž
2. JSXNamespaceName : `:` ์„ ํ†ตํ•ด ๋‘ ๊ฐœ์˜ JSXIdentifier ๋ฅผ ์ด์€ ์‹๋ณ„์ž. 3๊ฐœ ์ด์ƒ์€ ๋ถˆ๊ฐ€ํ•˜๋‹ค.
3. JSXMemberExpression: `.` ์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ JSXIdentifier ๋ฅผ ์ด์€ ์‹๋ณ„์ž.

```jsx
// JSXNamespaceName
<Foo:bar></Foo:bar>

// JSXMemberExpression
<Layout.Navbar.Item></Layout.Navbar.Item>
```

### โœ๏ธ JSXAttribute

- JSXElement ์— ๋ถ€์—ฌ ๊ฐ€๋Šฅํ•œ ์†์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค.
- ๋‹จ์ˆœ ์†์„ฑ์„ ์˜๋ฏธํ•˜๊ธฐ์— **Require ํ•œ ๊ฐ’์€ ์•„๋‹ˆ๋ฉฐ** JSXElement ๋‚ด๋ถ€์—์„œ ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ ๋ฌธ๋ฒ•์ ์ธ ์˜ค๋ฅ˜๋Š” ์•„๋‹ˆ๋‹ค.

1. JSXSpreadAttributes: JS ์˜ Spread Operator ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ ์“ฐ์ด๋Š” ํ‘œํ˜„์‹์„ ํ•œ๋ฒˆ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์ด๋‹ค.
2. JSXAttribute : ์†์„ฑ์˜ key ์™€ value ๋ฅผ ํ•œ ์Œ์œผ๋กœ ํ‘œํ˜„ํ•œ ๋ฐฉ์‹์ด๋‹ค. ํ‚ค๋Š” JSXAttributeKey, ๊ฐ’์€ JSXAttributeValue ๋กœ ๋ถˆ๋ฆฐ๋‹ค.
- `JSXAttributeValue` ์—๋Š” ๋ฌธ์ž์—ด (ํฐ ๋”ฐ์˜ดํ‘œ, ์ž‘์€ ๋”ฐ์˜ดํ‘œ) ๋ฐ ๋‹ค๋ฅธ JSXElement ๋„ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
- ์ถ”๊ฐ€๋กœ `JSXAttributeValue` ์—๋Š” JS ์—์„œ ์“ฐ์ด๋Š” AssignmentExpression, ์ฆ‰ ๊ฐ’์˜ ํ• ๋‹น์— ์“ฐ์ด๋Š” ํ‘œํ˜„์‹๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
3. JSXElement : JSX ์˜ ์†์„ฑ์œผ๋กœ ๋˜ ๋‹ค๋ฅธ JSXElement ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
- ๋ณดํ†ต ์†์„ฑ์œผ๋กœ JSXElement ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ์ค‘๊ด„ํ˜ธ๋ฅผ ์”Œ์šฐ๋Š”๋ฐ, ์ด๋Š” Prettier ์˜ ์„ค์ •์œผ๋กœ ์ธํ•œ ๋ณ€ํ™˜์ด์ง€ ๋ฌธ๋ฒ•์ ์œผ๋กœ๋Š” ์—†์–ด๋„ ๋œ๋‹ค.
4. JSXFragment : ๋ณ„๋„์˜ ์†์„ฑ์„ ๊ฐ€์ง€์ง€ ์•Š๋Š” Fragment ๋˜ํ•œ JSXElement ์˜ ์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋‹ค.

### โœ๏ธ JSXChildren

- JSX ๋Š” ์†์„ฑ์„ ๊ฐ€์ง„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ œ์ž‘๋˜์—ˆ์œผ๋ฏ€๋กœ ๋ถ€๋ชจ ์ž์‹ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ ์ž์‹ ๊ด€๊ณ„์— ๋†“์ธ Element ๋ฅผ `JSXChildren` ๋ผ๊ณ  ํ•œ๋‹ค.
- JSXChildren ์€ 0๊ฐœ ์ด์ƒ์˜ JSXChild ๋กœ ๊ตฌ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜๋„, ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
- JSXChild ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ์˜ ๋ชฉ๋ก์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1. JSXText : `{`, `}`, `<`, `>` ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ฌธ์ž์—ด์„ ์˜๋ฏธํ•œ๋‹ค. JSX ๋ฌธ๋ฒ•๊ณผ ํ˜ผ๋™์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๋Š” ์ œ์™ธ๋œ๋‹ค. (์ œ์™ธ๋œ ๋ฌธ์ž๋Š” ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ธ์„œ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.)
2. JSXElement
3. JSXFragment
4. { JSXChildExpression } : JSXChildExpression ๋Š” JS ์˜ AssignmentExpression ์„ ์˜๋ฏธํ•œ๋‹ค.

```js
// JSXText ๊ฐ€ JSXChild ๋กœ ๊ตฌ์„ฑ๋œ JSXElement.
<>JSXText ์ž…๋‹ˆ๋‹ค.</>
<>{ '{}, <>' }</> // ์ œ์™ธ๋œ ๋ฌธ์ž๋„ ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

// JSXChildExpression, JS ์˜ AssignmentExpression ์— ํ•ด๋‹น๋˜๋Š” ๋ฌธ๋ฒ•๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
<>{() => 'foo'}</>
<>{() => <OtherComponent />}</> // = <><OtherComponent></>
```

### โœ๏ธ JSXString

- HTML ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด์„ ์‰ฝ๊ฒŒ JSX ์—์„œ๋„ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ๊ณ ์•ˆ๋œ ์žฅ์น˜์ด๋‹ค.
- `\`, `"`, `'` ๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์€ ๋ณ„๋„์˜ ์ด์Šค์ผ€์ดํ”„ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

# โœ’๏ธ JSX ์˜ ๋ณ€ํ™˜ ๊ณผ์ •

### โœ๏ธ @babel/plugin-trasform-react-jsx

- ๊ธฐ๋ณธ์ ์œผ๋กœ JSX ๋Š” ES ๋ฌธ๋ฒ•์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ‘œ์ค€ ๋ฌธ๋ฒ•์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.
- Meta ์—์„œ๋Š” babel ๋‚ด `@babel/plugin-trasform-react-jsx` plugin ์„ ์‚ฌ์šฉํ•˜์—ฌ JSX ๋ฅผ ReactElement ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ•œ๋‹ค.

> ์–ด๋–ป๊ฒŒ babel ์—์„œ๋Š” ๋ณ„๋„์˜ ์žฅ์น˜ ์—†์ด JSX ๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๊ฑธ๊นŒ?
- React 17 ์ด์ „์—๋Š” JSX ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ ์ตœ์ƒ๋‹จ์— ๋ฌด์กฐ๊ฑด `import React from 'react'` ๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ–ˆ๋‹ค.
- ์ด๋Š” JSX ๊ฐ€ `React.createElement` ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์— **๋ฐ˜๋“œ์‹œ React ๋ชจ๋“ˆ์„ ์ฐธ์กฐํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ**์ด๋‹ค.
- ํ•˜์ง€๋งŒ React 17 ์ดํ›„์—๋Š” JSX ๋ฅผ ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์‹œ, ํŠธ๋žœ์Šค ํŒŒ์ผ๋ง ๊ณผ์ •์—์„œ `'react/jsx-runtime'` ๋ชจ๋“ˆ์„ ์ฐธ์กฐํ•˜๋„๋ก ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.
- ์ด ๋•์— ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ด์ƒ JSX ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ ์ตœ์ƒ๋‹จ์— React ๋ฅผ import ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

```jsx
const Component = (
<A option="a" key="b">
Hello World
</A>
);

// React 17 ์ด์ „ ๋ณ€ํ™˜ ๊ฒฐ๊ณผ
// createElement(Component, props, children) ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜๋œ ๊ฒฐ๊ณผ๋‹ค.
var Component = React.createElement(
A,
{ option: 'a', key: 'b' },
'Hello World'
);

// React 17 ์ดํ›„ ๋ณ€ํ™˜ ๊ฒฐ๊ณผ
import { jsx as _jsx } from 'react/jsx-runtime';

var Component = _jsx(
A,
{
option: 'a',
children: 'Hello World',
},
{ key: 'b' }
);
```

- ๊ธฐ์กด์—๋Š” Children ์„ ๊ฐ€๋ณ€ ์ธ์ž (3๋ฒˆ์งธ ์ธ์ž ์ดํ›„) ๋กœ ๋ฐ›์•˜์œผ๋‚˜ ์ด์ œ๋Š” props ๋กœ ๋ฐ›๋Š”๋‹ค.
- ๋” ์ด์ƒ props ์— key ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  ๋ณ„๋„์˜ ์ธ์ž๋กœ ๋„˜๊ฑฐ์•ผ ํ•œ๋‹ค.
- ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋” ์ด์ƒ defaultProps ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. (๋”ฑํžˆ ํ•„์š”ํ•˜์ง€๋„ ์•Š์•˜๊ณ ..)

### โœ๏ธ JSX ๊ฐ€ ๋ณ€ํ™˜๋˜๋Š” ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋ง

- ๊ธฐ์กด์—๋Š” props ์˜ ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•˜๋„๋ก ์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋‚˜, ์ฑ…์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฆฌํŒฉํ„ฐ๋ง ๋ฐฉ์‹์„ ์ œ์•ˆํ–ˆ๋‹ค.
- ํ•˜์ง€๋งŒ ๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ์œผ๋กœ๋Š” ๊ตณ์ด `createElement` ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์•„๋ž˜์ฒ˜๋Ÿผ ๋ Œ๋”๋ง ํ•  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์ „์— ํ• ๋‹นํ•œ ํ›„ ๋„˜๊ฒจ๋„ ๋˜์ง€ ์•Š๋‚˜ ์‹ถ๋‹ค.

```tsx
// AS - IS : isHeading props ์˜ ๊ฐ’์— ๋”ฐ๋ผ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง ์ง„ํ–‰
const TestHeading = ({ isHeading, children }: PropsWithChildren<PropsType>) => {
return isHeading ? <h1>{children}</h1> : <p>{children}</p>
}

// Book's Solution, createElement ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ์ฃผ์ฒด ๋ณ€๊ฒฝ
const TestHeading = ({ isHeading, children }: PropsWithChildren<PropsType>) => {
return createElement(isHeading ? 'h1' : 'p', {}, children)'
}

// My Solution : ๊ตณ์ด createElement ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ Œ๋”๋ง ์ฃผ์ฒด (JSXElement) ๋ณ€๊ฒฝ
const TestHeading = ({ isHeading, children }: PropsWithChildren<PropsType>) => {
const RenderComponent = isHeading ? 'h1' : 'p'
return <RenderComponent>{children}</RenderComponent>
}
```
# โœ’๏ธ VDOM ๊ณผ React Fiber
### โœ๏ธ DOM ๊ณผ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •
DOM ์€ ๋ฌธ์„œ (document) ์™€ ๋ฌธ์„œ ๋‚ด๋ถ€์˜ ์š”์†Œ (Element) ์— JS ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ Object ๋‹ค.
> ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŠน์ • ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ๋ Œ๋”๋ง ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
1. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ HTML ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์—”์ง„์ด ์ด๋ฅผ ํŒŒ์‹ฑํ•˜๋„๋ก ํ•œ๋‹ค.
2. ํŒŒ์‹ฑ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ DOM ๋…ธ๋“œ๋ฅผ ์กฐ๋ฆฝํ•˜์—ฌ DOM ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค.
3. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ CSS ํŒŒ์ผ์„ ์ธ๊ณ„ ๋ฐ›๋Š”๋‹ค๋ฉด ์ด๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ CSSOM ์„ ๋งŒ๋“ค๊ณ , ์กฐ๋ฆฝํ•˜์—ฌ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค.
4. ์ƒ์„ฑ๋œ DOM ํŠธ๋ฆฌ ๋‚ด ์š”์†Œ ์ค‘์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์ง€๋Š” ์š”์†Œ๋ฅผ ์„ ๋ณ„ํ•œ๋‹ค.
5. ์„ ๋ณ„๋œ DOM ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•˜์—ฌ ๋งค์นญ๋˜๋Š” CSSOM ๋…ธ๋“œ๋ฅผ ์ ์šฉํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ฉ์ณ์ง„ ํŠธ๋ฆฌ๋ฅผ Render Tree ๋ผ ํ•œ๋‹ค.
6. ๋ Œ๋” ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋ถ€ํ„ฐ ๊ฐ ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ํ™”๋ฉด์— ์–ด๋Š ์œ„์น˜์— ๋†“์—ฌ์•ผ ํ•˜๋Š”์ง€๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ์ด๋ฅผ Layout ๊ณผ์ •์ด๋ผ ํ•œ๋‹ค.
7. ๋ ˆ์ด์•„์›ƒ ๊ณผ์ •์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ๋ Œ๋” ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ํ™”๋ฉด์— ํŽ˜์ธํŒ…์„ ์‹œ์ž‘ํ•œ๋‹ค. ์ด๋ฅผ Painting ๊ณผ์ •์ด๋ผ ๋ถ€๋ฅธ๋‹ค.
- ๊ณผ๊ฑฐ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ด€๋ จ ์ •๋ฆฌ ๊ธ€ : https://velog.io/@rookieand/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94-%EA%B1%B8%EA%B9%8C
### โœ๏ธ VDOM ์˜ ํƒ„์ƒ ๋ฐฐ๊ฒฝ
1. ๋น„์‹ผ ๋ Œ๋”๋ง ๋น„์šฉ
- ํŠน์ • ์š”์†Œ์˜ ์Šคํƒ€์ผ ํ˜น์€ ๋‚ด๋ถ€ ์š”์†Œ์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ Œ๋”๋ง ๊ณผ์ •์„ ์žฌ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.
- ์ด๋Ÿฌํ•œ ๊ณผ์ •์€ **Reflow** ์™€ **Repaint** ๋กœ ๋‚˜๋‰˜๋Š”๋ฐ, Reflow ์˜ ๊ฒฝ์šฐ ํ•„์—ฐ์ ์œผ๋กœ Repaint ์ž‘์—…๊นŒ์ง€ ์ˆ˜ํ–‰ํ•˜๊ธฐ์— **๋ Œ๋”๋ง ๋น„์šฉ์ด ๋น„์‹ธ๋‹ค.**
2. SPA ์˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ
- ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (SPA) ์˜ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ํ™”๋ฉด์—์„œ ๊ฐ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ์„ค๊ณ„ํ•˜๊ณ  ๊ทธ๋ ค์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— DOM ์„ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ๋“œ๋Š” ๋น„์šฉ์ด ๋†’๋‹ค.
> ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฐœ๋…์ด ๋ฐ”๋กœ ๊ฐ€์ƒ ๋” (Virtual DOM) ์ด๋‹ค.
`react-dom` ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” Virtual DOM Tree ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜๊ณ , React ์—์„œ DOM ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ Trigger ํ•  ๊ฒฝ์šฐ VDOM ์— ์šฐ์„  ๋ฐ˜์˜ํ•˜์—ฌ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋  ๊ฒฝ์šฐ ์‹ค์ œ DOM Tree ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ Update ํ•œ๋‹ค.
- VDOM ์€ ์ ˆ๋Œ€๋กœ ์ผ๋ฐ˜ DOM ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค **๊ฒฐ์ฝ” ๋น ๋ฅด์ง€ ์•Š๋‹ค**. ์˜คํžˆ๋ ค ๋ Œ๋”๋ง์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •์ด ์ถ”๊ฐ€๋œ ์…ˆ์ด๋ผ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ๋Š” ๋” ์„ฑ๋Šฅ์ด ๋Š๋ฆด ์ˆ˜ ์žˆ๋‹ค.
- ์ตœ๊ทผ ๋“ฑ์žฅํ•œ ์›น ํ”„๋ ˆ์ž„์›Œํฌ (SolidJS, Svelte) ์˜ ๊ฒฝ์šฐ์—๋Š” ์‹ค์ œ DOM ์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜์—ฌ Virtual DOM ์ด ๊ฐ€์ง„ ํ•œ๊ณ„๋ฅผ ํƒ€ํŒŒํ•˜๋Š” ๋ชจ์Šต์„ ๋ณด์˜€๋‹ค.
### โœ๏ธ Reconciliation
์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง์ด ์ง„ํ–‰๋  ๊ฒฝ์šฐ, ๊ธฐ์กด์˜ DOM Tree ์™€ ์ƒˆ๋กญ๊ฒŒ ๊ตฌ์ถ•๋œ DOM Tree ๊ฐ„์˜ ๋น„๊ต ์‚ฌํ•ญ์„ ์•Œ์•„์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
๋‘ ํŠธ๋ฆฌ ๊ฐ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋น„๊ตํ•˜๊ณ  ๋งŒ์•ฝ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์ด๋ฅผ ์‹ค์ œ DOM Tree ์— ์ ์šฉํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๋Š”๋ฐ, ์ด๋•Œ ๋‘ ํŠธ๋ฆฌ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์„ **์žฌ์กฐ์ • (Reconciliation)** ์ด๋ผ ํ•œ๋‹ค.
๋‹ค๋งŒ N ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๋‘ ํŠธ๋ฆฌ ๊ฐ„์˜ ๋น„๊ต๋ฅผ ์œ„ํ•ด์„œ๋Š” `O(n^3)` ์˜ ๋ณต์žก๋„๊ฐ€ ๋“ค๊ธฐ ๋•Œ๋ฌธ์— React ์—์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฐ€์ •์„ ํ†ตํ•œ ํœด๋ฆฌ์Šคํ‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ธ์›Œ ๋ณต์žก๋„๋ฅผ `O(n)` ์œผ๋กœ ๋‚ฎ์ท„๋‹ค.
1. Element ์˜ ํƒ€์ž…์ด ๋‹ฌ๋ผ์งˆ ๊ฒฝ์šฐ ํ•ด๋‹น Element ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
2. **key props** ๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ ํ•ด๋‹น Element ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
### โœ๏ธ React Fiber ์˜ ๋“ฑ์žฅ ๊ณ„๊ธฐ
๊ธฐ์กด ์žฌ์กฐ์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌ์กฐ๋Š” Stack ๊ธฐ๋ฐ˜์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์Šคํƒ์— ํ•„์š”ํ•œ ์ž‘์—…์„ ์ ์žฌ์‹œํ‚ค๊ณ  ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ–ˆ๋‹ค.
๊ณผ๊ฑฐ์—๋Š” ํ•ด๋‹น Stack ์— ๋“ค์–ด๊ฐ„ **์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์—…์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ๋™๊ธฐ์ ์œผ๋กœ ์ด๋ฅผ ์ง„ํ–‰**ํ–ˆ๊ธฐ์— ๋•Œ๋ฌธ์— ์ค‘๊ฐ„์˜ ์ž‘์—…์„ ์ทจ์†Œํ•˜๊ฑฐ๋‚˜ ์ž‘์—… ๊ฐ„์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์—ˆ๊ณ , ์ค‘๊ฐ„์— ์ž‘์—…์ด ์ง€์—ฐ๋  ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง๋„ ๊ฐ™์ด ์ง€์—ฐ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
์ฆ‰, ์—ฌ๋Ÿฌ ์ž‘์—… ๊ฐ„์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊นก๊ทธ๋ฆฌ ๋ฌด์‹œํ•œ ์ฑ„ ํ™”๋ฉด์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ **ํ•˜๋‚˜์˜ ํฐ ํƒœ์Šคํฌ๋กœ ๋†“๊ณ  ์‹คํ–‰ํ•˜๋˜ ๊ฒƒ**์ด ๊ธฐ์กด์˜ Stack Reconciliation ์˜ ๋ฌธ์ œ์˜€๋‹ค.
- ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐ๋ ‰์…˜์— ๊ธฐ๋ฐ˜ํ•œ ํ™”๋ฉด ๋ณ€๊ฒฝ์„ ์œ ๋ฐœํ•˜๋Š” ์ž‘์—…์ด ์งง์€ ์‹œ๊ฐ„ ๋‚ด์— ๋‹ค์ˆ˜ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. (Input ์— ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๊ฒ€์ƒ‰ ๋ชฉ๋ก์ด ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ)
- API ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์‘๋‹ต ์ฒ˜๋ฆฌ๋Š” ๋น„๊ต์  ํ›„์ˆœ์œ„๋กœ ๋‘์–ด๋„ ์‚ฌ์šฉ์ž์˜ UX ๊ฒฝํ—˜์—๋Š” ์ง€์žฅ์ด ์—†์œผ๋‚˜, Input ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.
- ์ด๋Š” Call Stack ์— ๋งŽ์€ ์–‘์˜ ์ž‘์—…์„ ์ ์žฌ์‹œํ‚ฌ ๊ฒƒ์ด๊ณ , ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ์ž‘์—…๋„ ๋ชจ๋‘ ์™„๋ฃŒ๊ฐ€ ๋˜์–ด์•ผ์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์ด ์žฌ๊ฐœ๋˜๊ธฐ์— ์‚ฌ์šฉ์ž๋กœ ํ•˜์—ฌ๊ธˆ UX ๋ฅผ ์ €ํ•˜์‹œํ‚ค๋Š” ์š”์ธ์ด ๋œ๋‹ค.
๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด React 16 ๋ฒ„์ „ ์ด์ƒ๋ถ€ํ„ฐ๋Š” ๊ธฐ์กด์˜ Stack ๋ฐฉ์‹์ด ์•„๋‹Œ **React Fiber** ๋ผ๋Š” ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ณ๊ฐ€ ๋„์ž…๋˜์—ˆ๋‹ค.
### โœ๏ธ React Fiber
- React Fiber ๋Š” ๊ฐ๊ฐ์˜ ์ž‘์—…์— ๋Œ€ํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ๊ณ  ์ด์— ๋Œ€ํ•œ ์ผ์‹œ ์ •์ง€, ์žฌ๊ฐ€๋™, ์šฐ์„  ๊ฐ€๋™์„ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ **incremental rendering** ์ด๋ผ ํ•œ๋‹ค.
-

0 comments on commit eb288a3

Please sign in to comment.