Unit4 - [React] Intro

์˜ˆ์ง„ยท2022๋…„ 10์›” 1์ผ
0
post-thumbnail

๐Ÿ”ฅ React Intro

React : ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ JavaScript ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ์˜คํ”ˆ์†Œ์Šค : ์†Œ์Šค๊ฐ€ ๊ณต๊ฐœ๋˜์–ด ์žˆ์Œ(์ €์ž‘๊ถŒ์ž๊ฐ€ ๊ณต๊ฐœ), ๋ˆ„๊ตฌ๋‚˜ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ, ๋ณต์ œ, ๋ฐฐํฌ, ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ์†Œํ”„ํŠธ์›จ์–ด
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ์ผ์ข…์˜ ํ•จ์ˆ˜ ์ง‘ํ•ฉ

- React 3๊ฐ€์ง€ ํŠน์ง• : ์„ ์–ธํ˜•, ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜, ๋ฒ”์šฉ์„ฑ

  • ์„ ์–ธํ˜• (Declarative)
    : ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ JSX๋ฅผ ํ™œ์šฉํ•œ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    => ๋ฌด์—‡์— ์ง‘์ค‘ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ๊ฒƒ

  • ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ (Component-Based)
    : ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์ฝ”๋“œ๋ฅผ ๋ฌถ์–ด๋‘” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ
    => ๋…๋ฆฝ์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ โ†‘ => ๊ธฐ๋Šฅ ์ž‘๋™(์œ ์ง€ ๋ณด์ˆ˜, ์œ ๋‹› ํ…Œ์ŠคํŠธ)์— ์ง‘์ค‘ํ•˜์—ฌ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ

  • ๋ฒ”์šฉ์„ฑ (Learn Once, Write Anywhere)
    : JavaScript ํ”„๋กœ์ ํŠธ ์–ด๋””์—๋“  ์œ ์—ฐํ•˜๊ฒŒ ์ ์šฉ ๊ฐ€๋Šฅ (๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์•ฑ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ)

1. JSX (JavaScript XML)

: JavaScript๋ฅผ ํ™•์žฅํ•œ ๋ฌธ๋ฒ• (HTML + JavaScript = JSX) & ๋ณต์žก์„ฑโ†“ ๊ฐ€๋…์„ฑโ†‘

  • JSX๋Š” "Babel"์„ ์ด์šฉํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” JavaScript๋กœ ์ปดํŒŒ์ผ ํ•œ๋‹ค.
  • React์—์„œ๋Š” DOM๊ณผ ๋‹ค๋ฅด๊ฒŒ CSS, JSX ๋ฌธ๋ฒ•๋งŒ ๊ฐ€์ง€๊ณ  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JavaScript๋งŒ์œผ๋กœ ๋งˆํฌ์—…(markup)ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ DOM์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๊ณ , Javascript, HTML ๋ฌธ๋ฒ•์˜ ๊ธฐ๋Šฅ๊ณผ ๊ตฌ์กฐ๋ฅผ ํ•œ๋ˆˆ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
import React from "react";

function App() {
  const user = {
    firstName: "React",
    lastName: "JSX Activity",
  };

  function formatName(user) {
    return user.firstName + " " + user.lastName;
  }
  
   // JSX์—†์ด ํ™œ์šฉํ•œ React
  // return React.createElement("h1", null, `Hello, ${formatName(user)}!`);

  // JSX๋ฅผ ํ™œ์šฉํ•œ React
  return <h1>Hello, {formatName(user)}!</h1>;
}

export default App;

ํ•˜๋‚˜์˜ ํŒŒ์ผ์—์„œ HTML๊ณผ JavaScript๋กœ ๋‚˜๋ˆ„์–ด์กŒ๋˜ ๋‘ ๊ฐ€์ง€ ์ผ์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ ํ•œ๋‹ค.
=> JSX๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋งŒ ๋ฐ”๋ผ๋ณด๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ๋•๋Š”๋‹ค.

- ์ฃผ์š” JSX ๋ฌธ๋ฒ•

1) ํ•˜๋‚˜์˜ ์—˜๋ฆฌ๋จผํŠธ ์•ˆ์— ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ํฌํ•จ๋œ๋‹ค.

(์ตœ์ƒ์œ„์—์„œ opening tag์™€ closing tag๋กœ ๊ฐ์‹ธ์ค˜์•ผ ํ•œ๋‹ค.)

<div>
  <div>
    <h1>Hello</h1>
  </div>
  <div>
    <h1>World</h1>
  </div>
</div>

2) ์—˜๋ฆฌ๋จผํŠธ ํด๋ž˜์Šค ์‚ฌ์šฉ ์‹œ, className ์œผ๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.

(class๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด JavaScript ํด๋ž˜์Šค๋กœ ๋ฐ›์•„๋“ค์ธ๋‹ค.)

<div className="greeting">Hi!</div>

3) JavaScript ํ‘œํ˜„์‹ ์‚ฌ์šฉ ์‹œ, ์ค‘๊ด„ํ˜ธ{}๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

(์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ธ์‹ํ•œ๋‹ค.)

function App() {
  const name = "yejin";

  return <div>Hi {name}</div>;
}

4) ์‚ฌ์šฉ์ž ์ •์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ (PascalCase) = ์‚ฌ์šฉ์ž ์ •์˜ ์ปดํฌ๋„ŒํŠธ

(์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋ฉด ์ผ๋ฐ˜์ ์ธ HTML ์—˜๋ฆฌ๋จผํŠธ๋กœ ์ธ์‹ํ•œ๋‹ค.)

function Hello() {
  return <div>Hi</div>;
}

function HelloWorld() {
  return <Hello />;
}

5) ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์—๋Š” ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์‚ฌ์šฉํ•œ๋‹ค.

(if๋ฌธ์ด ์•„๋‹Œ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด์•ผํ•œ๋‹ค.)

<div>
  {1 + 1 === 2 ? <p>์ •๋‹ต</p> : <p>ํƒˆ๋ฝ</p>}
</div>

6) ์—ฌ๋Ÿฌ ๊ฐœ์˜ HTML ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ํ‘œ์‹œํ•  ๋•Œ, map() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

- map ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ "key" JSX ์†์„ฑ์„ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.

const posts = [
  { id: 1, title: "Hello", content: "Welcome" },
  { id: 2, title: "World", content: "Welcome !!" },
];

function App() {
  const content = post.map((post) => {
    <div key={post.id}>
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </div>;
  });
}

2. map์„ ์ด์šฉํ•œ ๋ฐ˜๋ณต

map (๋‚ด์žฅ ๊ณ ์ฐจ ํ•จ์ˆ˜)

: React์—์„œ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋ง ํ•  ๋•Œ ์‚ฌ์šฉ
=> ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ ํŠน์ • ๋…ผ๋ฆฌ(ํ•จ์ˆ˜)์— ์˜ํ•ด ๋‹ค๋ฅธ ์š”์†Œ๋กœ ์ง€์ •(map)ํ•œ๋‹ค.

const posts = [
  { id: 1, title: "Hello", content: "Welcome" },
  { id: 2, title: "World", content: "Welcome!!" },
];

function App() {
  const postToElement = (post) => (
    <div>
      <h3>{post.title}</h3>
      <p>{post.content}</p>
    </div>
  );

  const blogs = posts.map(postToElement);

  return <div>{blogs}</div>;
}
export default App;

- key ์†์„ฑ

: ๋ณ€ํ•˜์ง€ ์•Š๊ณ , ์˜ˆ์ƒ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์œ ์ผํ•ด์•ผ ํ•œ๋‹ค.

  • key ์†์„ฑ๊ฐ’์€ ๊ฐ€๋Šฅํ•˜๋ฉด ๋ฐ์ดํ„ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” id๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค.
    (๋งŒ์•ฝ ๊ณ ์œ ํ•œ id๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฅผ ๋„ฃ์–ด์„œ ํ•ด๊ฒฐ, ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋Š” ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉ)
  • key ์†์„ฑ์˜ ์œ„์น˜ : map ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์— ์žˆ๋Š” ์—˜๋ฆฌ๋จผํŠธ, ์ฒซ ์—˜๋ฆฌ๋จผํŠธ์— ๋„ฃ์–ด์ค€๋‹ค.

React์—์„œ map ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ์‹œ, key ์†์„ฑ์„ ๋„ฃ์ง€ ์•Š์œผ๋ฉด key๋ฅผ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒฝ๊ณ ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

const posts = [
  { id: 1, title: "Hello", content: "Welcome" },
  { id: 2, title: "World", content: "!!" }
];

function App() {
  const blogs = posts.map((post) => (
    <div key={post.id}>
      <h3>{post.title}</h3>
      <p>{post.content}</p>
    </div>
  ));
  return <div>{blogs}</div>;
}

export default App;

3. Component

: ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์ฝ”๋“œ ๋ฌถ์Œ or UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•„์ˆ˜ ์š”์†Œ

=> ์œ„์™€ ๊ฐ™์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค๊ณ  ์กฐํ•ฉํ•˜๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • ๋ชจ๋“  React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ๊ด€๊ณ„๋ฅผ ์œ„์™€ ๊ฐ™์ด ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ˜•์ƒํ™”ํ•˜์—ฌ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ทผ์›(root)์—ญํ• ์„ ํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

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

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


๐Ÿ”ฅ Create React App

: React SPA๋ฅผ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ง„ ํˆด ์ฒด์ธ

- ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ : npx create-react-app ํด๋”๋ช…
- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ : npm start

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