한 눈에 보는 요약
컴포넌트는 레고 블록과 같습니다. 이때 Props는 외부에서 조립할 때 끼워주는 부품(설정값) 이고, State는 블록 내부에서 스스로 움직이는 스위치(상태값) 입니다.
| 특징 | Props | State |
| 개념 | 컴포넌트 외부에서 전달받는 데이터 | 컴포넌트 내부에서 관리하는 데이터 |
| 가변성 | 불변 / 읽기 전용 | 가변 / 변경 가능 |
| 업데이트 | 부모 컴포넌트가 재렌더링할 때 변경됨 | useState 등의 상태 변경 함수로 업데이트 |
| 용도 | 컴포넌트 간 데이터 전달 및 재사용 | UI의 동적인 상호작용 (입력, 클릭 등) 반영 |
Props 란?
Props는 부모 컴포넌트가 자식 컴포넌트에게 전달하는 '읽기 전용 데이터'입니다. 자식 컴포넌트 입장에서는 함수에 들어오는 파라미터(매개변수)와 같습니다.
주요 특징
-
함수 인와 유사: 외부로부터 값을 받아 컴포넌트의 형태나 내용을 결정합니다.
-
읽기 전용: 자식 컴포넌트 내부에서 전달받은 Props를 직접 수정할 수 없습니다. 데이터는 상위에서 하위로만 흐릅니다. (단방향 데이터 흐름)
Next.js 코드 예시
// 1. 자식 컴포넌트 (UserProfile.tsx)
interface UserProps {
name: string;
role: string;
}
export default function UserProfile({ name, role }: UserProps) {
return (
<div className="p-4 border rounded-lg shadow-sm">
<h2 className="text-xl font-bold">{name}</h2>
<p className="text-gray-500">{role}</p>
</div>
);
}
// 2. 부모 컴포넌트 (page.tsx)
import UserProfile from './UserProfile';
export default function Home() {
return (
<main className="p-8 space-y-4">
<h1 className="text-2xl font-bold">팀원 목록</h1>
{/* 부모가 자식에게 Props를 전달 */}
<UserProfile name="김철수" role="Next.js 개발자" />
<UserProfile name="이영희" role="UI/UX 디자이너" />
</main>
);
}
State 란?
State는 컴포넌트 내부에서 생성하고 제어하는 '동적 데이터'입니다. 사용자의 입력, 클릭 이벤트, 서버와의 통신 결과에 따라 값이 변하며, State가 바뀔 때마다 컴포넌트는 UI를 재렌더링 합니다.
주요 특징
-
로컬 변수와 유사: 컴포넌트 자체의 메모리 공간에 저장됩니다.
-
가변성:
useState훅이 제공하는 변경 함수를 통해 자유롭게 수정할 수 있습니다. -
렌더링 트리거: State가 변경되면 React는 바뀐 부분을 감지하여 UI를 자동으로 업데이트합니다.
⚠️ 주의 (Next.js 13+ App Router 기준): State를 사용하려면 파일 최상단에 "use client" 지시어를 작성하여 클라이언트 컴포넌트로 지정해야 합니다. (서버 컴포넌트는 State를 가질 수 없습니다.)
Next.js 코드 예시
"use client"; // State를 사용하기 위해 클라이언트 컴포넌트로 지정
import { useState } from "react";
export default function Counter() {
// useState(초기값) -> [현재 상태, 상태를 바꾸는 함수]
const [count, setCount] = useState<number>(0);
return (
<div className="p-6 max-w-sm mx-auto bg-white rounded-xl shadow-md text-center">
<p className="text-gray-500">현재 카운트</p>
<p className="text-4xl font-bold my-4">{count}</p>
<button
onClick={() => setCount(count + 1)}
className="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition"
>
1 증가
</button>
</div>
);
}
핵심 차이점 3가지 요약
-
주도권이 어디에 있는가?
-
Props: 나를 불러준 부모에게 주도권이 있습니다.
-
State: 컴포넌트 자기 자신에게 주도권이 있습니다.
-
-
값이 변할 수 있는가?
-
Props: 컴포넌트 내부에서 절대 변하지 않는 상수로 취급해야 합니다.
-
State: 컴포넌트 내부에서 이벤트에 따라 계속 변합니다.
-
-
재렌더링의 조건은 어떻게 되는가?
-
Props: 부모로부터 받는 Props 값이 바뀌면 자식도 재렌더링됩니다.
-
State: 내 State 값이 바뀌면 나 자신과 내 자식들이 재렌더링됩니다.
-