๐Ÿ“… Weekly Paper - (React)

๊น€ํ˜„์šฐยท2024๋…„ 7์›” 17์ผ
0

Codeit

๋ชฉ๋ก ๋ณด๊ธฐ
5/8
post-thumbnail

๐Ÿ“… ์ฃผ๊ฐ„ ํ˜„ํ™ฉ ๋ณด๊ณ 

1-0. ์ž‘์„ฑ ๋ชฉ์  ๋ฐ ๋ชฉ์ฐจ

์ด๋ฒˆ 4์ฃผ์ฐจ Weekly Paper ์—์„œ๋Š”

  1. ์ด๋ฒˆ์ฃผ ๊ฐ•์˜ ํ›„๊ธฐ ๋ฐ ์Šค์Šค๋กœ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ
  2. React๊ฐ€ ๋ Œ๋”๋ง ํ•˜๋Š” ๋ฐฉ์‹
  3. React์—์„œ Virtual Dom์ด ๋ฌด์—‡์ธ์ง€
  4. React์—์„œ์˜ ์ปดํฌ๋„ŒํŠธ๋ž€ ๋ฌด์—‡์ธ์ง€
  5. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ, ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ์ฐจ์ด์ 

์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.


1-1. ๊ฐ•์˜ ํ›„

์ด๋ฒˆ์ฃผ์—” ์ฃผ๋กœ ๋ฐฐ์šด๊ฒŒ
๋น„๋™๊ธฐ, API์š”์ฒญ, ๋ชจ๋“ˆ ๊ฐœ๋…์ด์—ˆ๋‹ค.

async/await then์ด๋‚˜ try/catch
axios๋‚˜ node.js๊ฐ™์€๊ฒƒ๋“ค ?

๋ญ”๊ฐ€ ๋ฐฐ์šฐ๋ฉด ๋ฐฐ์šธ์ˆ˜๋ก ํ• ์ˆ˜์žˆ๋Š” ํญ์ด ๋„“์–ด์ง€๋Š”๊ฒƒ ๊ฐ™์•„์„œ
์žฌ๋ฐŒ๊ธฐ๋„ ํ•˜๋‹ค, ์‹ค์Šต์‹œ๊ฐ„์ด ์กฐ๊ธˆ ์—ฌ์œ ๊ฐ€ ์žˆ๋Š”ํŽธ์ด๋ผ
๊ทธ๋ƒฅ ๋ฐ›์€๊ฑฐ๋กœ ์ด๋ž˜์ €๋ž˜ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์žˆ๋Š”๋ฐ

๋ญ”๊ฐ€ ์ƒ๊ฐํ•˜๋Š”๊ฒŒ ์กฐ์žกํ•˜๊ฒŒ๋‚˜๋งˆ ๋งŒ๋“ค์–ด์ง€๊ธด ํ•˜๋‹ˆ๊นŒ
์žฌ๋ฐŒ๊ธฐ๋„ ํ•˜๊ณ , ๋‚˜์ค‘์— ์ข€ ๋” ๋ฐฐ์šฐ๊ณ  ๋‚˜๋ฉด
์ข€ ์ œ๋Œ€๋กœ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ํ•˜๋‚˜ ํ•ด๋ณด๊ณ ์‹ถ๋‹ค!

๊ทผ๋ฐ ์•„๋ฌด๋ž˜๋„ ๋ญ”๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ชผ๊ฐ ๋‹ค๊ณ ํ•ด์•ผํ•˜๋‚˜?
๊ทธ๋Ÿฐ ๊ฐœ๋…์— ์žˆ์–ด์„œ ์•„์ง ์ƒ๊ฐ์˜ ํ‹€์ด ๋œ ์—ด๋ ค์žˆ๋Š”๊ฑฐ๊ฐ™๋‹ค.
๋‹ค๋ฅธ์‚ฌ๋žŒ๋“ค ์ฝ”๋“œ๋ณด๋ฉด ์•„~ ์ด๋ ‡๊ฒŒ๋„ ์งœ๋Š”๊ตฌ๋‚˜ ์‹ถ์€๋ฐ
์•„์ง ๊ทธ ์ •๋„๊นŒ์ง€๋Š” ์ƒ๊ฐ์ด ๋„๋‹ฌํ•˜์ง€ ์•Š๋Š”๊ฒƒ๊ฐ™๊ณ ..

axios๊ฐ€ ์ง„์งœ ๋ง๋„์•ˆ๋˜๊ฒŒ ํŽธํ•˜๋‹ค๋Š”๊ฑฐ๋Š” ์ž˜ ์•Œ์•˜๋‹ค..

์•„! ๊ทธ๋ฆฌ๊ณ  ํŒŒํŠธ1์ด ๋๋‚ฌ๋‹ค!!
๋ฒŒ์จ ํ•œ๋‹ฌ์ง€๋‚ฌ๋‹ค๊ณ ? ๋ง์ด ์•ˆ๋œ๋‹ค..


1-2. ์ฃผ๊ฐ„ ์‹ค๊ธฐ

์ด๋ฒˆ์ฃผ ์‹ค๊ธฐ๋Š” ์•„๋ฌด๋ž˜๋„ API์š”์ฒญ ์ด ๋ฉ”์ธ์ด๋‹ค๋ณด๋‹ˆ
๋”ฑํžˆ ์Šคํฌ๋ฆฐ์ƒท์„ ๋‚จ๊ธธ๊ฑด ์—†์–ด์„œ..
์•„๋งˆ ๋‹ค์Œ์ฃผ์— ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ๋‚˜๋ฉด ์˜ฌ๋ฆฌ์ง€ ์•Š์„๊นŒ?

๊ทธ๋ฆฌ๊ณ  ์ด๋ž˜์ €๋ž˜ ์ฐพ๋‹ค๊ฐ€ JSDoc ๋ ˆํผ๋Ÿฐ์Šค ๋ผ๋Š”๊ฑธ ์ฐพ์•˜๋Š”๋ฐ
์ด๊ฑฐ ์ง„์งœ ๊ดœ์ฐฎ์€๊ฒƒ๊ฐ™๋‹ค.

์ข€ ์˜ˆ~์ „์— ์งœ๋‘” ํ•จ์ˆ˜๊ฐ™์€๊ฑฐ
์•„.. ์ด๊ฑฐ ๋ญ๋”๋ผ ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ
๋ฐ”๋กœ๋ฐ”๋กœ ์•Œ๋ ค์ฃผ๋‹ˆ๊นŒ ์ •๋ง์ข‹์Œ

๊ทธ๋Ÿฌ๋ฉด ๋ณธ๋ฌธ์œผ๋กœ!


2. Virtual DOM์ด๋ž€?

vdomPic

Virtual DOM์€ ๋ญ˜๊นŒ?
์ผ๋‹จ ํ•œ๋ฒˆ ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ณด์ž.

์ด Virtual DOM์€ React Element๋ผ๋Š” ๊ฐ์ฒด๊ฐ’๋“ค์˜ ๋ชจ์ž„์ด๊ณ 
๊ฒฐ๋ก ์ ์œผ๋กœ๋Š” ๊ทธ๋ƒฅ "๊ฐ’"์ด๋‹ค, JS์˜ ๊ฐ’์ด๊ณ , ๊ฐ์ฒดํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค.
์‹ค์ œ DOM์ด๋ผ๊ณ ๋Š” ํ•  ์ˆ˜ ์—†๊ณ , ๋ณต์‚ฌ๋ณธ์ •๋„์— ํ•ด๋‹นํ•œ๋‹ค.

๋ผ๊ณ  ์„ค๋ช… ํ•  ์ˆ˜๋„ ์žˆ๊ณ .

Virtual DOM(VDOM)์€ UI์˜ ์ด์ƒ์ ์ธ ๋˜๋Š” ๊ฐ€์ƒ(Virtual)์ ์ธ ํ‘œํ˜„์ด ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ณ  ReactDOM๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด "์‹ค์ œ" DOM๊ณผ ๋™๊ธฐํ™” ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…์ด๋‹ค, ๊ทธ๋ฆฌ๊ณ  ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์žฌ์กฐ์ •(Reconciliation)์ด๋ผ ๋ถ€๋ฅธ๋‹ค.

๋ผ๊ณ  ๋ฆฌ์•กํŠธ ๊ณต์‹๋ฌธ์„œ์—์„œ๋Š” ์„ค๋ช…ํ•˜๊ณ ์žˆ๋‹ค.

React Element๊ฐ€ ๋ญ”์ง€, ๋”์˜ ๋ณต์‚ฌ๋ณต์ •๋„์— ํ•ด๋‹นํ•œ๋‹ค๋Š”๊ฒŒ ๋ญ”์†Œ๋ฆฌ์ธ์ง€
DOM๊ณผ ๋™๊ธฐํ™”ํ•˜๋Š”๊ฒŒ ๋ญ๊ณ , ์žฌ์กฐ์ •์ด ์ •ํ™•ํžˆ ๋ญ”์ง€, ์•„์ง ๋ชจ๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

๋‹น์žฅ์€ ๋Š๋‚Œ์ด ์˜ค์ง€ ์•Š์•„๋„,
์•„๋ž˜์—์„œ ๋ Œ๋”๋ง ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋‹ค๋ณด๋ฉด ๊ฐ์ด ์˜ฌ๊ฒƒ์ด๋‹ค!


3. React์—์„œ์˜ ์ปดํฌ๋„ŒํŠธ๋ž€?

์ผ๋‹จ React๋Š” ๋ญ˜๊นŒ?
React๋Š” ์›น์‚ฌ์ดํŠธ๋‚˜ ์•ฑ์˜ ํ™”๋ฉด์„
๋ณด๋‹ค ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” JS๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

reactComponents

์šฐ๋ฆฌ๊ฐ€ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค๋•Œ
React๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž‘์€ ๋‹จ์œ„๋กœ ํ™”๋ฉด์„ ๋‚˜๋ˆ„์–ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.

์ด ์ž‘์€ ๋‹จ์œ„, ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ์กฐ๊ฐ๋“ค์„
์šฐ๋ฆฌ๋Š” "์ปดํฌ๋„ŒํŠธ"๋ผ๊ณ  ๋ถ€๋ฅด๊ณ ,
์ด ์ปดํฌ๋„ŒํŠธ๋Š” ์ „๋ถ€ ๊ฐ๊ฐ ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋ธ”๋ก๋“ค์ด๋‹ค.

๊ฒ€์ƒ‰์ฐฝ์ด๋“  ๋ฒ„ํŠผ์ด๋“  ์ž…๋ ฅ์ฐฝ์ด๋Š” ๋ฉ”๋‰ด๋“  ๊ด€๊ณ„์—†์ด
๊ฐ๊ฐ์˜ ๋ถ€๋ถ„๋“ค์„ ๋ชจ๋‘ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ๋“ค์„ ์ด์šฉํ•ด ๋ณต์žกํ•œ ์›นํŽ˜์ด์ง€๋“ค์„
์ž‘์€ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ  ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  React์—์„œ ์ด "์ปดํฌ๋„ŒํŠธ"๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ,

ํ•˜๋‚˜๋Š” "ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ"
ํ•˜๋‚˜๋Š” "ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ"๋‹ค.

๊ฐ๊ฐ์— ๋Œ€ํ•ด ์•Œ์•„ ๋ณด๊ธฐ ์ „,
๋ฆฌ์•กํŠธ์˜ State์™€ Lifecycle์— ๋Œ€ํ•ด ํ•œ๋ฒˆ๋งŒ ์ฝ์–ด๋ณด๊ณ  ๊ฐ€์ž!

React ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ณ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์€(์ด๊ฑธ State๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค)
์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์— ์˜ํ–ฅ์„ ์ฃผ๊ณ ,
State์˜ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ• ์‹œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋Š” ์žฌ ๋ Œ๋”๋ง๋˜๋ฉฐ,
์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ UI๋ฅผ ๋™์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

React ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒ์„ฑ, ๊ฐฑ์‹ , ์†Œ๋ฉธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ง„๋‹ค.
์ƒ๋ช…์ฃผ๊ธฐ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๊ณ , ์—…๋ฐ์ดํŠธ๋˜๊ณ , ์‚ฌ๋ผ์งˆ ๋•Œ๊นŒ์ง€์˜ ์ผ๋ จ์˜ ๊ณผ์ •์„ ์˜๋ฏธํ•˜๋ฉฐ,
๊ฐ ๋‹จ๊ณ„์—์„œ ํŠน์ • ๋ฉ”์„œ๋“œ๋‚˜ ํ›…์ด ํ˜ธ์ถœ๋œ๋‹ค.


3-1. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ

import React, { useState } from 'react';

function MyButton() {
  // useState Hook์„ ์ด์šฉํ•ด์„œ
  // 'count'๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , ์ดˆ๊ธฐ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •
  // 'setCount'๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ 
  // 'count'์˜ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค!(์ดˆ๊ธฐ ๊ฐ’์€ 0)
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>๋ฒ„ํŠผ์„ {count}๋ฒˆ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค</p>
      <button onClick={() => setCount(count + 1)}>
        ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”!
      </button>
    </div>
  );
}

export default MyButton;

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ 
๋ฒ„ํŠผ์„ ํ•œ๋ฒˆ ๋ˆ„๋ฅผ๋•Œ๋งˆ๋‹ค 1์”ฉ count ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์ฝ”๋“œ.

์ด๋ ‡๋“ฏ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์–ด๋–ค HTML์„ ๋ณด์—ฌ์ค„์ง€๋ฅผ ์ •ํ•œ๋‹ค.


3-2. ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ

import React, { Component } from 'react';

class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }
  // this.setState์™€ this.state๋กœ ๋ณ€์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  // Counter๋ผ๋Š” ํด๋ž˜์Šค๋กœ state๋“ค์„ ๋ฌถ์–ด์„œ this ํ‚ค์›Œ๋“œ๋กœ ์ฐธ์กฐํ•œ๋‹ค.
  // setState๋ฉ”์„œ๋“œ๋กœ state๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
  // 'this.state'์˜ 'count'๋ฅผ ๊ฐ์ฒด๊ฐ’์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค!(์ดˆ๊ธฐ ๊ฐ’์€ 0)
  render() {
    return (
      <div>
        <p>๋ฒ„ํŠผ์„ {this.state.count} ๋ฒˆ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>
          ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”!
        </button>
      </div>
    );
  }
}

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ 
๋ฒ„ํŠผ์„ ํ•œ๋ฒˆ ๋ˆ„๋ฅผ๋•Œ๋งˆ๋‹ค 1์”ฉ count ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์ฝ”๋“œ.

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ’์„ ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋‹ค๋ฅด๊ฒŒ
๊ฐ’์„ ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ,

useState Hook์„ ์‚ฌ์šฉํ•˜์ง€์•Š๊ณ  this.setState๋ฅผ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด state๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.


3-3. ๋‘˜์˜ ์ฐจ์ด?

๊ทธ๋ ‡๋‹ค๋ฉด ๋‘˜์€ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ์„๊นŒ?

๊ตฌ๋ฌธ

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜๋กœ ์ •์˜๋œ๋‹ค.

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ž˜์Šค๋กœ ์ •์˜๋œ๋‹ค.

State ๊ด€๋ฆฌ

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” useState๊ฐ™์€ Hook์„ ์‚ฌ์šฉํ•ด์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š” this.state์™€ this.setState ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

Lifecycle

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” useEffect๊ฐ™์€ Hook์„ ์‚ฌ์šฉํ•ด์„œ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ๋Œ€์ฒดํ•œ๋‹ค.

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ๊ฐ ์ƒํ™ฉ์—์„œ์˜ ๋ช…์‹œ์  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
(componentDidMount, componenDidUpdate, componentWillUnmound ๋“ฑ)

Error Boundaries

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์ง์ ‘์ ์ธ ์—๋Ÿฌ๊ฒฝ๊ณ„๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. (ErrorBoundray) ๋ฅผ ํ†ตํ•ด ๊ฐ์‹ธ๋Š” ์‹์œผ๋กœ ๊ฐ„์ ‘์ ์œผ๋กœ๋งŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š” ์ง์ ‘์  ์—๋Ÿฌ๊ฒฝ๊ณ„๋ฅผ ์ œ๊ณตํ•œ๋‹ค. (componenDidCatch)

์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ์„ฑ

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ๋ณด๋‹ค ์ง๊ด€์ ์ด๊ณ , ๊ฐ„๊ฒฐํ•˜๋‹ค.

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š” ๋” ๋งŽ์€ Boilerplate์ฝ”๋“œ๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค.


3-4. ๊ฐ๊ฐ์˜ ์žฅ์ ์ด๋ผ๋ฉด?

React 16.8 ๋ฒ„์ „๋ถ€ํ„ฐ
React Hooks๋ผ๋Š” ํŠน๋ณ„ํ•œ ํ•จ์ˆ˜๋“ค์ด ์ƒ๊ฒผ๊ณ 

๊ธฐ์กด์—๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์—ˆ๋˜
ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜
State ๊ด€๋ฆฌ์™€, Lifecycle ๊ธฐ๋Šฅ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉฐ

ํ˜„์žฌ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์ดˆ๊ธฐ์—๋Š” ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•จ์ˆ˜ํ˜•๋ณด๋‹ค ๋‚˜์€ ์žฅ์ ์ด ์žˆ์—ˆ์ง€๋งŒ ์ ์  React๊ฐ€ ๋ฐœ์ „ํ•ด๊ฐ์—๋”ฐ๋ผ ์žฅ์ ์ด ์‚ฌ๋ผ์ง€๋Š” ์ถ”์„ธ.

๊ธฐ์กด์—์„œ this.state, componentDidUpdate ๋“ฑ์œผ๋กœ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ state์™€ lifecycle๋“ฑ์„ ๊ด€๋ฆฌํ–ˆ๋‹ค๋ฉด

React Hooks๋ผ๋Š” ํ•จ์ˆ˜๋“ค๋กœ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์„ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜๋‚ด์—์„œ ์ž์ฒด์ ์œผ๋กœ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๊ฒƒ์ด๋‹ค.

"๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๋ƒฅ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์œ„ํ˜ธํ™˜์•„๋‹Œ๊ฐ€?"
๋ผ๊ณ  ์ƒ๊ฐํ• ์ˆ˜๋„ ์žˆ๋‹ค.
์Œ.. ๋งž๋‹ค.. ํ•จ์ˆ˜ํ˜•์ด ๋Œ€์ฒด๋กœ ์ฝ๊ธฐ๋„์‰ฝ๊ณ  ๋‚ซ๊ธดํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋„ ์•„์˜ˆ ๋ชฐ๋ผ๋„ ๋˜๋Š”๊ฑด ์•„๋‹ˆ๋‹ค.

์•Œ์•„์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ์–ด๋–ค๊ฒŒ ์žˆ์„๊นŒ?

๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์˜ ํ˜ธํ™˜์„ฑ

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š” ์•„๋ฌด๋ž˜๋„ React ์ดˆ๊ธฐ๋ถ€ํ„ฐ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์˜ค๋ž˜๋œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ํ˜ธํ™˜์„ฑ์ด ๋” ์ข‹์„์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์—ฌ๋Ÿฌ ๋ ˆ๊ฑฐ์‹œ ํ”„๋กœ์ ํŠธ์—์„œ ์•„์ง๋„ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ๋„ ํ•˜๋‹ค.

๋ช…์‹œ์ ์ธ Lifecycle ๋ฉ”์„œ๋“œ

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ useEffect์™€ ๋‹ค๋ฅด๊ฒŒ Lifecycle ๊ฐ๊ฐ์˜ ์ˆœ๊ฐ„์„ ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค. ๋ฌผ๋ก  useEffect๊ฐ€ ํ• ์ˆ˜ ์žˆ๋Š” ์ผ์ด์ง€๋งŒ, ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ๋ณด๋‹ค ๋ช…์‹œ์ ์ธ ๋ฉ”์„œ๋“œ๋“ค์€ ๋ณด๋Š”์‚ฌ๋žŒ์œผ๋กœ ํ•˜์—ฌ๊ธˆ ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋”์šฑ ๋ช…ํ™•ํ•˜๊ฒŒ ๋Š๊ปด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.

Error Boundaries

์œ„์—์„œ ๋งํ–ˆ๋“ฏ

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์ง์ ‘์ ์ธ ์—๋Ÿฌ๊ฒฝ๊ณ„๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ , "๋Œ€~์ถฉ ์–ด๋Š ๊ตฌ์—ญ์ฏค์—์„œ ์—๋Ÿฌ๊ฐ€ ์ƒ๊ฒผ๋Š”๋ฐ, ํฌ๋ž˜์‹œ ๋ฐฉ์ง€๋Š” ํ–ˆ๊ณ , ๊ฐ„๋‹จํ•œ ์—๋Ÿฌ ๋ฉ”์„ธ์ง€์ •๋„๋งŒ ๋‚ด๋ณผ๊ฒŒ" ์ •๋„์˜ ๋Š๋‚Œ์ด๋‹ค.

๋ฐ˜๋ฉด ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š” ์ง์ ‘์ ์œผ๋กœ ์—๋Ÿฌ๊ฒฝ๊ณ„๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
์ง์ ‘์  ์ด๋ผ๋Š”๊ฒƒ์€,
๋‹ค๋ฅธ ์ „ํ†ต์ ์ธ Error catch๋“ค ์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ํŠน์ • ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๋ฅผ ์žก์•„๋‚ด๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

์ด๋ ‡๋“ฏ ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ํ•„์š”๊ฐ€ ์žˆ์ง€๋งŒ,

ํ˜„์žฌ๋Š” ๋ฆฌ์•กํŠธ ์ƒํƒœ๊ณ„์˜ ๋ฐœ์ „์— ๋”ฐ๋ฅธ
ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ์žฅ์ ์ด ํ›จ์”ฌ ๋งŽ์•„์„œ
์ฃผ๋กœ ์ฝ๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ ํŽธํ•œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋Œ€์„ธ์ธ ๋Š๋‚Œ์ด๋‹ค.


4. React์˜ ๋ Œ๋”๋ง ๋ฐฉ์‹

๋ฐฐ๊ฒฝ์ง€์‹์€ ์–ผ์ถ” ์•Œ์•˜๊ณ .. ๊ทธ๋ ‡๋‹ค๋ฉด
์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ์–ด๋–ป๊ฒŒ ๋ Œ๋”๋ง๋ ๊นŒ?

Brower์˜ ๋ Œ๋”๋ง ๋ฐฉ์‹์€
์ €๋ฒˆ Weekly Paper์—์„œ ์ƒ๋‹นํžˆ ์„ธ๋ถ€์ ์œผ๋กœ ์„ค๋ช…ํ•œ ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ํŒจ์Šคํ•˜๊ณ ..
howBrowserWorks

Browser ๋™์ž‘๊ณผ์ •์€ ์•„๋งˆ ์ด์‚ฌ์ง„์„ ๋ณด๋ฉด ๋– ์˜ค๋ฅด์ง€ ์•Š์„๊นŒ ?

์—ฌํŠผ,
React์˜ ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค๋Š”
Render Phase์™€ Commit phase ๋‘๋‹จ๊ณ„๋กœ ์ง„ํ–‰๋œ๋‹ค

Render Phase์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ์‚ฌํ•ญ์„ ํŒŒ์•…ํ•˜๊ณ 

Commit Phase๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•ด์ฃผ๋Š”๊ฒƒ.

์ž์„ธํ•˜๊ฒŒ ํ•œ๋ฒˆ ์‚ดํŽด๋ณด์ž


4-1. Render Phase - 1

Render Phase์—์„  ์ฒซ๋ฒˆ์งธ๋กœ
์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค.

function App() {
	return (
    	<div id="main">
      		<p>Hello</p>
      	</div>
    )
}

์ด๋Ÿฐ ์•ฑ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๊ณ , ์šฐ๋ฆฌ๊ฐ€ ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด
์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ• ๊นŒ ?

์ ๋‹นํžˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด..
"๊ทธ๋ƒฅ ๋ฆฌํ„ด HTMLํƒœ๊ทธ๋“ค์ด๋‹ˆ๊นŒ ์ด HTML ํƒœ๊ทธ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€?"
๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณผ๋งŒ ํ•˜์ง€๋งŒ

์‚ฌ์‹ค

{
  type: "div",
  key: null,
  ref: null,
  props: {
    id: main,
    children: {
      type: "p",
      key: null,
      ref: null,
      props: {
        children: "Hello",
      },
    },
  },
};

์ด๋ ‡๊ฒŒ ์ƒ๊ธด ๊ฐ์ฒด๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์ด ๊ฐ์ฒด๊ฐ’์„ React Element๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๊ทธ๋ž˜์„œ ์ด React Element๊ฐ€ ๋ญํ•˜๋Š” ๊ฐ์ฒด๋ƒ?
์œ„์—์„œ ์˜ˆ๋กœ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ํ•˜๊ณ ์žํ•˜๋Š” UI์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ ์žˆ๋Š” ๊ฐ์ฒด๋‹ค.

elementExample

์ด๋Ÿฐ ๋Š๋‚Œ์œผ๋กœ ์ง์„ ์ง€์–ด์„œ
์ด ํƒœ๊ทธ๋Š” ํƒ€์ž…์ด div์ด๊ณ , id๋Š” main์ด๊ณ 
์ž์‹ ์š”์†Œ๋กœ๋Š” p ํƒœ๊ทธ ๊ฐ™์€๊ฒƒ๋“ค์ด ํ•ด๋‹น๋˜์–ด์žˆ๋‹ค.
๋ผ๋Š” ์ •๋ณด๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฒƒ.

์ด๋Ÿฐ์‹์œผ๋กœ ์ฒซ๋ฒˆ์งธ ํŽ˜์ด์ฆˆ์—์„ 
์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ•ด ๊ฒฐ๊ณผ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ , React Element๋ฅผ ์–ป๊ฒŒ ๋œ๋‹ค.


4-1. Render Phase - 2

๊ทธ ๋‹ค์Œ ๋‘๋ฒˆ์งธ๋กœ๋Š”
ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋“ค์„ ํ˜ธ์ถœํ•ด์„œ
React Element๋กœ ๋งŒ๋“  ๋’ค ์ด๊ฒƒ๋“ค์„ ๋ชจ๋‘ ๋ชจ์•„
Virtual DOM์„ ๋งŒ๋“ ๋‹ค.

VirtualDom


4-2. Commit Phase

VDOM_ADOM

Git์—์„œ์˜ Commit์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋“ฏ
๊ฐ’๋“ค๋กœ ๋งŒ๋“ค์–ด๋‚ธ Virtual DOM์„ ์ง„์งœ Real DOM์— Commit, ๋ฐ˜์˜ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ๋‹จ๊ณ„๋ฅผ ์šฐ๋ฆฌ๋Š” Commit Phase๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค!

์ด Virtual DOM์„ Real DOM์—๋‹ค๊ฐ€ ๋ฐ˜์˜ํ•˜๋ฉด
์‹ค์ œ DOM์ด ๋ณ€๊ฒฝ๋ ๊ฒƒ์ด๊ณ 

๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ธ์‹ํ•ด์„œ
Render Tree๋ฅผ ์žฌ๊ตฌ์„ฑํ• ๊ฒƒ์ด๊ณ 
Layout๋„ ๋‹ค์‹œ ์žก์„๊ฒƒ์ด๋ฉฐ
Paint ๊ณผ์ •๋„ ๋‹ค์‹œ ์ง„ํ–‰ํ• ๊ฒƒ์ด๋‹ค.

๋ Œ๋”๋ง ๊ณผ์ • ๊ด€๋ จ ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ๋ธŒ๋ผ์šฐ์ € ๋ฅผ ์ฐธ์กฐ

์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ Œ๋”๋ง ๋œ๋‹ค!


4-3. ์ด๋ ‡๊ฒŒ ํ•ด์„œ ์–ป๋Š” ์žฅ์ ์€?

๊ทธ๋ƒฅ HTML CSS๋กœ ํ•˜๋ฉด, ๋ Œ๋”๋ง๊ณผ์ • ํ•œ๋ฒˆ๋งŒ ๋Œ๋ ค๋„ ๋‹ค ๋‚˜์˜ฌํ…๋ฐ
๊ตณ์ด ์ด๋ ‡๊ฒŒ ๋ณต์žกํ•œ ๊ณผ์ •์„ ์ง€๋‚˜๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ผ๊นŒ?

๋ฐ”๋กœ DOM ์ˆ˜์ •์˜ ์ตœ์†Œํ™”, ๋น ๋ฅธ ์—…๋ฐ์ดํŠธ ๋Œ€์‘์„ ์œ„ํ•ด์„œ ๊ทธ๋ ‡๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€์˜ ์ด์œ ๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์–ด๋–ค์ผ์ด ์ผ์–ด๋‚ ๊นŒ?

oldNewVitualDOM

์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, React๋Š” ์šฐ์„ ์ ์œผ๋กœ
Render Phase๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์„œ
์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ƒˆ๋กœ์šด React Element๋ฅผ ๋ฐ›๊ณ , ์ƒˆ๋กœ์šด Virtual DOM์„ ๋งŒ๋“ ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ์›๋ž˜์˜ VDOM์ด ์•„๋‹Œ ์ƒˆ๋กœ์šด VDOM์—๋Š”
์‚ฌ์ง„์—์„œ ๋ณผ์ˆ˜์žˆ๋“ฏ ์—…๋ฐ์ดํŠธ๋œ ์š”์†Œ๋“ค์ด ๋ฐ˜์˜๋˜์–ด์žˆ์„๊ฒƒ์ด๊ณ .

๋ฆฌ์•กํŠธ๋Š” ์ด ๋‘ ํŠธ๋ฆฌ์˜ ์Šค๋ƒ…์ƒท์„ ์ฐธ๊ณ ์ž๋ฃŒ๋กœ
์›๋ž˜ ์“ฐ๊ณ ์žˆ๋˜ VDOM๊ณผ ์ƒˆ๋กœ ๋ Œ๋”๋ง๋œ VDOM์˜ ์ฐจ์ด์ ์„ ์„œ๋กœ ๋น„๊ตํ•œ๋‹ค.

ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„๋งŒ ์ƒˆ๋กœ์šด ์—…๋ฐ์ดํŠธ ๋œ ๋ถ€๋ถ„์ด๋‹ˆ ๋ณ€ํ™”๋œ ๋ถ€๋ถ„๋งŒ์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์„์ˆ˜ ์žˆ๊ณ 
์ฐพ์€ ๋‹ค์Œ์—๋Š” Commit Phase๋กœ ๋„˜์–ด๊ฐ€
์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•˜๋ฉด์„œ ๋‹จ ํ•œ๋ฒˆ์˜ DOM ์ˆ˜์ •์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒƒ.


4-4. Diffing?

Virtual DOM์—์„œ๋Š”
์‹ค์ œ DOM๊ณผ Virtual DOM์„ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ์„ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•˜๋Š”๋ฐ
์ด๋•Œ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์„ ์ฐพ์•„๋‚ด๋Š” ๊ฑธ Diff ๋ผ๊ณ  ํ•˜๊ณ ,

์ด๊ฒƒ์„ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์—์„œ Diffing ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉ๋œ๋‹ค.

์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

elementExample

์•„๊นŒ Render Phase - 1์—์„œ
์ด ์‚ฌ์ง„์„ ๋ณด์—ฌ์ฃผ๋ฉฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ type์ด๋ผ๋Š” ํ‚ค๊ฐ’์„ ๊ฐ–๊ณ ์žˆ๋‹ค~ ๋ผ๊ณ  ์„ค๋ช…ํ–ˆ๋Š”๋ฐ,

์ด๊ฒŒ diffing ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋น„๊ต๊ณผ์ •์— ํ•„์š”ํ•˜๋‹ค.

์ˆœ์ฐจ์ ์œผ๋กœ ์•Œ์•„๋ณด์ž

  1. ๋…ธ๋“œํƒ€์ž…์˜ ๋น„๊ต
    ๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ํƒ€์ž…์ธ์ง€ ํ™•์ธํ•œ๋‹ค. ๊ฐ™์€ ํƒ€์ž…์ด๋ผ๋ฉด ์†์„ฑ์„ ๋น„๊ตํ•˜๊ณ , ๋‹ค๋ฅธ ํƒ€์ž…์ด๋ผ๋ฉด ์ด์ „ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค
  1. ์†์„ฑ ๋น„๊ต
    ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜์–ด์žˆ๋Š”์ง€ ํ™•ํžŒํ•ด๋ณด๊ณ  ๋ณ€๊ฒฝ๋œ ์†์„ฑ๋งŒ ์‹ค์ œ DOM์— ์ ์šฉํ•œ๋‹ค.
  1. ์ž์‹ ๋…ธ๋“œ ๋น„๊ต
    3-1. ๊ฐ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋น„๊ตํ•œ๋‹ค. key๊ฐ€ ์žˆ๋‹ค๋ฉด key๋ฅผ ๊ธฐ์ค€์œผ๋กœ, ์—†๋Š”๊ฒฝ์šฐ ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋น„๊ตํ•œ๋‹ค.
    3-2. ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋ฆฌ์ŠคํŠธ๋ผ๋ฉด, ๊ฐ ๋…ธ๋“œ์˜ key๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„œ ์ถ”๊ฐ€, ์ œ๊ฑฐ, ์ด๋™์„ ๊ฒฐ์ •ํ•œ๋‹ค.

์ด๋Ÿฐ ์ด์œ ๋กœ key๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ฃผ๋Š”๊ฒƒ์€ diffing ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐฉํ•ดํ•œ๋‹ค.

key๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ค˜๋ฒ„๋ฆฌ๋ฉด ์–˜๊ฐ€ ์ด๋™์„ํ–ˆ๋‚˜,
์ƒˆ๋กœ์šด๊ฒŒ ์ƒ๊ฒผ๋‚˜, ๋ญ๊ฐ€ ์‚ญ์ œ๊ฐ€๋˜์—ˆ๋‚˜ ํŒŒ์•…ํ• ์ˆ˜๊ฐ€์—†๊ณ ,

์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ• ๋•Œ๋งˆ๋‹ค ๋ณ€๊ฒฝ๋˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ถ”์ ํ•˜๋ ค๋ฉด
์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ์žฌ๋ Œ๋”๋ง ํ•ด์•ผํ•˜๊ณ ,
๋ถˆํ•„์š”ํ•œ DOM์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒ ํ•ด๋ฒ„๋ฆฌ๋Š”๊ฒƒ!

๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์ดํ•ดํ•ด๋ณด์ž.

// ์˜ˆ์ „ VDOM
const oldVDOM = (
  <div>
    <h1 key="1">Title</h1>
    <p key="2">Element</p>
  </div>
);

// ์ƒˆ๋กœ์šด VDOM
const newVDOM = (
  <div>
    <h1 key="1">Brand New Title</h1>
    <span key="3">New Element</span>
  </div>
);

์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ทธ๋Œ€๋กœ ์ง„ํ–‰ํ•ด๋ณด์ž.

  1. ๋ฃจํŠธ <div> ๋…ธ๋“œ๋ฅผ ๋น„๊ตํ•œ๋‹ค. ๋‘ ๋…ธ๋“œ ๋ชจ๋‘ <div> ํƒ€์ž…์ด๋ฏ€๋กœ ๊ณ„์† ๋‹ค์Œ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๋ฉฐ ๋น„๊ตํ•œ๋‹ค.

  2. ์ž์‹ ๋…ธ๋“œ <h1>์„ ๋น„๊ตํ•œ๋‹ค. ๊ฐ™์€ key๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ…์ŠคํŠธ ๋‚ด์šฉ๋งŒ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

  3. <p>์™€ <span> ๋…ธ๋“œ๋ฅผ ๋น„๊ตํ•œ๋‹ค. key๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ <p>๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  <span>์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ƒ๊ฐ๋ณด๋‹ค ์ƒ์‹์ ์ด์ง€์•Š์€๊ฐ€?


๊ทธ๋ž˜์„œ React๊ฐ€ ์ข‹์€ ์ด์œ , ์–ด๋–ป๊ฒŒ ๊ตด๋Ÿฌ๊ฐ€๋Š”์ง€๋ฅผ ์š”์•ฝํ•˜์ž๋ฉด

React๋Š”
๋™์‹œ์— ๋ฐœ์ƒํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ชจ์•„ ๋”ฑ ํ•œ๋ฒˆ๋งŒ DOM์„ ์ˆ˜์ •ํ•˜๊ณ 
์ด๋Š” ๋Œ€๋ถ€๋ถ„์— ์ƒํ™ฉ์— ์žˆ์–ด ๋น ๋ฅธ์†๋„๋กœ ํ™”๋ฉด ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค.
์šฐ๋ฆฌ๋Š” ์ด ๊ณผ์ •์„ ์œ„์—์„œ ๋งํ–ˆ๋˜ Reconciliation(์žฌ์กฐ์ •)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค
๊ทธ๋ฆฌ๊ณ  ์ด ์žฌ์กฐ์ •์— ์žˆ์–ด ๋น„๊ต๊ณผ์ •์„ Diff๋ผ๊ณ  ํ•œ๋‹ค.

์ˆœ์ˆ˜ JS๋งŒ์„ ์ด์šฉํ•ด DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ณผ๋„ํ•œ Reflow์™€ Repaint์— ์ฃผ์˜ํ•˜๋ฉฐ
DOM ์ˆ˜์ •์„ ์ตœ์†Œํ™” ํ•ด์•ผ ํ•˜์ง€๋งŒ,
์ด๋Š” ์„œ๋น„์Šค ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์ปค์งˆ์ˆ˜๋ก ์–ด๋ ต๋‹ค.

ํ•˜์ง€๋งŒ React๋Š” ์ž์ฒด์  ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์—

์•Œ์•„์„œ ํ•œ๋ฒˆ์— ๊ด€๋ฆฌํ•ด์ค€๋‹ค๋Š”๊ฒƒ์ด ์žฅ์ ์ธ๊ฒƒ.


#์ฝ”๋“œ์ž‡์Šคํ”„๋ฆฐํŠธ #์Šคํ”„๋ฆฐํŠธํ’€์Šคํƒ1๊ธฐ #์ทจ์—…๊นŒ์ง€๋‹ฌ๋ฆฐ๋‹ค

profile
Codeit ์Šคํ”„๋ฆฐํŠธ / ํ’€์Šคํƒ 1๊ธฐ ์ˆ˜๊ฐ•์ค‘์ธ ๊น€ํ˜„์šฐ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€