웹/React

[React] props에 대해 알아보자

leebaek 2025. 3. 23. 20:32

 

■ props란 ?

props 구조 분해 할당


props란 ?

- 컴포넌트 간데이터를 전달하기 위해 사용되는 읽기 전용 객체

- properties의 줄임말

 

⭐️ 부모 컴포넌트가 자식 컴포넌트에 값을 넘겨줄 때 사용해요.


React 컴포넌트함수라는거 잊지 않으셨죠 ?

쉽게 생각하면,

props 함수의 매개변수에요.

function Child(props) {
  return <p>{props.name}님 안녕하세요!</p>;
}

function App() {
  return <Child name="이백" />;
}

이해를 돕기 위해 일반 함수와 React 컴포넌트를 비교해볼게요.

 

📒↓인사말을 출력하는 greet 함수가 있어요.

function greet(name) {
  console.log(name+"님 안녕하세요!");
}

 


 

📘↓인사말을 출력하는 Child 컴포넌트가 있어요.

function Child(props) {
  return <p>{props.name}님 안녕하세요!</p>;
}

 

greet 함수에선 name을 매개변수로 정의했고,

Child는 props를 매개변수로 정의했네요.


📒 ↓  greet 함수는 아래와 같이 호출할 수 있어요.

greet("이백");
// 원하는 결과 : 이백님 안녕하세요!

 


 

📘↓  Child 컴포넌트는 아래와 같이 사용할 수 있어요.

function  App() {
  return <Child name="이백" />;
}
// 원하는 결과: 이백님 안녕하세요!

 

"이백" greet 함수의 인자인건 바로 보일 것 같아요.

 

하지만, Child 컴포넌트에서 인자가 무엇인지 감이 잘 안 올 것 같아요 !

 

greet 함수와 동일하게 "이백"일까요 ??

정답은 ❌

return <p>{props.name}님 안녕하세요!</p>;

 

"이백"이 인자라면, {props.name}가 아니라 {props}를 써야하는거 아닌가요 ?? 

맞는지 코드를 실행시켜볼게요.

props.name으로 실행한 결과
props로 실행한 결과

어라 에러가 떴어요.

뭔가 이상하죠  @ ~ @ ;;

 

에러 메세지를 해석해보면,

객체는 React Child로 유효하지 않다. (키: {name}을 가진 객체를 찾음 )

→ 즉, JSX안에서 {객체}를 넣으려고 해서 생긴 문제에요.

객체라니 ?? 🧐

greet 함수처럼 "이백"이 인자로 간게 아니라,

{name: "이백"}이 인자로 전달된거에요. ! 인자값이 객체인거죠.

그래서 객체 안의 속성 name을 읽어온거구요.

이제 왜 props.name을 썼는지 이해되시죠 !?

 

‼ 아래 구조 분해 할당에 나오는

Profile 컴포넌트의 인자는 무엇인지 맞혀보세요 ~ 


■ props 구조 분해 할당

우리는 이제 props를 전달하는 방법을 알아요. 

function Profile(props) {
  return (
    <div>
      <h2>{props.name}</h2>
      <p>{props.age}세 / {props.job}</p>
    </div>
  );
}


function App() {
  return <Profile name="이백" age="23" job="대학생" />;
}

 

 

여기서 코드를 더 짧고, 깔끔하고, 읽기 쉽게 만들기 위해 구조 분해 할당을 사용할 거에요.

function Profile({ name, age, job }) {
  return (
    <div>
      <h2>{name}</h2>
      <p>{age}세 / {job}</p>
    </div>
  );
}


function App() {
  return <Profile name="이백" age="23" job="대학생" />;
}

 

→ Profile의 매개변수에서 props 대신 구조 분해한 형태로 { name, age, job } 정의해주었어요 ! 

구조 분해 할당을 쓰니, 확실히 불필요한 코드가 없어지는 것을 볼 수 있죠 ? ( props. 과 같은 ! )

필수는 아니고 선택 사항이랍니당.  😀

 

> Profile의 인자 정답 보기

더보기

{ name: "이백", age: "23",  job: "대학생" }


 

니꼬 선생님의 강의를 듣고, 지피티의 도움을 받아 작성한 글이에요 !  😆

 

다음 포스팅에서 만나요 ~