๐ผ ๋ค์ด๊ฐ๊ธฐ
๋ชจ๋ ๋ฆฌ์กํธ : Deep Dive ์ฑ ์ ์ ๋ ํ๋ ๋์ค, useState์ lazy initialization์ ๋ํ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ์ถ์๋ค.
์ฝ๋ฐฑ ํจ์๋ก ๋๊ธฐ๋ฉด ์ฒ์ ์ด๊ธฐํ์ผ๋๋ง ์คํ๋๋๊ฒ์ผ๊น...?
๋ด๋ถ ๊ตฌ์กฐ๊ฐ ์ด๋ป๊ฒ ๋์ด์๊ธธ๋, ๊ฐ๊ณผ ํจ์, ์ฝ๋ฐฑํจ์์ ์์์ด ๋ค๋ฅด๊ฒ ๋ฐ์๋๋ ๊ฒ์ผ๊น...?
๊ทธ๋ฅ ๊ทธ๋ ๊ตฌ๋..ํ๊ธฐ์๋ ๋๋ฌด ์ดํดํ๊ณ ์ถ์๋ค.
์ด๋ฅผ ์ํด์ React ํจํค์ง์ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด๋ฉฐ useState๋ฅผ ๋ถ๋ฌ์ค๋ react ์ฝ์ด๋ฅผ ์์์ผ ํ๋ค.
๋ฐ๋ผ์ ์ด๋ฒ ๊ธ์์๋ ๋ฆฌ์กํธ์ ํจํค์ง ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด๊ณ ์ ํ๋ค.
โจ React ํจํค์ง ๊ตฌ์กฐ
๋ฆฌ์กํธ ํจํค์ง๋ ์ด 5๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
1๏ธโฃ react ์ฝ์ด
์ปดํฌ๋ํธ ์ ์์ ๊ด๋ จ๋ ํจํค์ง์ด๋ฉฐ, createElement( ) ์ ๋ค๋ฅธ ํจํค์ง์ ๋ชจ๋์ ์ ๊ณตํฉ๋๋ค.
๊ทธ๋ฌ๋, ๋ค๋ฅธ ํจํค์ง์ ์์กด์ฑ์ด ์๊ธฐ์, ์ฌ๋ฌ ํ๋ซํผ์์ element๋ฅผ ๋ง๋ค๊ณ , ๊ทธ๋ฆด ์ ์๋ค.
2๏ธโฃ renderer
react-dom, react-native-renderer๋ฑ ํธ์คํธ. ์ฆ, ํ๋ซํผ์ ์์กด์ ์ธ ํจํค์ง์ด๋ค.
reconciler์ event ํจํค์ง์ ๋ํ ์์กด์ฑ์ ๊ฐ์ง๊ณ ์๋ค.
3๏ธโฃ event ( legacy-events )
react ๋ด๋ถ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ Synthetic Event ๊ฐ์ฒด์ด๋ค.
์ด๊ฒ์ ์ ๋ง๋ค์๋..? ๋ชจ๋ ํ๋ซํผ์์ ๋์ผํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด์์ด๋ค...!!
4๏ธโฃ scheduler
๋ฆฌ์กํธ๋ task ๋จ์๋ก ์์ ์ด ์ด๋ฃจ์ด์ง๋ฉฐ, ํด๋น ์ฐ์ ์์์ ๋ฐ๋ผ ์ค์ผ์ค๋ง ๋์ด์ง๋ค. ์ด๋ฌํ task์ ์คํ ์์๋ฅผ ์๊ณ ์๋ ํจํค์ง๊ฐ ๋ฐ๋ก scheduler์ธ ๊ฒ์ด๋ค. ์ฆ, ๋ฆฌ์กํธ์์ ์ฌ๋ฌ๊ฐ์ง ์์ ์ด ๋น๋๊ธฐ๋ก ์ด๋ฃจ์ด์ง๋, ํด๋น ์ฑ ์์ด ๋ฐ๋ก scheduler์ ์๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ scheduler๋ ํ๋ซํผ์ ์์กด์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
5๏ธโฃ reconciler
๋ฆฌ์กํธ ํจํค์ง ์ค ๊ฐ์ฅ ํต์ฌ์ด๋ค.
hook, scheduler, reconciler๋ ์๋ก ์ฐ๊ด๋์ด์๋ ๋ถ๋ถ์ด ๋ง๊ณ , v16๋ถํฐ๋ fiber ์ํคํ ์ณ๊ฐ ๋์ ๋์๋ค.
๐ element ๐ component
โ element
element๋ DOM Tree ์์ฑ์ ํ์ํ ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด์ด๋ค.
์ปดํฌ๋ํธ ํธ์ถ ์, return ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์ฆ, element ์์ฒด๋ก ๋ฐ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ด ์๋๋ค.
๊ทธ๋์ component์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๋ชจ๋ธ ๊ฐ์ฒด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ฌ์ค JSX๋ babel์ ํตํด react.createElement( )๋ก ๋ณํ๋์ด ์์ฑ๋๋ค.
element๋ type๊ณผ props ๋ ๊ฐ์ง ํ๋๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
const element = {
// This tag allows us to uniquely identify this as a React Element
$$typeof: REACT_ELEMENT_TYPE,
// Built-in properties that belong on the element
type: type, // function App()
key: key, // 1
props: props, // { content: 'deep dive react' }
ref: ref, // undefined
}
- type ๐ DOM ๋ ธ๋ (string) or component instance
- props ๐ ํด๋น ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ์์ฑ๋ค ex) classname, children ...
JSX๋ฅผ ํตํด ํ๊ทธ์ attribute๋ก ๋๊ฒจ์ฃผ๋ ๊ฐ ์ค key, ref๋ฅผ ์ ์ธํ ๋๋จธ์ง๋ ๋ชจ๋ props๋ก ๊ด๋ฆฌ๋๋ค.
// โ
React DOM elements
{
type: 'button',
props: {
className: 'button button-blue',
children: {
type: 'b',
props: {
children: 'OK!'
}
}
}
}
<button class='button button-blue'>
<b>
OK!
</b>
</button>
// โ
React Component element
{
type: Button,
props: {
color: 'blue',
children: 'OK!'
}
}
โ component
component๋ props๋ฅผ ๋ฐ์ element๋ฅผ return ํ๋ function ์ด๋ค.
class์์๋ render( )๋ฅผ ํตํด element๋ฅผ return.
๋ฐ๋ผ์ component๋ element tree๋ฅผ ์บก์ํ ํ๋ค. ์ด ๋ง์, react๋ component์ ์กฐํฉ์ผ๋ก ์ด๋ฃจ์ด์ง๊ธฐ์ ๊ฐ์ฅ ๋ฐ์ ๊น๋ ค์๋ DOM Tag element๋ฅผ ๋ง๋ ๋๊น์ง ํธ๋ฆฌ๋ฅผ ํ๊ณ ๋ด๋ ค๊ฐ๋ฉด์ ํด๋น component๊ฐ ๋ฌด์์ returnํ๋์ง ์ฐพ๊ฒ ๋๋ค.
๋ฆฌ์กํธ ์ปดํฌ๋ํธ์์๋ props๊ฐ input์ด๊ณ ๊ทธ output์ด ๋ฐ๋ก element tree์ด๋ค.
const DeleteAccount = () => ({
type: 'div',
props: {
children: [{
type: 'p',
props: {
children: 'Are you sure?'
}
}, {
type: DangerButton,
props: {
children: 'Yep'
}
}, {
type: Button,
props: {
color: 'blue',
children: 'Cancel'
}
}]
});
// โ
react component
const DeleteAccount = () => (
// โ
element๋ฅผ tree๊ตฌ์กฐ๋ก return
<div>
<p>Are you sure?</p>
<DangerButton>Yep</DangerButton>
<Button color='blue'>Cancel</Button>
</div>
);
์ด๋ ๊ฒ dom ํธ๋ฆฌ์ ์ ๋ฌํ ์ ๋ณด๋ฅผ element ๊ฐ์ฒด๋ก ๋ฆฌํดํ๊ฒ ๋๋ค.
โ๏ธ ๋จ, ์ด๊ฒ์ ์ธ์ ์์ฑ, ๊ฐฑ์ , ์ญ์ ํ ์ง์ ๋ํ ์ฌ๋ถ๋ component๊ฐ ํ๋ ๊ฒ์ด ์๋์ ์ฃผ์ํด๋ผ.โ๏ธ
๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ฌ element๊ฐ ์์ผ ์ ์์ผ๋ฉฐ, DOM ๊ตฌ์กฐ์ ์์กด์ ์ด์ง ์์ UI๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌํํ ์ ์๋ค.
const Form = ({ isSubmitted, buttonText }) => {
if (isSubmitted) {
// Form submitted! Return a message element.
return {
type: Message,
props: {
text: 'Success!'
}
};
}
// Form is still visible! Return a button element.
return {
type: Button,
props: {
children: buttonText,
color: 'blue'
}
};
};
โจ Top - Down Reconciliation
React component์์๋ก๋ถํฐ DOM element๋ฅผ ์์์์๋ถํฐ ํ์๋ก ์ฐพ์๊ฐ๋ ๋ฐฉ์์ด๋ค.
ํด๋น ๊ณผ์ ์ ReactDom.render() , setState( ) ํธ์ถ ์, ๋ฐ์ํ๋ ๊ณผ์ ์ด๋ค. ๋๋ถ์ด ์ด ๊ฒฐ๊ณผ๋ก ๋ฐ์ํ๋ DOM์ ๋ณํ๋ฅผ ์ ๋ฐ์ดํธ ํ๊ฒ ๋๋ค.
๐ ๋ ๋๋ง
์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ์ฌ return react element๋ฅผ ๋ฐ์ผ๋ฉด ์ด๊ฒ์ VDOM์ ์ ์ฉํ๋ ๊ณผ์ ์ด๋ค.
์์ ๋งํ ๊ฒ์ฒ๋ผ ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ๋ฉด react element๊ฐ return ํ๊ฒ ๋๋ค. react๋ ์ด๊ฒ์ VDOM์ ์ฌ์กฐ์ ํ๊ฒ ๋๋ฉฐ ์ฌ๊ธฐ๊น์ง๊ฐ ๋ ๋๋ง ์์ ์ ์ ์์ด๋ค.
์ดํ์ ๋ฐ์๋๋ DOM์ ์ปดํฌ๋ํธ ์ ๋ณด๋ฅผ ์ฃผ์ ํ๋ mount, ๋ธ๋ผ์ฐ์ ๊ฐ DOM์ paintํ๋ ๊ณผ์ ์ ํฌํจ๋์ง ์๋๋ค๋ ๊ฒ์ ์ฃผ์ํ๋ผ.โ๏ธ
๐ Fiber
VDOM์ ๋ ธ๋ ๊ฐ์ฒด์ด๋ค.
๋ ๋๋ง ๊ณผ์ ์์ VDOM์ ์ฌ์กฐ์ ํ๋ค๊ณ ํ๋ค. ์ฌ๊ธฐ์ VDOM์ ์ํด element๊ฐ ํ์ฅ๋ ๊ฐ์ฒด๊ฐ ๋ฐ๋ก Fiber์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฌด์์ด ํ์ฅ๋์์๊น..๐ค...?
๋ฐ๋ก ์ปดํฌ๋ํธ์ ์ํ, life cycle, hook์ด ๊ด๋ฆฌ๋์ด์ง๊ณ ์๋ ๊ณณ์ด๋ค.
ํด๋น ๊ฐ๋ ์ ๋ฆฌ์กํธ์ ํจํค์ง์์ ๊ฐ์ฅ ์ค์ํ๊ฒ ์ฌ์ฉ๋๋ ๊ผญ ๊ธฐ์ตํ๊ธธ ๋ฐ๋๋ค.
๐ ์ ๋ฆฌํ๊ธฐ
๋ฆฌ์กํธ ํจํค์ง๋ค 5๊ฐ์ง์ ๊ฐ๋ ๊ณผ ์ฃผ์ ์ฉ์ด๋ค์ ๋ช ํํ๊ฒ ์ ๋ฆฌํ๋ฉฐ, setState์ ๋์ ๊ณผ์ ์ ํบ์๋ณด๊ธฐ ์ํ ์ค๋น๋ฅผ ๋ง์ณค๋ค.
์จ์ ํ ๋ฐ๋ก ์ดํดํ๊ธฐ ๋ณด๋ค๋ ์ฌ๋ฌ๋ฒ ์ดํด๋ณด๋ฉฐ ์ดํด๋ฅผ ํตํด ์ตํ๋ ๊ฒ์ด ์ค์ํ ๋ด์ฉ์ด๋ค.
๐ ์ฐธ๊ณ ์๋ฃ
'WEB > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ React ] ๋น์ฆ๋์ค ๋ก์ง ๋ถ๋ฆฌํ๊ธฐ (0) | 2023.12.09 |
---|---|
์ก์ /๊ณ์ฐ/๋ฐ์ดํฐ๋ฅผ ํ์ฉํ useMuation ๊ธฐ๋ฅ ๊ฐ์ (3) | 2023.12.07 |
[ React ] useQuery ์ useMuataion๋ฅผ ํ์ฉํ ๊ธฐ๋ฅ๊ฐ์ (0) | 2023.11.30 |
[ ๋ชจ๋ ๋ฆฌ์กํธ : Deep Dive ] - ๋ฆฌ์กํธ ๊ฐ๋ฐ์์ ๋ฐ๋์ ์์์ผํ๋ JS (0) | 2023.11.28 |
[ ๋ชจ๋ ๋ฆฌ์กํธ : Deep Dive ] - ๋ฆฌ์กํธ์ ๋ํด (1) | 2023.11.13 |