๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
React

[React] ๋ฆฌ์•กํŠธ๊ฐ€ ๋ Œ๋”๋ง ํ•˜๋Š” ๋ฐฉ๋ฒ•

by mtm1018 2025. 7. 6.

๐Ÿ“˜ ๋ฆฌ์•กํŠธ๋Š” ์–ด๋–ป๊ฒŒ ๋ Œ๋”๋ง์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

์—ฌํƒ€์˜ ์„ค๋ช…์„œ์—†์ด ๋ฆฌ์•กํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๊ต‰์žฅํžˆ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง‘๋‹ˆ๋‹ค.

 

HTML์„ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š”๋ฐ ์–ด๋””์„œ ์ž‘์„ฑํ• ์ง€.. ํด๋”๋Š” ๋˜ ์™œ์ด๋ฆฌ๋งŽ์€์ง€...

 

๊ทธ๋Ÿฌ๋‹ค ์ด์ œ App.js์— ์ ์œผ๋ผ๋Š” ์–ด๋”˜๊ฐ€์˜ ์„ค๋ช…์„ ๋ณด๊ณ  ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ฆฌ์•กํŠธ ์‚ฌ์šฉ์ด ๋˜๋Š”๋ฐ์š”.

 

๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ป๊ฒŒ JSํŒŒ์ผ์— ์ ์—ˆ๋Š”๋ฐ ํ™”๋ฉด์— ๋ Œ๋”๋ง์ด ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

 

์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ์ผ์ด ๊ฐ€๋Šฅํ• ๊นŒ์š”??

๐Ÿ’ญ Virture DOM

๋ฆฌ์•กํŠธ์—์„œ๋Š” ์‹ค์ œ DOM์— ๋ฐ”๋กœ ์š”์†Œ๋ฅผ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ฐ€์ƒ DOM์— ๋จผ์ € ์—ฐ๊ฒฐ์„ ์‹œํ‚ต๋‹ˆ๋‹ค.

 

๊ฐ€์ƒ DOM์ด๋ž€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ DOMํŠธ๋ฆฌ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ DOM์„ ๋‹จ์ˆœํ™” ์‹œํ‚จ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ๊ฐ€์ƒDOM๋ผ๋ฆฌ ๋น„๊ต๋ฅผ ํ•œ๋’ค์— ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค

 

๋น„์œ ํ•˜์ž๋ฉด ๊ฐ€์ƒ DOM์€ ์ดˆ์•ˆ์ด๊ณ  ์‹ค์ œ DOM์€ ์ตœ์ข…๋ณธ ๊ฐ™์€ ๋А๋‚Œ์ž…๋‹ˆ๋‹ค.

๐Ÿ–ฅ๏ธ ๋ Œ๋”๋ง

๋ฆฌ์•กํŠธ๋กœ ๊ตฌํ˜„๋˜๋Š” ๋…ธ๋“œ๋“ค์€ root๋…ธ๋“œ์•ˆ์—์„œ ๊ด€๋ฆฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  root๋…ธ๋“œ์— ๋ถ™์ธ๋‹ค์Œ ๋ Œ๋”๋ง์„ ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ด์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๋˜ ์š”์†Œ๋Š” HTML๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์ผ๋ฐ˜๊ฐ์ฒด๋กœ ๊ด€๋ฆฌ๊ฐ€๋ฉ๋‹ˆ๋‹ค.

 

์‹ค์ œ๋กœ ๋ฒ„ํŠผ์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹คํ•˜๋ฉด ๋ฐ‘์˜ ์ฝ”๋“œ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

const btn = createElement('button'.{type="button"},click'

 

createElement('HTMLํƒœ๊ทธ',{ ํƒœ๊ทธ์•ˆ์—๋“ค์–ด๊ฐˆ ์†์„ฑ๊ณผ ์†์„ฑ๊ฐ’}, ํƒœ๊ทธ ์•ˆ์— ๋“ค์–ด๊ฐˆ ๋‚ด์šฉ }

 

์ผ๋ฐ˜๊ฐ์ฒด๋Š” ์œ„์™€๊ฐ™์€ ์ฝ”๋“œ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

 

์š”์†Œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด root๋…ธ๋“œ์— ๋ถ™์ž…๋‹ˆ๋‹ค.

const root = document.getElementById('app')

const elem = root.createRoot(btn)

elem.render(btn)

โ“ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง

ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๋ Œ๋”๋ง์„ ๋‹ค๋ฅด๊ฒŒ ํ•ด์•ผํ•  ๋•Œ ์ด๋ฅผ ์กฐ๊ฑด๋ถ€๋ Œ๋”๋ง์ด๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

 

๋ฆฌ์•กํŠธ์—์„œ๋Š” if๋ฌธ๋Œ€์‹  ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๋‹จํ•œ ์กฐ๊ฑด์‹์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

์‚ผํ•ญ์—ฐ์‚ฐ์ž : ์กฐ๊ฑด? ์ฐธ : ๊ฑฐ์ง“

function Item({ name, isPacked }) {
  return (
    <li className="item">
      {name} {isPacked ? 'โœ…':'โŒ"}
    </li>
  );
}

 

๋งŒ์•ฝ ์กฐ๊ฑด๋ฌธ์ด ๊ฑฐ์ง“์ผ ๋•Œ โŒ๋„ ๋„์šฐ๊ณ ์‹ถ์ง€ ์•Š์€๊ฒ๋‹ˆ๋‹ค.

 

์ด๋Ÿด๋•Œ๋Š” ''์ด๋‚˜ null๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜๋„ ๋˜์ง€๋งŒ &&์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

&&์—ฐ์‚ฐ์ž์˜ ํŠน์ง•์„ ์‚ดํŽด๋ณด์ž๋ฉด,

  • && ์—ฐ์‚ฐ์ž๋Š” falsyํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ falsyํ•œ ๊ฐ’์ด ์—†๋‹ค๋ฉด ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 

์œ„์˜ ์ฝ”๋“œ๋ฅผ &&์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ์ž‘์„ฑํ•ด ๋ณธ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function Item({ name, isPacked }) {
return (
 <li className="item">
   {name} {isPacked && 'โœ…'}
 </li>
);
}

 

๊ทธ๋Ÿฐ๋ฐ &&์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฃผ์˜์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

falsyํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค๊ณ  ํ•ด์„œ 0์„ ์ž…๋ ฅํ•˜๋ฉด ํ™”๋ฉด์— ์ง„์งœ๋กœ ์ˆซ์ž 0์„ ๋„์›Œ์ค๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๋Š” count๋ณ€์ˆ˜ ๊ฐ™์€๊ฒƒ์„ ์‚ฌ์šฉํ•  ๋•Œ ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

 

function Item({ name, importance }) {
  return (
    <li className="item">
      {name} {importance > 0 && importance]
    </li>
  );
}

export default function PackingList() {
  return (
    <section>
      <h1>Sally Ride's Packing List</h1>
      <ul>
        <Item
          importance={9}
          name="Space suit"
        />
        <Item
          importance={0}
          name="Helmet with a golden leaf"
        />
        <Item
          importance={6}
          name="Photo of Tam"
        />
      </ul>
    </section>
  );
}

๐Ÿ“‹ ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง

๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ธด UI๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ๋ Œ๋”๋งํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„๋•Œ, ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ์ˆ˜๋™์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค ์‚ญ์ œํ–ˆ๋‹ค ํ•˜๋ฉด

 

๋งค์šฐ ๋น„ํšจ์œจ์ ์ธ ์ผ์ด๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ฐ™์€ UI๋ฅผ ๋ Œ๋”๋ง ์‹œํ‚ฌ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๊ฒƒ์„ ๋ฆฌ์ŠคํŠธ๋ Œ๋”๋ง์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

export const recipes = [{
  id: 'greek-salad',
  name: 'Greek Salad',
}, {
  id: 'hawaiian-pizza',
  name: 'Hawaiian Pizza',
}, {
  id: 'hummus',
  name: 'Hummus',
}];

 

์œ„์™€ ๊ฐ™์€ ๋ฐฐ์—ด๋กœ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ˜๋ณต์ ์ธ UI๋ฅผ ์ถœ๋ ฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

๊ทธ๋Ÿฐ๋ฐ ๋ฆฌ์ŠคํŠธ๋ Œ๋”๋ง ํ•  ๋•Œ ํ•ญ์ƒ key๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค

 

ํ‚ค๊ฐ€ ์—†๋‹ค๋ฉด ์ปดํ“จํ„ฐ๋Š” ๋ฐฐ์—ด๋ฉ”์„œ๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ธ๋ฑ์Šค๋กœ ๋‚จ๊น๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ฐฐ์—ด์ด ๋ณ€ํ˜•๋  ๋•Œ ์ธ๋ฑ์Šค ๋„˜๋ฒ„๋„ ๋’ค์ฃฝ๋ฐ•์ฃฝ์„ž์—ฌ์„œ ์ปดํ“จํ„ฐ๋Š” ๋ฌด์—‡์ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” ์ˆœ์„œ์ธ์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

 

 

 

์œ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง์„ํ•ด๋ณด๋ฉด ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import { recipes } from './data.js';

export default function RecipeList() {
  return (
    <div>
      <h1>Recipes</h1>
      {
        recipes.map(item =>
         <h2 key = {item.id}>{item.name}</h2>
      }
    </div>
  );
}

 


๐Ÿš€ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง

 

์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•˜๊ธฐ์ „ ๋ฆฌ์•กํŠธ๋Š” ๋ฐ”๋กœ ์‹ค์ œ DOM์— ์—ฐ๊ฒฐ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋ฆฌ์•กํŠธ์—์„œ ์ž์ฒด์ ์œผ๋กœ ํ•œ๋ฒˆ ๊ฒ€์—ด์„ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด ๊ณผ์ •์„ ํ†ตํ•ด์„œ ์‹ค์ œ ํ™”๋ฉด์— ๋ Œ๋”๋ง์ด ๋˜๋Š”๋ฐ 3๋‹จ๊ณ„๋กœ ์„ค๋ช… ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

1. ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ

 

    ๋ Œ๋”๋ง์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ๋ฐฉ์•„์‡ ๊ฐ™์€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

    ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ๋Š” ๋‘๊ฐ€์ง€์— ์˜ํ•ด ๋ฐœ๋™ ๋ฉ๋‹ˆ๋‹ค.

 

    ์ฒซ ์งธ๋กœ, ํ™”๋ฉด์— ์ฒ˜์Œ ๋ Œ๋”๋ง์„ ํ• ๋•Œ ๋ฐœ๋™๋˜๊ณ 

 

    ๋‘๋ฒˆ์งธ๋กœ, state๊ฐ€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๋ฉด ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๋ฐœ๋™๋ฉ๋‹ˆ๋‹ค

 

2. ์ปดํฌ๋„ŒํŠธ๋ Œ๋”๋ง

 

   ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฐ›์•˜์œผ๋ฉด ๋ฆฌ์•กํŠธ๋Š” root์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. 

 

   ๊ทธ ํ›„, ์—…๋ฐ์ดํŠธ๋œ ์ปดํฌ๋„ŒํŠธ์™€ root์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋” ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ตœ๊ทผ ๋ Œ๋”๋ง๋œ ๋‹ค๋ฅธ ๋ถ€๋ถ„๋งŒ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

 

3.  DOM์— ์ปค๋ฐ‹

 

   ๊ธฐ์กด์˜ ์ปดํฌ๋„ŒํŠธ์™€ ๋‹ค๋ฅธ์ ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด ์‹ค์ œ DOM์— ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.

 

   ์—ฌ๊ธฐ์„œ ์ปค๋ฐ‹์€ ๊นƒํ—ˆ๋ธŒ์—์„œ ์ปค๋ฐ‹ํ•œ๋‹ค์™€ ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.