็„ก์ œ

React (๋ฆฌ์•กํŠธ) ๋ณธ๋ฌธ

<React>

React (๋ฆฌ์•กํŠธ)

yo-u-loo 2026. 7. 6. 17:18

 

 

๐Ÿ”ถ React ๐Ÿ”ถ

์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.

Meta(๊ตฌ Facebook)์—์„œ ๊ฐœ๋ฐœํ–ˆ์œผ๋ฉฐ, ์ปดํฌ๋„ŒํŠธ(Component) ๊ธฐ๋ฐ˜์œผ๋กœ UI๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.

 

โ—ผ๏ธ ์ฃผ์š” ํŠน์ง•

  • ๋†’์€ ์„ฑ๋Šฅ: Virtual DOM์„ ํ™œ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ํšจ์œจ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๋ฏ€๋กœ ๋น ๋ฅธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ์ œ๊ณตํ•œ๋‹ค.
    • ๋ถˆํ•„์š”ํ•œ ํ™”๋ฉด ๊ฐฑ์‹ ์„ ์ค„์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
  • ์žฌ์‚ฌ์šฉ์„ฑ: ์ปดํฌ๋„ŒํŠธ(Component) ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ UI ์š”์†Œ๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์›: ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด ๋‹ค์–‘ํ•œ ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ฐธ๊ณ  ์ž๋ฃŒ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฌธ์ œ ํ•ด๊ฒฐ์— ํ•„์š”ํ•œ ์ •๋ณด์™€ ์ง€์›์„ ๋น ๋ฅด๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ ์ง€์›:  React Native๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด React์˜ ์ปดํฌ๋„ŒํŠธ์™€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹์„ ํ™œ์šฉํ•˜์—ฌ Android์™€ iOS ๋„ค์ดํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์›น๊ณผ ๋ชจ๋ฐ”์ผ ๊ฐ„์˜ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ๊ฐœ๋ฐœ ํšจ์œจ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ‘‰ React๋Š” ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ์™€ Virtual DOM์„ ํ†ตํ•ด ํšจ์œจ์ ์ธ UI ๊ฐœ๋ฐœ์„ ์ง€์›ํ•œ๋‹ค. ํŠนํžˆ ๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(SPA) ๊ฐœ๋ฐœ์— ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋†’์€ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ’๋ถ€ํ•œ ์ƒํƒœ๊ณ„ ๋•๋ถ„์— ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—๋„ ์ ํ•ฉํ•˜๋‹ค.

 


 

โ—ผ๏ธ ํ•„์ˆ˜ ๋งค๋‰ด์–ผ ๋ชจ์Œ

๐Ÿ”น Component (์ปดํฌ๋„ŒํŠธ)

React์˜ ํ™”๋ฉด(UI)์„ ๋งŒ๋“œ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„.

function MyComponent() {
  return <h1>Hello, React!</h1>;
}
  • ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์ด๋‚˜ ํ™”๋ฉด์„ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  • ํ˜„๋Œ€ React์—์„œ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ(Function Component)๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

๐Ÿ”น JSX (JavaScript XML)

JavaScript ์•ˆ์—์„œ HTML์ฒ˜๋Ÿผ UI๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•.

const element = <h1>Hello, JSX!</h1>;
  • HTML์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ HTML์€ ์•„๋‹ˆ๋‹ค.
  • JSX๋Š” JavaScript ๋ฌธ๋ฒ• ํ™•์žฅ(Syntax Extension)์ด๋ฉฐ, ๋นŒ๋“œ ๊ณผ์ •์—์„œ JavaScript ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.
  • UI ๊ตฌ์กฐ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ”น Props (Properties)

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•.

// ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ
<Greeting name="World" />

// ์ž์‹ ์ปดํฌ๋„ŒํŠธ
function Greeting(props) {
  return <p>Hello, {props.name}!</p>;
}
  • ๋ถ€๋ชจ → ์ž์‹ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์ „๋‹ฌ๋œ๋‹ค. (๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„)
  • Props๋Š” ์ฝ๊ธฐ ์ „์šฉ(Read-only)์ด๋ฏ€๋กœ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

 

๐Ÿ”น useState

์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ(State)๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•œ Hook.

import { useState } from "react";

function Counter() {
  const [count, setCount] = useState(0); // count → ํ˜„์žฌ ๊ฐ’, setCount() → ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜, 0 → ์ดˆ๊ธฐ๊ฐ’

  return (
    <>
      <p>{count}</p>

      <button onClick={() => setCount(count + 1)}>
        ์ฆ๊ฐ€
      </button>
    </>
  );
}
  • ์นด์šดํ„ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ˜„์žฌ ๊ฐ’ ๋˜๋Š” ๋ชฉ๋ก์˜ ํ•ญ๋ชฉ ๋“ฑ ๋™์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. 
  • State๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด React๊ฐ€ ์ž๋™์œผ๋กœ ํ™”๋ฉด์„ ๋‹ค์‹œ ๋ Œ๋”๋ง(Re-rendering)ํ•œ๋‹ค.

 

๐Ÿ”น useEffect

๋ Œ๋”๋ง ์ดํ›„ ๋ถ€์ˆ˜ ํšจ๊ณผ(Side Effect)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” Hook.

import { useState, useEffect } from "react";

function DataFetcher() {
  const [data, setData] = useState(null);

  useEffect(() => {
    // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋งˆ์šดํŠธ(๋ Œ๋”๋ง)๋œ ํ›„ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(result => setData(result));
  }, []); // ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋น„์–ด์žˆ์œผ๋ฉด ์ตœ์ดˆ 1ํšŒ๋งŒ ์‹คํ–‰, ๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ทธ ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค ์žฌ์‹คํ–‰

  return (
    <div>
      {data ? <p>๋ฐ์ดํ„ฐ: {data.message}</p> : <p>๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค...</p>}
    </div>
  );
}
  • API ์š”์ฒญ, ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ, ์ด๋ฒคํŠธ ๋“ฑ๋ก, ํƒ€์ด๋จธ ์‹คํ–‰, DOM ์กฐ์ž‘ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํšจ๊ณผ์ ์ด๋‹ค. 

 

๐Ÿ”น Conditional Rendering (์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง)

ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ๋ฒ•.

function UserStatus({ isLoggedIn }) {
  return (
    <>
      {isLoggedIn ? <p>ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!</p> : <p>๋กœ๊ทธ์ธํ•ด์ฃผ์„ธ์š”.</p>}
    </>
  );
}
  • ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
    • ์‚ผํ•ญ ์—ฐ์‚ฐ์ž: ์กฐ๊ฑด ? ์ฐธ์ผ ๋•Œ : ๊ฑฐ์ง“์ผ ๋•Œ
    • if๋ฌธ: if (isLoggedIn) { return <Home />; } return <Login />;
    • && ์—ฐ์‚ฐ์ž: {isLoggedIn && <Home />} (์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ๋งŒ ์šฐํ•ญ์„ ๋ Œ๋”๋ง)

 

๐Ÿ”น map()

๋ฐฐ์—ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ํ™”๋ฉด์— ์ถœ๋ ฅํ•  ๋•Œ ์‚ฌ์šฉ.

function ItemList({ items }) {
  return (
    <ul>
      {items.map(item => (
        <li key={item.id}>
          {item.name}
        </li>
      ))}
    </ul>
  );
}
  • ๊ฐ ์š”์†Œ๋งˆ๋‹ค ๊ณ ์œ ํ•œ key๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค. (React๊ฐ€ ๋ณ€๊ฒฝ๋œ ์š”์†Œ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•จ)
  • key๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๋ฐ์ดํ„ฐ์˜ ๊ณ ์œ  ID๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ, ๋ฐฐ์—ด์˜ index๋Š” ์ˆœ์„œ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.

 

๐Ÿ”น Event Handling (์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ)

์‚ฌ์šฉ์ž์˜ ๋™์ž‘์— ๋ฐ˜์‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„.

function ButtonClicker() {
  const handleClick = () => {
    alert("๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
  };

  return (
    <button onClick={handleClick}>
      ํด๋ฆญ
    </button>
  );
}
  • ๋Œ€ํ‘œ์ ์ธ ์ด๋ฒคํŠธ
    • onClick
    • onChange
    • onSubmit
    • onKeyDown
  • HTML์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ์™€ ์œ ์‚ฌํ•˜๋‚˜, React์—์„œ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ JSX ์š”์†Œ์— ์ง์ ‘ ์ „๋‹ฌํ•˜๋ฉฐ, ์ด๋ฒคํŠธ ์ด๋ฆ„์€ ์นด๋ฉœ์ผ€์ด์Šค(camelCase)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

๐Ÿ“‹ ํ•ต์‹ฌ ์š”์•ฝํ‘œ ๐Ÿ“‹

๊ฐœ๋… ์—ญํ•  ํ•œ ์ค„ ์š”์•ฝ
Component ํ™”๋ฉด ๊ตฌ์„ฑ UI๋ฅผ ๋งŒ๋“œ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜
JSX UI ์ž‘์„ฑ JavaScript์—์„œ HTML์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋Š” ๋ฌธ๋ฒ•
Props ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ถ€๋ชจ๊ฐ€ ์ž์‹์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ
useState ์ƒํƒœ ๊ด€๋ฆฌ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ
useEffect ๋ถ€์ˆ˜ ํšจ๊ณผ ์ฒ˜๋ฆฌ ๋ Œ๋”๋ง ํ›„ ์‹คํ–‰ํ•  ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” Hook
Conditional Rendering ์กฐ๊ฑด ๋ถ„๊ธฐ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ UI๋ฅผ ์ถœ๋ ฅ
map() ๋ฐ˜๋ณต ์ถœ๋ ฅ ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ํ™”๋ฉด์— ํ‘œ์‹œ
Event Handling ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ํด๋ฆญ·์ž…๋ ฅ ๋“ฑ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ

 

'<React>' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Component (์ปดํฌ๋„ŒํŠธ)  (0) 2026.07.07
Create React App(CRA) tool chain  (0) 2026.07.06
VS Code์—์„œ React ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ  (0) 2026.07.06
Node.js ์„ค์น˜์™€ CMD&Powershell ์‚ฌ์šฉ  (0) 2026.07.06
My Directory Setting  (0) 2026.07.06