🐨CoalaCoding
Docs▾
JavaScriptReactHTML & CSSBackendAI & LLMDev ToolsCreative
B반1
👾숏츠
🙉B반2
게시판
🐨CoalaCoding

디지털 크리에이터를 위한 한국어 기술 문서

문서

  • JavaScript
  • React
  • HTML & CSS
  • Backend
  • AI & LLM
  • Dev Tools
  • Creative

커뮤니티

  • 게시판
  • 예제 모음

기타

  • 관리자

정책

  • 소개
  • 개인정보처리방침
  • 이용약관
  • 연락처
© 2026 CoalaCoding. All rights reserved.
  • React 학습 전 필수 JavaScript 문법
  • 1. React 소스 코드 수정, 배포 및 렌더링
  • 2. 시작
  • 2. JSX 문법과 컴포넌트
  • 3. react-vite-설치
  • 3. 이벤트 처리
  • 4. 노코드리액트
  • 4. Hook
  • 5. csrssrreact-렌더링-참조글
  • 5. useContext로 전역 상태 관리
  • 6. 컴포넌트
  • 6. CSS 리액트에 넣는 5가지 방법
  • 7. 시작하기
  • 7. Props (속성)
  • 8. 2-scaffolding-react-project
  • 8. React Router
  • 9. props
  • 9. React 개발 환경 이해
  • 10. 3-웹문서-작성하기
  • 11. 컴포넌트
  • 12. map과컴포넌트
  • 13. event
  • 14. 4-리액트로-변경하기
  • 15. 컴포넌트-데이터관리
  • 16. composition
  • 17. 앱제작-준비
  • 21. 환경설정
  • 24. 컴포넌트-전략
  • 25. 리액트-네이버-로그인
  • 26. 리액트교안
  1. 홈
  2. 문서
  3. React
  4. React 기초
  5. 7. Props (속성)

7. Props (속성)

1. Props (속성)

부모 컴포넌트가 자식 컴포넌트에게 데이터를 전달하는 방법.

1.1. Props의 개념

Props는 Properties(속성)의 줄임말로, 부모 컴포넌트가 자식 컴포넌트에게 데이터를 전달할 때 사용하는 방법이다.

None: 컴포넌트를 함수라고 생각하면, Props는 그 함수에 전달하는 **매개변수(파라미터)**다.

// 일반 자바스크립트 함수 function greet(name) { // name은 매개변수 return 안녕, ${name}!; } greet("철수"); // "철수"는 인자

// React 컴포넌트 function Greeting(props) { // props는 매개변수 return

안녕, {props.name}!

; } // name="철수"는 prop


### 1.1.1. 데이터 흐름: 단방향 (Top-Down)

> **None**: **React의 핵심 원칙: 단방향 데이터 흐름**
> 
> 데이터는 **오직 위에서 아래로만** 흐른다. 물이 높은 곳에서 낮은 곳으로 흐르는 것과 같다.
> 
> ```jsx
// 할아버지 → 아버지 → 자식 순서로 흐름
function Grandparent() {
  const data = "중요한 정보";
  return <Parent info={data} />;  // 아래로 전달
}

function Parent(props) {
  return <Child info={props.info} />;  // 더 아래로 전달
}

function Child(props) {
  return <div>{props.info}</div>;  // 최종 사용
}

⚠️ 자식이 부모에게 직접 데이터를 전달할 수는 없다! (나중에 배울 "콜백 함수"를 통해 간접적으로 가능)

1.1.2. Props의 핵심 특징

  • 읽기 전용 (Read-Only): 자식 컴포넌트는 받은 Props를 절대 수정할 수 없다. 오직 읽기만 가능하다.
  • 재사용성: 같은 컴포넌트에 다른 Props를 전달하여 다양한 결과를 만들 수 있다.
  • 타입 제한 없음: 문자열, 숫자, 불리언, 객체, 배열, 함수 등 모든 자바스크립트 값을 전달 가능하다.

Tip: 왜 Props를 수정하면 안 될까?

React는 Props가 변하지 않는다고 가정하고 최적화를 수행한다. Props를 수정하면 예측 불가능한 버그가 발생하고 성능이 저하된다.

// ❌ 절대 하면 안 되는 것 function Profile(props) { props.name = "다른 이름"; // 오류! Props는 읽기 전용! return

{props.name}

; }

// ✅ 올바른 방법: 새로운 변수를 만들어 사용 function Profile(props) { const displayName = props.name.toUpperCase(); return

{displayName}

; }


## 1.2. Props 전달하고 받기

### 1.2.1. Props 전달 방법 (부모 → 자식)

HTML 속성을 쓰는 것과 비슷하게 컴포넌트 태그에 속성을 추가한다.

```jsx
// App.jsx (부모 컴포넌트)
function App() {
  return (
    <div>
      {/* 문자열 prop: 따옴표 사용 */}
      <Greeting name="김철수" />

      {/* 숫자 prop: 중괄호 사용 */}
      <Age value={25} />

      {/* 불리언 prop */}
      <User isAdmin={true} />
      <User isAdmin={false} />
      <User isAdmin />  {/* true는 생략 가능 */}

      {/* 배열 prop */}
      <List items={[1, 2, 3, 4, 5]} />

      {/* 객체 prop */}
      <Profile user={{ name: "철수", age: 25 }} />
    </div>
  );
}
💡포인트
  • 문자열: 따옴표로 감싸기 → name="철수"
  • 그 외 모두: 중괄호로 감싸기 → age={25}, isActive={true}
// ❌ 잘못된 예
<Age value="25" />  // 숫자가 아니라 문자열 "25"가 전달됨!

// ✅ 올바른 예
<Age value={25} />  // 숫자 25가 전달됨

1.2.2. Props 받기 (자식 컴포넌트)

자식 컴포넌트 함수의 첫 번째 매개변수로 props 객체를 받는다.

// Profile.jsx (자식 컴포넌트)
function Profile(props) {
  // props는 객체 형태로 전달됨
  console.log(props);
  // { name: "김철수", age: 25, isMember: true }

  return (
    <div className="border border-gray-300 p-5 m-2 rounded">
      <h2>이름: {props.name}</h2>
      <p>나이: {props.age}세</p>
      <p>회원여부: {props.isMember ? "정회원" : "준회원"}</p>

      {/* props를 이용한 조건부 렌더링 */}
      {props.isMember && <span className="text-green-500">✓ 인증됨</span>}
    </div>
  );
}

export default Profile;

1.2.3. Props 사용 예제: 재사용 가능한 버튼

Button.jsx

import './Button.css';

function Button(props) {
  // props로 버튼의 모양과 동작을 커스터마이징
  return (
    <button
      className={`btn ${props.size === 'large' ? 'btn-lg' : ''}`}
      style={{ backgroundColor: props.color || '#007bff' }}
      onClick={props.onClick}
      disabled={props.disabled}
    >
      {props.text}
    </button>
  );
}

export default Button;

Button.css

.btn {
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  font-size: 14px;
  cursor: pointer;
}

.btn-lg {
  font-size: 18px;
}

App.jsx

import Button from './Button';

function App() {
  return (
    <div>
      <Button text="기본 버튼" />
      <Button text="빨간 버튼" color="red" />
      <Button text="큰 버튼" size="large" color="#28a745" />
    </div>
  );
}

1.3. 구조 분해 할당 (Destructuring)

1.3.1. 왜 구조 분해 할당을 사용할까?

매번 props.name, props.age처럼 props.를 반복하는 것은 번거롭다. 구조 분해 할당을 사용하면 코드가 훨씬 간결해진다.

Info: Before (props 객체 사용)

function Profile(props) { return (

{props.name}

나이: {props.age}

); }

> 
> **After (구조 분해 할당 사용)**
> ```jsx
function Profile({ name, age }) {
  return (
    <div>
      <h2>{name}</h2>
      <p>나이: {age}</p>
    </div>
  );
}

1.4. Children Props

1.4.1. Children이란?

Children은 컴포넌트 태그 사이에 넣은 내용을 전달하는 특별한 prop이다. 일반 props와 달리 속성으로 전달하지 않는다.

Info: 일반 Prop vs Children Prop

// 일반 Props: 속성으로 전달


### 1.4.2. Children의 활용

Card 안에 Button을 넣어서 컴포넌트를 조합하는 예제이다.



#### Button.jsx


```jsx
import './Button.css';

function Button({ children, color }) {
  return (
    <button
      className="btn"
      style={{ backgroundColor: color || '#007bff' }}
    >
      {children}
    </button>
  );
}

export default Button;

Card.jsx

import './Card.css';

function Card({ children }) {
  return (
    <div className="card">
      {children}
    </div>
  );
}

export default Card;

App.jsx

import Card from './Card';
import Button from './Button';

function App() {
  return (
    <div>
      {/* Card 안에 텍스트 + Button 조합 */}
      <Card>
        <h2>회원가입</h2>
        <p>아래 버튼을 눌러 가입하세요.</p>
        <Button>가입하기</Button>
      </Card>

      <Card>
        <h2>설정</h2>
        <p>계정을 관리합니다.</p>
        <Button color="#28a745">저장</Button>
        <Button color="red">삭제</Button>
      </Card>
    </div>
  );
}

Button.css

.btn {
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  font-size: 14px;
  cursor: pointer;
  margin-right: 8px;
}

Card.css

.card {
  border: 1px solid #ddd;
  border-radius: 10px;
  padding: 20px;
  margin: 10px;
  box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.1);
}

1.4.3. React에서 자주 쓰는 연산자

연산자이름동작예시
||OR왼쪽이 falsy면 오른쪽 사용color || '#007bff'
??Nullish 병합null/undefined일 때만 오른쪽 사용name ?? '익명'
&&AND왼쪽이 truthy면 오른쪽 렌더링{isAdmin && <span>관리자</span>}
? :삼항조건에 따라 둘 중 하나 선택{isLogin ? '로그아웃' : '로그인'}
!NOT불리언 반전{!isLoading && <List />}

Tip: Children을 활용하면 Card 안에 Button, Button 안에 아이콘 등 컴포넌트를 자유롭게 조합할 수 있다. 이것이 React의 합성(Composition) 패턴이다.

목차

  • 1.1. Props의 개념
  • 1.1.2. Props의 핵심 특징
  • 1.4.2. Children의 활용
  • 1.4.3. React에서 자주 쓰는 연산자