๐Ÿ“˜ [Recat] React ํ•ต์‹ฌ - ์ปดํฌ๋„ŒํŠธ, JSX, ์†์„ฑ, ์ƒํƒœ ๋“ฑ - 1

๐Ÿ“˜ [Recat] React ํ•ต์‹ฌ - ์ปดํฌ๋„ŒํŠธ, JSX, ์†์„ฑ, ์ƒํƒœ ๋“ฑ - 1

[Recat] React ํ•ต์‹ฌ - ์ปดํฌ๋„ŒํŠธ, JSX, ์†์„ฑ, ์ƒํƒœ ๋“ฑ - 1

์™œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ค‘์š”ํ•œ๊ฐ€?

  • UI ๊ตฌ์กฐํ™”: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ๊ตฌ์กฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฌ์‚ฌ์šฉ์„ฑ: ํ•œ ๋ฒˆ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด: ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ: ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์˜ ์—ญํ• ๋งŒ ๋‹ด๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.
  • ํ˜‘์—…์— ์œ ๋ฆฌ: ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ž์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ด๋‹นํ•ด ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ์˜ ์žฅ์ 

  • ์ฝ”๋“œ ์ค‘๋ณต ๊ฐ์†Œ ๋ฐ ์ˆ˜์ • ์šฉ์ด
  • ๊ด€๋ จ ์ฝ”๋“œ(HTML, CSS, JS)์˜ ํ•จ๊ป˜ ๊ด€๋ฆฌ
  • ๋””์ž์ธ๊ณผ ๊ธฐ๋Šฅ์˜ ๋ช…ํ™•ํ•œ ๋ถ„๋ฆฌ
  • ์•ฑ ๊ทœ๋ชจ๊ฐ€ ์ปค์ ธ๋„ ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ

๋ฆฌ์•กํŠธ ์™ธ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์‚ฌ์šฉ

์ด๋Ÿฌํ•œ ์ปดํฌ๋„ŒํŠธ ์ค‘์‹ฌ ๊ฐœ๋ฐœ ๋ฐฉ์‹์€ ๋ฆฌ์•กํŠธ์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ , Vue, Angular, Svelte, ์‹ฌ์ง€์–ด๋Š” Flutter์™€ ๊ฐ™์€ ๋ชจ๋ฐ”์ผ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ์˜ ์ฒซ๊ฑธ์Œ: ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์™€ JSX, ๊ทธ๋ฆฌ๊ณ  ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒ˜์Œ ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ํŒŒ์ผ๊ณผ ํด๋”๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ทธ์ค‘ public/index.html ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์ธ HTML ๋งˆํฌ์—…๋งŒ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ํ™”๋ฉด์—์„œ ๋ณด๋Š” UI ์š”์†Œ๋Š” ์ด๊ณณ์— ์—†์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” ๋ฐ”๋กœ ํ™”๋ฉด์— ๋ณด์ด๋Š” ๋ชจ๋“  UI๊ฐ€ ๋ฆฌ์•กํŠธ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

index.html๊ณผ ๋ฆฌ์•กํŠธ์˜ ์—ฐ๊ฒฐ ๊ณ ๋ฆฌ

  • index.html์—๋Š” ๋ฆฌ์•กํŠธ ์•ฑ์ด ์‚ฝ์ž…๋  root DOM ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹ค์ œ ์ฝ˜ํ…์ธ ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด ๋™์ ์œผ๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.
  • index.jsx ํŒŒ์ผ์—์„œ ์•ฑ์˜ ์‹œ์ž‘์ ์„ ์ •์˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๊ทธ ์•ˆ์—์„œ App.jsx ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.

JSX๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

  • App.jsx ํŒŒ์ผ์„ ๋ณด๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์•ˆ์— HTML์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋ฌธ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ JSX (JavaScript Syntax Extension) ์ž…๋‹ˆ๋‹ค.
  • JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ๋‚ด์— HTML ๋งˆํฌ์—…์„ ์ง์ ‘ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด UI ๊ตฌ์„ฑ์— ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ, JSX๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ๋ฒ•์ด๋ฏ€๋กœ, ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜(ํŠธ๋žœ์ŠคํŒŒ์ผ) ํ•ด์ค๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋ณธ

  • App.jsx๋Š” ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ์•กํŠธ์—์„œ UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•ต์‹ฌ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.
  • ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ž‘์„ฑ๋˜๋ฉฐ, ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค:
    1. ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    2. ๋ Œ๋”๋ง ๊ฐ€๋Šฅํ•œ JSX๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ์˜ ์ฒซ๊ฑธ์Œ

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ˆœํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  1. ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. JSX๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์ฆ‰, ํ™”๋ฉด์— ๋ Œ๋”๋ง๋  ๋งˆํฌ์—…)

์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ธฐ์กด App ์ปดํฌ๋„ŒํŠธ์— ์žˆ๋˜ ํ—ค๋” ๋งˆํฌ์—…์„ ๋ถ„๋ฆฌํ•ด Header ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function Header() {
  return (
    <header>
      <img src="src/assets/react-core-concepts.png" alt="Stylized atom" />
      <h1>React Essentials</h1>
      <p>
        Fundamental React concepts you will need for almost any app you are going to build!
      </p>
    </header>
  );
}

์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉํ•˜๊ธฐ

๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” JSX ๋ฌธ๋ฒ• ์•ˆ์—์„œ HTML ํƒœ๊ทธ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function App() {
  return (
    <div>
      <Header />
      <main>
        <h2>Time to get started!</h2>
      </main>
    </div>
  );
}
  • ์ปดํฌ๋„ŒํŠธ ํƒœ๊ทธ๋Š” ๋ฐ˜๋“œ์‹œ ์Šฌ๋ž˜์‹œ(/) ๋ฅผ ํฌํ•จํ•œ ์ž๋™ ๋‹ซํž˜ ๋ฌธ๋ฒ• ๋˜๋Š” ์‹œ์ž‘/์ข…๋ฃŒ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • JSX๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง์ ‘ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜๋˜์–ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹ค์ œ๋กœ ํ™”๋ฉด์— ๋ Œ๋”๋ง๋˜๋Š” ๊ณผ์ •

1. ์ปดํฌ๋„ŒํŠธ๋Š” ์‹ค์ œ HTML์— ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค

  • ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŽ˜์ด์ง€ ์†Œ์Šค๋ฅผ ๋ณด๋ฉด Header๋‚˜ App ๊ฐ™์€ ์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋Œ€์‹  <div id="root">์™€ ๋ฆฌ์•กํŠธ๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๋‚ด์žฅ HTML ์š”์†Œ๋“ค๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

2. JSX๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค

  • JSX๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ ๋ณ€ํ™˜๋˜์–ด ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.
  • ์ด ์ž‘์—…์€ index.jsx์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

3. index.jsx๊ฐ€ ๋ฆฌ์•กํŠธ ์•ฑ์˜ ์ง„์ž…์ 

  • index.html์€ ๊ธฐ๋ณธ์ ์ธ HTML ๊ตฌ์กฐ๋งŒ ํฌํ•จํ•˜๊ณ  ์žˆ๊ณ , <div id="root">๊ฐ€ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.
  • index.jsx์—์„œ App ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ ธ์™€ createRoot().render(<App />)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น div์— ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

4. ๋ฆฌ์•กํŠธ๊ฐ€ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹

  • createRoot()๋Š” ๋ฆฌ์•กํŠธ ์•ฑ์„ ๊ธฐ์กด DOM ์š”์†Œ ์•ˆ์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • render()๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹ค์ œ HTML ์š”์†Œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ <div id="root"> ์•ˆ์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

5. ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ (Component Tree)

  • App โ†’ Header์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ๋Š” ์ค‘์ฒฉ๋˜์–ด ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ์•กํŠธ๋Š” ์ด ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ๋ถ„์„ํ•ด์„œ ์ตœ์ข… HTML ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

6. ์™œ ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋‚˜์š”?

  • ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋ฉด ๋ฆฌ์•กํŠธ๋Š” ์ด๋ฅผ ๊ธฐ๋ณธ HTML ํƒœ๊ทธ๋กœ ์˜คํ•ดํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” ๋‚ด์žฅ ์š”์†Œ์™€ ์ปค์Šคํ…€ ์š”์†Œ ๊ฐ„์˜ ์ด๋ฆ„ ์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ๊ทœ์น™์ž…๋‹ˆ๋‹ค.

๋™์  ๊ฐ’ ์ถœ๋ ฅ ๋ฐ ํ™œ์šฉ

JSX๋Š” HTML์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์ค‘๊ด„ํ˜ธ {}๋ฅผ ์‚ฌ์šฉํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Œ

//reactDescriptions ๋ฐฐ์—ด์—์„œ ๋žœ๋ค์œผ๋กœ ํ•˜๋‚˜์˜ ๋‹จ์–ด๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„
const reactDescriptions = ['Fundamental', 'Crucial', 'Core'];

function genRandomInt(max) { //genRandomInt(2)`๋Š” 0, 1, 2 ์ค‘ ๋ฌด์ž‘์œ„ ์ •์ˆ˜ ๋ฐ˜ํ™˜
  return Math.floor(Math.random() * (max + 1));
}
//Header ์ปดํฌ๋„ŒํŠธ ๋‚ด ๋™์  ํ‘œํ˜„ ์ ์šฉ
function Header() {
	// ๋ณ€์ˆ˜๋กœ ํ™œ์šฉ description์œผ๋กœ ์ง€์ •ํ•˜์—ฌ return๊ฐ’์— ์‚ฌ์šฉํ•œ๋‹ค. javascript ํ‘œํ˜„์€ ์ฝ”๋“œ ๋ฐ–์œผ๋กœ ์˜ฎ๊ธฐ๋ฉด jsx์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๊น”๋”ํ•ด ์งˆ ์ˆ˜ ์žˆ๋‹ค.
	const description = reactDescriptions[genRandomInt(2)]

  return (
    <header>
      <img src="src/assets/react-core-concepts.png" alt="Stylized atom" />
      <h1>React Essentials</h1>
      <p>
	    {/*reactDescriptions[genRandomInt(2)]}*/}
        {description} React concepts you will need for almost any app you are going to build!
      </p>
    </header>
  );
}

function App() {
  return (
    <div>
      <Header />
      <main>
        <h2>Time to get started!</h2>
      </main>
    </div>
  );
}

๋™์  HTML Attributes(์†์„ฑ) ์„ค์ • & ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋กœ๋”ฉ

// ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ importํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ
import reactImg from './assets/react-core-concepts.png'
//reactDescriptions ๋ฐฐ์—ด์—์„œ ๋žœ๋ค์œผ๋กœ ํ•˜๋‚˜์˜ ๋‹จ์–ด๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„
const reactDescriptions = ['Fundamental', 'Crucial', 'Core'];

function genRandomInt(max) { //genRandomInt(2)`๋Š” 0, 1, 2 ์ค‘ ๋ฌด์ž‘์œ„ ์ •์ˆ˜ ๋ฐ˜ํ™˜
  return Math.floor(Math.random() * (max + 1));
}

//Header ์ปดํฌ๋„ŒํŠธ ๋‚ด ๋™์  ํ‘œํ˜„ ์ ์šฉ
function Header() {
  // ๋ณ€์ˆ˜๋กœ ํ™œ์šฉ description์œผ๋กœ ์ง€์ •ํ•˜์—ฌ return๊ฐ’์— ์‚ฌ์šฉํ•œ๋‹ค. javascript ํ‘œํ˜„์€ ์ฝ”๋“œ ๋ฐ–์œผ๋กœ ์˜ฎ๊ธฐ๋ฉด jsx์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๊น”๋”ํ•ด ์งˆ ์ˆ˜ ์žˆ๋‹ค.
  const description = reactDescriptions[genRandomInt(2)]

  return (
    <header>
      {/* <img src="src/assets/react-core-concepts.png" alt="..." /> */}
      {/* src์†์„ฑ์— ๊ฒฝ๋กœ ์ง์ ‘ ์ž…๋ ฅ์€ ๋น„์ถ”์ฒœ ๋ฐฐํฌ ์‹œ ์ด๋ฏธ์ง€๊ฐ€ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ตœ์ ํ™”์— ๋ถˆ๋ฆฌํ•จ */}
      <img src={reactImg} alt="Stylized atom" />
      <h1>React Essentials</h1>
      <p>
        {/* ๋Œ€์‹  import ๋ฌธ์œผ๋กœ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ JS ๋ณ€์ˆ˜๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ณ , JSX์—์„œ ์ค‘๊ด„ํ˜ธ ๋ฌธ๋ฒ•์œผ๋กœ ์ฐธ์กฐํ•จ */}
        {/* ์ด ๋ฐฉ์‹์€ ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ์ด๋ฏธ์ง€ ํŒŒ์ผ๊นŒ์ง€ ์ž๋™์œผ๋กœ ๋ฒˆ๋“ค๋งํ•ด ๋ฐฐํฌ์— ์ ํ•ฉ */}
        {description} React concepts you will need for almost any app you are going to build!
      </p>
    </header>
  );
}

function App() {
  return (
    <div>
      <Header />
      <main>
        <h2>Time to get started!</h2>
      </main>
    </div>
  );
}

Prop(์†์„ฑ)์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ

1. ์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ

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

2. Props๋ž€?

  • props๋Š” ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜.
  • HTML ์š”์†Œ์˜ ์†์„ฑ์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์„ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ.
<CoreConcept
  title="Components"
  description="The core UI building blocks"
  image={componentsImg}
/>
  • props๋Š” ๋ฆฌ์•กํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜์— ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์ „๋‹ฌ
function CoreConcept(props) {
  return (
    <li>
      <img src={props.image} alt={props.title} />
      <h3>{props.title}</h3>
      <p>{props.description}</p>
    </li>
  );
}

๋” ๋‹ค์–‘ํ•œ Prop(์†์„ฑ) ๋ฌธ๋ฒ•

1. data.js ๋ชจ๋“ˆ ๋„์ž…

  • CORE_CONCEPTS๋Š” 4๊ฐœ์˜ ๊ฐœ๋…์„ ๋‹ด์€ ๋ฐฐ์—ด์ด๋ฉฐ, ๊ฐ ์š”์†Œ๋Š” ๋‹ค์Œ ์ •๋ณด๋ฅผ ํฌํ•จ:
    • image: ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ
    • title: ์ œ๋ชฉ
    • description: ์„ค๋ช…
import componentsImg from "./assets/components.png";
import propsImg from "./assets/config.png";
import jsxImg from "./assets/jsx-ui.png";
import stateImg from "./assets/state-mgmt.png";

// CORE_CONCEPTS ๋ณ€์ˆ˜๋Š” export๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ importํ•ด์„œ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ์Œ
export const CORE_CONCEPTS = [
  {
    image: componentsImg,
    title: "Components",
    description:
      "The core UI building block - compose the user interface by combining multiple components.",
  },
  {
    image: jsxImg,
    title: "JSX",
    description:
      "Return (potentially dynamic) HTML(ish) code to define the actual markup that will be rendered.",
  },
  {
    image: propsImg,
    title: "Props",
    description:
      "Make components configurable (and therefore reusable) by passing input data to them.",
  },
  {
    image: stateImg,
    title: "State",
    description:
      "React-managed data which, when changed, causes the component to re-render & the UI to update.",
  },
];

2. ์ปดํฌ๋„ŒํŠธ์— props๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

  • CoreConcept ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ , ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ props๋กœ ์ „๋‹ฌ
import { CORE_CONCEPTS } from './data.js';

function CoreConcept(props) {
  return (
    <li>
      <img src={props.image} alt={props.title} />
      <h3>{props.title}</h3>
      <p>{props.description}</p>
    </li>
  );
}

<CoreConcept 
  title={CORE_CONCEPTS[0].title} 
  description={CORE_CONCEPTS[0].description} 
  image={CORE_CONCEPTS[0].image} 
/>

3. ์ฝ”๋“œ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•: ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ

  • props์™€ ๊ฐ์ฒด ํ‚ค๊ฐ€ ๋™์ผํ•  ๊ฒฝ์šฐ, ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์œผ๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ
<CoreConcept {...CORE_CONCEPTS[0]} />

4. ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ์ตœ์ ํ™”: ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น

  • props.title ๋ฐฉ์‹ ๋Œ€์‹ , ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์œผ๋กœ props๋ฅผ ๊ฐ„๋‹จํžˆ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
function CoreConcept({ title, description, image }) {
  return (
    <li>
      <img src={image} alt={title} />
      <h3>{title}</h3>
      <p>{description}</p>
    </li>
  );
}
  • ํ•˜๋‚˜์˜ CoreConcept ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , 4๊ฐ€์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์žฌ์‚ฌ์šฉ
  • JSX ๊ตฌ์กฐ์™€ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ
  • ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต ์ œ๊ฑฐ, ์ฝ”๋“œ ๊ฐ„๊ฒฐํ™” ๋‹ฌ์„ฑ

๐Ÿ“‘ Reference



Pagination


ยฉ 2025. All rights reserved.

Powered by Hydejack v9.2.1