[React] React Props로 데이터 전달하기

2026. 4. 7. 12:52·Web Frontend/React
반응형

React Props로 데이터 전달하기

이번에는 React에서 컴포넌트에 데이터를 전달하는 방법인 Props에 대해 알아보겠습니다.

React는 하나의 페이지를 여러 개의 컴포넌트로 나누고, 이를 조합하여 화면을 만드는 방식으로 동작합니다.

마치 레고 블록을 여러 개 조립해서 하나의 완성된 결과물을 만드는 것과 비슷합니다.

이때 같은 형태의 컴포넌트라도 전달하는 데이터에 따라 서로 다른 화면을 보여줄 수 있습니다.

예를 들어 여러 개의 Button 컴포넌트가 있다고 가정해 보겠습니다.

[메일]

[카페]

[블로그]

각 버튼의 구조는 같지만 버튼마다 표시되는 텍스트나 색상은 다를 수 있습니다.

이처럼 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달할 때 사용하는 값을 React에서는 Props(Properties)라고 합니다.


1. Props란?

Props는 부모 컴포넌트가 자식 컴포넌트에게 전달하는 데이터입니다.

예를 들어 App 컴포넌트에서 Button 컴포넌트를 사용한다고 가정해 보겠습니다.

<Button text="메일" color="red" />

여기서 Button 컴포넌트에 전달한 값은 다음과 같습니다.

  • text: 메일
  • color: red

이 값들은 Button 컴포넌트에서 Props로 전달받을 수 있습니다.

컴포넌트 관계를 그림으로 표현하면 다음과 같습니다.

         부모 컴포넌트
             App
              │
              │ Props 전달
              ▼
         자식 컴포넌트
           Button

즉, Props를 이용하면 다음과 같이 데이터를 전달할 수 있습니다.

부모 컴포넌트 → 자식 컴포넌트

Props는 React에서 컴포넌트를 재사용할 수 있도록 해주는 핵심 기능 중 하나입니다.


2. Props는 객체 형태로 전달된다

컴포넌트에 여러 개의 Props를 전달하면 자식 컴포넌트에서는 이를 하나의 객체 형태로 받을 수 있습니다.

예를 들어 부모 컴포넌트에서 다음과 같이 작성합니다.

<Button text="메일" color="red" />

자식 컴포넌트에서는 props라는 매개변수로 전달받을 수 있습니다.

const Button = (props) => {
  console.log(props);

  return (
    <button style={{ color: props.color }}>
      {props.text} - {props.color}
    </button>
  );
};

export default Button;

console.log(props)를 출력하면 대략 다음과 같은 객체 형태를 확인할 수 있습니다.

{
  text: '메일',
  color: 'red'
}

따라서 각각의 값은 객체의 프로퍼티를 통해 사용할 수 있습니다.

props.text
props.color

3. 구조 분해 할당으로 Props 사용하기

매번 props.text, props.color처럼 작성할 수도 있지만, JavaScript의 구조 분해 할당을 사용하면 조금 더 간결하게 작성할 수 있습니다.

const Button = ({ text, color }) => {
  return (
    <button style={{ color: color }}>
      {text} - {color}
    </button>
  );
};

다음 코드는,

const Button = (props) => {
  const text = props.text;
  const color = props.color;
};

와 비슷한 의미입니다.

구조 분해 할당을 사용하면 필요한 Props를 바로 꺼내서 사용할 수 있습니다.


4. Props의 기본값 설정하기

Button 컴포넌트에 color를 전달하지 않았다고 가정해 보겠습니다.

<Button text="카페" />

이 경우 color는 undefined가 됩니다.

하지만 기본 색상을 지정해 두면 color를 전달하지 않았을 때 자동으로 기본값을 사용할 수 있습니다.

구조 분해 할당에서 다음과 같이 기본값을 설정합니다.

const Button = ({ text, color = 'black' }) => {
  return (
    <button style={{ color: color }}>
      {text} - {color.toUpperCase()}
    </button>
  );
};

이제 다음과 같이 color를 전달하면 전달한 값을 사용합니다.

<Button text="메일" color="red" />

결과는 다음과 같습니다.

메일 - RED

반면 color를 전달하지 않으면 기본값인 black이 사용됩니다.

<Button text="카페" />

결과는 다음과 같습니다.

카페 - BLACK

참고: 기존의 defaultProps 방식

과거에는 함수 컴포넌트의 기본 Props를 다음과 같이 설정하기도 했습니다.

Button.defaultProps = {
  color: 'black',
};

하지만 현재 함수 컴포넌트에서는 JavaScript의 기본 매개변수와 구조 분해 할당을 사용하는 방식이 일반적입니다.

따라서 다음과 같이 작성하는 것이 간단합니다.

const Button = ({ color = 'black' }) => {
  // ...
};

5. 여러 개의 Props를 전달하기

부모 컴포넌트에서 여러 개의 Button을 사용할 수 있습니다.

App.jsx를 다음과 같이 작성해 보겠습니다.

import Button from './components/Button';

function App() {
  return (
    <>
      <Button text="메일" color="red" />
      <Button text="카페" />
      <Button text="블로그" color="blue" />
    </>
  );
}

export default App;

모든 컴포넌트는 동일한 Button 컴포넌트를 사용하지만 전달되는 Props에 따라 서로 다르게 표시됩니다.

메일 - RED
카페 - BLACK
블로그 - BLUE

즉, 하나의 컴포넌트를 만들어 두고 Props만 다르게 전달하면 여러 상황에서 재사용할 수 있습니다.

이것이 React 컴포넌트를 사용하는 큰 장점 중 하나입니다.

 


6. Spread 연산자로 Props 전달하기

Props가 많아지면 하나씩 전달하는 것이 번거로울 수 있습니다.

예를 들어 다음과 같은 객체가 있다고 가정해 보겠습니다.

const buttonProps = {
  text: '메일',
  color: 'red',
  a: 1,
  b: 2,
  c: 3,
};

이 객체의 값을 하나씩 전달하면 다음과 같이 작성해야 합니다.

<Button
  text={buttonProps.text}
  color={buttonProps.color}
  a={buttonProps.a}
  b={buttonProps.b}
  c={buttonProps.c}
/>

이때 **Spread 연산자(...)**를 사용할 수 있습니다.

<Button {...buttonProps} />

객체의 프로퍼티가 각각 Props로 전달됩니다.

즉, 위 코드는 다음과 같은 의미입니다.

<Button
  text="메일"
  color="red"
  a={1}
  b={2}
  c={3}
/>

Spread 연산자 사용 예제

App.jsx를 다음과 같이 작성할 수 있습니다.

import Button from './components/Button';

function App() {
  const buttonProps = {
    text: '메일',
    color: 'red',
    a: 1,
    b: 2,
    c: 3,
  };

  return (
    <>
      <Button {...buttonProps} />
      <Button text="카페" />
    </>
  );
}

export default App;

buttonProps 객체에 있는 값들이 Button 컴포넌트의 Props로 전달됩니다.

다만 실제로 컴포넌트에서 사용하지 않는 Props까지 무조건 전달하는 방식은 피하는 것이 좋습니다.

필요한 데이터가 명확할 때 사용하는 것이 코드의 가독성과 유지보수에 도움이 됩니다.


7. 컴포넌트 사이에 작성한 요소도 전달할 수 있다

Props는 태그의 속성으로 전달하는 값만 있는 것이 아닙니다.

컴포넌트의 시작 태그와 종료 태그 사이에 작성한 요소도 전달할 수 있습니다.

예를 들어 다음과 같이 작성할 수 있습니다.

<Button text="블로그">
  <Header />
  <div>자식 요소</div>
</Button>

Button 태그 사이에 작성된 요소는 특별한 Props인 **children**으로 전달됩니다.


children 사용하기

Button 컴포넌트에서 children을 전달받습니다.

const Button = ({ children, text, color = 'black' }) => {
  return (
    <button style={{ color: color }}>
      {text} - {color.toUpperCase()}
      {children}
    </button>
  );
};

export default Button;

이제 Button 컴포넌트 내부의 {children} 위치에 부모에서 전달한 내용이 렌더링됩니다.

예를 들어,

<Button text="블로그">
  <Header />
  <div>자식 요소</div>
</Button>

다음 부분이,

<Header />
<div>자식 요소</div>

children으로 전달됩니다.

그리고 Button 내부에서 다음 코드가 이를 화면에 표시합니다.

{children}

8. Props와 children의 관계

Props와 children을 함께 사용하면 다음과 같은 구조가 됩니다.

App
 │
 ├── text, color ──────────────┐
 │                              ▼
 │                          Button
 │                              │
 │
 └── <Header />, <div> ──── children
                                │
                                ▼
                             화면 렌더링

예를 들어 다음과 같습니다.

<Button text="블로그" color="blue">
  <Header />
  <div>자식 요소</div>
</Button>

전달되는 Props를 객체 형태로 생각하면 대략 다음과 같습니다.

{
  text: '블로그',
  color: 'blue',
  children: [
    <Header />,
    <div>자식 요소</div>,
  ],
}

실제 React 내부 구조를 그대로 표현한 것은 아니지만, text, color와 마찬가지로 children도 컴포넌트가 전달받는 Props라는 개념으로 이해하면 됩니다.


9. 전체 코드 정리

App.jsx

import Button from './components/Button';
import Header from './components/Header';

function App() {
  const buttonProps = {
    text: '메일',
    color: 'red',
    a: 1,
    b: 2,
    c: 3,
  };

  return (
    <>
      <Button {...buttonProps} />

      <Button text="카페" />

      <Button text="블로그">
        <Header />
        <div>자식 요소</div>
      </Button>
    </>
  );
}

export default App;

Button.jsx

const Button = ({ children, text, color = 'black' }) => {
  return (
    <button style={{ color: color }}>
      {text} - {color.toUpperCase()}
      {children}
    </button>
  );
};

export default Button;

마무리

이번에는 React에서 부모 컴포넌트가 자식 컴포넌트에게 데이터를 전달하는 Props에 대해 알아보았습니다.

정리하면 다음과 같습니다.

  1. Props는 부모 컴포넌트에서 자식 컴포넌트로 전달하는 데이터이다.
  2. 자식 컴포넌트에서는 Props를 객체 형태로 전달받을 수 있다.
  3. props.text와 같이 객체의 프로퍼티를 이용할 수 있다.
  4. 구조 분해 할당을 사용하면 Props를 간결하게 사용할 수 있다.
  5. 구조 분해 할당에서 기본값을 지정할 수 있다.
  6. Spread 연산자(...)를 이용하면 객체의 값을 한 번에 Props로 전달할 수 있다.
  7. 컴포넌트 태그 사이에 작성한 요소는 children Props로 전달된다.
  8. 자식 컴포넌트에서는 {children}을 통해 전달받은 요소를 렌더링할 수 있다.

React에서는 하나의 컴포넌트를 만들어 두고 Props를 다르게 전달함으로써 다양한 형태의 UI를 만들 수 있습니다.

예를 들어 하나의 Button 컴포넌트를 만들어도 Props에 따라 서로 다른 버튼을 만들 수 있습니다.

<Button text="메일" color="red" />
<Button text="카페" color="green" />
<Button text="블로그" color="blue" />

이처럼 컴포넌트를 재사용하고, 필요한 데이터를 Props로 전달하는 것은 React의 매우 중요한 개발 방식입니다.

다음 단계에서는 Props와 함께 자주 사용되는 State(상태)를 이용해 사용자 동작에 따라 화면을 변경하는 방법을 알아보겠습니다.

반응형
저작자표시 비영리 변경금지 (새창열림)
'Web Frontend/React' 카테고리의 다른 글
  • [React] State로 상태 관리하기 - useState와 리렌더링
  • [React] 이벤트 처리하기 - 이벤트 핸들링과 SyntheticEvent
  • [React] React JSX로 UI 표현하기
  • [React] React 컴포넌트란?
seunghwaan
seunghwaan
공부한 내용을 정리하는 개발 기록 블로그
    반응형
  • seunghwaan
    SH's Devlog
    seunghwaan
  • 전체
    오늘
    어제
    • 분류 전체보기 (158)
      • Android (62)
        • Basic (17)
        • Kotlin(Java) (14)
        • UI & Animation (1)
        • Compose (2)
        • Coroutines (1)
        • Dependency Injection (6)
        • RxJava (8)
        • BLE (3)
        • TDD (2)
        • JetPack (1)
        • NextStep (4)
        • Error Log (3)
      • Flutter (14)
        • Basic (5)
        • Dart (1)
        • State Management (2)
        • Widgets (4)
        • Error and Tips (2)
      • iOS (8)
        • Basic (0)
        • Swift (8)
      • Web Frontend (14)
        • Basic (0)
        • JavaScript (5)
        • TypeScript (0)
        • React (9)
      • CS(Computer Science) (18)
        • Network (4)
        • Database (10)
        • Design Pattern (1)
        • Computer Architecture (3)
        • Operating System (0)
      • Cloud (6)
        • AWS (6)
      • DevOps (25)
        • GIT (4)
        • CI CD (8)
        • Linux (4)
        • Docker (9)
        • Error Log (0)
      • 코딩테스트 (10)
        • DB (6)
        • 알고리즘 (4)
      • Backend (1)
        • Spring (1)
      • Mac Tip (0)
      • Language (0)
        • English (0)
        • Japanese (0)
      • Temporary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Algorithm
    상태 관리
    MySQL
    Dagger
    Web Frontend
    Android
    di
    React
    Kotlin
    JavaScript
    Swift
    CICD
    FLUTTER
    컴퓨터공학
    AWS
    IOS
    error
    gradle
    database
    네트워크
    Network
    Computer Science
    cs
    Linux
    Dependency Injection
    BLE
    시작하세요! 도커
    RxJava
    Jenkins
    docker
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
seunghwaan
[React] React Props로 데이터 전달하기
상단으로

티스토리툴바