WEB/React

React์˜ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ์™€ ์šฉ์–ด ์ •๋ฆฌ

Happhee.dev 2023. 12. 3. 21:17

 

๐ŸŒผ ๋“ค์–ด๊ฐ€๊ธฐ

๋ชจ๋˜ ๋ฆฌ์•กํŠธ : 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์˜ ๋™์ž‘ ๊ณผ์ •์„ ํ†บ์•„๋ณด๊ธฐ ์œ„ํ•œ ์ค€๋น„๋ฅผ ๋งˆ์ณค๋‹ค.

์˜จ์ „ํžˆ ๋ฐ”๋กœ ์ดํ•ดํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์—ฌ๋Ÿฌ๋ฒˆ ์‚ดํŽด๋ณด๋ฉฐ ์ดํ•ด๋ฅผ ํ†ตํ•ด ์ตํžˆ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๋‚ด์šฉ์ด๋‹ค.

 

 

๐Ÿ“š ์ฐธ๊ณ ์ž๋ฃŒ