-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
214 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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** ์ด๋ผ ํ๋ค. | ||
- |