React의 가장 큰 특징은 컴포넌트(Component)를 기반으로 UI를 구축한다는 점입니다. 컴포넌트는 화면을 구성하는 독립적이고 재사용 가능한 최소 단위 요소입니다.
웹 페이지를 Header, Main, Footer 세 가지 컴포넌트로 나누어 조립하는 예시입니다.
// /components/Header.js
function Header() {
return (
<header style={{ borderBottom: '1px solid #ccc', padding: '10px' }}>
<h1>React 핵심 개념 예제</h1>
<nav>
<a href="/" style={{ marginRight: '10px' }}>홈</a>
<a href="/about">소개</a>
</nav>
</header>
);
}
export default Header;
// /components/Main.js
function Main() {
return (
<main style={{ padding: '20px 0' }}>
<h2>메인 콘텐츠 영역</h2>
<p>이곳에 페이지의 주요 내용이 표시됩니다.</p>
</main>
);
}
export default Main;
// /components/Footer.js
function Footer() {
return (
<footer style={{ borderTop: '1px solid #ccc', padding: '10px', textAlign: 'center' }}>
<p>© 2025 My React App. All rights reserved.</p>
</footer>
);
}
export default Footer;
// /App.js
import Header from "./components/Header";
import Main from "./components/Main";
import Footer from "./components/Footer";
function App() {
return (
<div style={{ maxWidth: '800px', margin: '0 auto', padding: '20px' }}>
<Header />
<Main />
<Footer />
</div>
);
}
export default App;
React는 상태(State)와 선언형(Declarative) 프로그래밍 방식을 통해 동적인 화면 업데이트를 매우 쉽게 구현할 수 있습니다.
이는 DOM 요소를 직접 선택하고 수정하는 명령형(Imperative) 프로그래밍 방식과 대조됩니다.
useState Hook을 사용하여 상태(count)를 만들고, 버튼 클릭 시 이 상태를 변경하여 화면을 업데이트하는 예시입니다.
import { useState } from "react";
function Counter() {
// useState Hook: [상태 값, 상태를 변경하는 함수]
const [count, setCount] = useState(0);
const handleIncrement = () => {
setCount(count + 1);
};
const handleDecrement = () => {
setCount(count - 1);
};
return (
<div>
<h3>카운터 예제</h3>
<p>현재 카운트: <strong>{count}</strong></p>
<button onClick={handleIncrement}>+1 증가</button>
<button onClick={handleDecrement} style={{ marginLeft: '5px' }}>-1 감소</button>
</div>
);
}
export default Counter;
useState(0): count라는 상태를 0으로 초기화합니다.setCount(count + 1): setCount 함수가 호출되면 count 상태가 변경됩니다.count 상태 변화를 감지하고, Counter 컴포넌트를 다시 렌더링하여 화면의 숫자를 자동으로 업데이트합니다. DOM을 직접 조작하는 코드는 전혀 없습니다.React는 가상 DOM(Virtual DOM)을 사용하여 화면 업데이트 성능을 최적화합니다.
전통적인 DOM 조작의 문제점: 실제 DOM(Document Object Model)은 웹 페이지의 구조를 나타내는 객체 모델입니다. DOM을 직접 변경하는 작업은 브라우저의 렌더링 엔진을 다시 동작시켜야 하므로 비용이 크고, 잦은 변경은 성능 저하의 원인이 됩니다.
React의 해결 방식:
state나 props가 변경되면, React는 전체 UI를 메모리 상에 존재하는 가상 DOM에 먼저 렌더링합니다.setCount()가 호출됩니다.count 값이 적용된 새로운 가상 DOM 트리를 생성합니다.<p> 태그 안의 텍스트 노드만 변경된 것을 감지합니다.<p> 태그의 내용만 정확히 수정합니다.| 특징 | 설명 | 장점 |
|---|---|---|
| 컴포넌트 기반 | UI를 독립적이고 재사용 가능한 조각으로 나눔 | 유지보수 용이, 코드 재사용성 극대화 |
| 선언형 프로그래밍 | "무엇을" 그릴지 선언하면 상태에 따라 자동 갱신 | 직관적이고 예측 가능한 UI 로직 작성 |
| 가상 DOM | 변경 사항만 실제 DOM에 반영하여 성능 최적화 | 대규모 애플리케이션에서도 빠른 렌더링 속도 보장 |