전통적인 웹 개발(Vanilla JavaScript, jQuery)에서는 데이터가 변경될 때마다, 개발자가 직접 어떤 DOM 요소를 찾아 어떻게 변경할지를 코드로 작성해야 했습니다. 이는 UI가 복잡해질수록 코드를 관리하기 매우 어렵게 만듭니다.
React는 이러한 문제를 해결하기 위해 등장한 UI 라이브러리입니다.
JSX는 JavaScript를 확장한 문법으로, JavaScript 파일 내에서 HTML과 매우 유사한 형태로 UI 구조를 작성할 수 있게 해줍니다.
주요 규칙:
<div>나 <>(Fragment)를 사용)className 사용: HTML의 class 속성 대신 className을 사용합니다. (class는 JavaScript의 예약어){}를 사용하면 JSX 내부에 JavaScript 변수나 표현식을 넣을 수 있습니다.onclick 대신 onClick, background-color 대신 style={{ backgroundColor: 'red' }}와 같이 이벤트 핸들러나 스타일 속성은 카멜 케이스로 작성합니다.function App() {
const name = "React";
const style = { color: 'blue', fontSize: '20px' };
return (
<div className="container">
{/* JavaScript 변수 사용 */}
<h1>Hello, {name}!</h1>
{/* JavaScript 객체로 스타일 적용 */}
<p style={style}>This is a JSX example.</p>
</div>
);
}
컴포넌트는 UI를 구성하는 독립적이고 재사용 가능한 최소 단위입니다. 현대 React에서는 주로 함수형 컴포넌트를 사용합니다.
함수형 컴포넌트: JavaScript 함수이며, props라는 객체를 인자로 받아 화면에 렌더링될 React 엘리먼트(JSX)를 반환합니다.
특징:
// Greeting.js - 재사용 가능한 컴포넌트
function Greeting(props) {
return <h2>Hello, {props.name}!</h2>;
}
// App.js - 컴포넌트 합성
function App() {
return (
<div>
<Greeting name="Alice" />
<Greeting name="Bob" />
</div>
);
}
Props는 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달하기 위한 메커니즘입니다. React의 핵심적인 단방향 데이터 흐름(One-way Data Flow)을 구성합니다.
핵심 특징:
props를 절대 직접 수정해서는 안 됩니다. 이는 데이터 흐름을 예측 가능하게 만드는 중요한 원칙입니다.props를 하나의 객체로 전달받습니다.// ParentComponent.js
function ParentComponent() {
const userData = { name: "Charlie", age: 30, job: "Developer" };
// 자식에게 user라는 이름으로 객체 전달
return <ChildComponent user={userData} />;
}
// ChildComponent.js
// props 객체에서 user를 구조 분해 할당하여 사용
function ChildComponent({ user }) {
return (
<div>
<p>Name: {user.name}</p>
<p>Age: {user.age}</p>
<p>Job: {user.job}</p>
</div>
);
}
props를 수정할 수 없습니다.