็„ก์ œ

Component (์ปดํฌ๋„ŒํŠธ) ๋ณธ๋ฌธ

<React>

Component (์ปดํฌ๋„ŒํŠธ)

yo-u-loo 2026. 7. 7. 22:41

 

๐ŸŸก Component

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

 

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

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

 

โ—ผ๏ธ ์ปดํฌ๋„ŒํŠธ์˜ ์ข…๋ฅ˜

 ๐Ÿ”น ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ (Functional Component)

  • JavaScript ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.
  • React Hooks๋ฅผ ์ง€์›ํ•จ์— ๋”ฐ๋ผ ์ƒํƒœ(State) ๊ด€๋ฆฌ์™€ ์ƒ๋ช…์ฃผ๊ธฐ(Lifecycle) ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด, ํ˜„์žฌ React์˜ ํ‘œ์ค€ ์ž‘์„ฑ ๋ฐฉ์‹์ด๋‹ค.

 

๐Ÿ”น ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ (Class Component)

  • JavaScript ํด๋ž˜์Šค ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉฐ React.Component๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค.
  • ๊ณผ๊ฑฐ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์“ฐ์˜€์œผ๋‚˜, Hooks ๋“ฑ์žฅ ์ดํ›„ ํ˜„์žฌ๋Š” ๋Œ€๋ถ€๋ถ„ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ๋Œ€์ฒด๋˜์—ˆ๋‹ค.

 

โ—ผ๏ธ ๋ช…๋ช… ๊ทœ์น™

React ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค. (PascalCase)

// HTML DOM ํƒœ๊ทธ๋กœ ์ธ์‹
const element1 = <div />;

// React ์ปดํฌ๋„ŒํŠธ๋กœ ์ธ์‹
const element2 = <Welcome name="๋ฆฌ์•กํŠธ" />; // Welcome์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘
  • ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ํƒœ๊ทธ๋Š” ํ‘œ์ค€ HTML ํƒœ๊ทธ(div, span ๋“ฑ)๋กœ ์ธ์‹ํ•œ๋‹ค.
  • ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ํƒœ๊ทธ๋งŒ ์‚ฌ์šฉ์ž ์ •์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์ธ์‹ํ•œ๋‹ค.

 

โ—ผ๏ธ ์ปดํฌ๋„ŒํŠธ์™€ Props

Props(Properties)๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ˆ˜๋‹จ์ด๋‹ค.

Props๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋™์ผํ•œ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ ๋‚ด์—์„œ ์ „๋‹ฌ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

<Button text="ํ™•์ธ" />
<Button text="์ทจ์†Œ" />
<Button text="์ €์žฅ" />
  • ์ „๋‹ฌ๋ฐ›๋Š” text ๊ฐ’์— ๋”ฐ๋ผ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฒ„ํŠผ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

โ—ผ๏ธ ์ปดํฌ๋„ŒํŠธ ์กฐํ•ฉ(Composition)

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ํฐ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์„ ์ปดํฌ๋„ŒํŠธ ์กฐํ•ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค.

App
 โ”œโ”€โ”€ Navbar
 โ”‚    โ””โ”€โ”€ NavLink
 โ”œโ”€โ”€ Heading
 โ”œโ”€โ”€ Card
 โ”‚    โ”œโ”€โ”€ Heading
 โ”‚    โ””โ”€โ”€ Button
 โ””โ”€โ”€ Image
  • ์ž‘์€ ๋‹จ์œ„์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๊ตฌ์กฐ๋ฅผ ๊ณ„์ธตํ™”ํ•˜๋ฉด ์ „์ฒด์ ์ธ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง„๋‹ค.

 

 

๐Ÿ“โ€Š POINT ๐Ÿ“โ€Š

โœ”๏ธ UI๋ฅผ ๋…๋ฆฝ์ ์ด๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค. โœ”๏ธ

โœ”๏ธ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Props ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๊ณ  ์ ์ ˆํžˆ ์กฐํ•ฉ(Composition)ํ•˜๋Š” ๊ฒƒ์ด React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ด๋‹ค. โœ”๏ธ

 

 


 

โš™๏ธ ์‹ค์ „ ์˜ˆ์ œ ์ฝ”๋“œ โš™๏ธ

๐Ÿ’ก ์ค‘์š” ์š”์ : ๋ฐฐ์—ด ๋ Œ๋”๋ง ์‹œ key ์„ค์ • map() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜๋ณต ์ƒ์„ฑํ•  ๋•Œ๋Š” ๊ณ ์œ ํ•œ key ์†์„ฑ์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

React๊ฐ€ ๋ณ€๊ฒฝ๋œ ์š”์†Œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ณ  ๊ฐ€์ƒ DOM์„ ํšจ์œจ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜๋‹ค.

import React from 'react';

// 1. ๊ธฐ๋ณธ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ
function Button(props) {
  return <button className="custom-button">{props.text}</button>;
}

// 2. ์ œ๋ชฉ ์ปดํฌ๋„ŒํŠธ
function Heading(props) {
  return <h1 className="title">{props.title}</h1>;
}

// 3. ์นด๋“œ ์ปดํฌ๋„ŒํŠธ (Heading, Button ์กฐํ•ฉ)
function Card(props) {
  return (
    <div className="card">
      <Heading title={props.title} />
      <p className="card-content">{props.content}</p>
      <Button text={props.buttonText} />
    </div>
  );
}

// 4. ์ด๋ฏธ์ง€ ์ปดํฌ๋„ŒํŠธ
function Image(props) {
  return <img src={props.src} alt={props.alt} className="custom-image" />;
}

// 5. ๋„ค๋น„๊ฒŒ์ด์…˜ ๋งํฌ ์ปดํฌ๋„ŒํŠธ
function NavLink(props) {
  return <a href={props.url} className="nav-link">{props.text}</a>;
}

// 6. ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ์ปดํฌ๋„ŒํŠธ
function Navbar(props) {
  return (
    <nav className="navbar">
      <ul>
        {/* ๋ฐฐ์—ด์„ ๋ Œ๋”๋งํ•  ๋•Œ๋Š” ๊ณ ์œ ํ•œ key ์†์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค */}
        {props.links.map((link, index) => (
          <li key={index}>
            <NavLink url={link.url} text={link.text} />
          </li>
        ))}
      </ul>
    </nav>
  );
}

// 7. App ์ปดํฌ๋„ŒํŠธ (์ตœ์ƒ์œ„ ์กฐํ•ฉ)
function App() {
  const navLinks = [
    { url: "/home", text: "ํ™ˆ" },
    { url: "/about", text: "์†Œ๊ฐœ" },
    { url: "/contact", text: "์—ฐ๋ฝ์ฒ˜" }
  ];

  return (
    <div className="app">
      <Navbar links={navLinks} />
      
      <div className="main-content">
        <Heading title="React ์ปดํฌ๋„ŒํŠธ ์˜ˆ์ œ" />
        
        <Card 
          title="์ฒซ ๋ฒˆ์งธ ์นด๋“œ" 
          content="์ด๊ฒƒ์€ React ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“  ์นด๋“œ์ž…๋‹ˆ๋‹ค." 
          buttonText="์ž์„ธํžˆ ๋ณด๊ธฐ" 
        />
        
        <Card 
          title="๋‘ ๋ฒˆ์งธ ์นด๋“œ" 
          content="์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค." 
          buttonText="ํ™•์ธํ•˜๊ธฐ" 
        />
        
        <Image 
          src="https://example.com/image.jpg" 
          alt="์˜ˆ์‹œ ์ด๋ฏธ์ง€" 
        />
      </div>
    </div>
  );
}

export default App;