React - Overview
contents
1. React란 무엇인가?
React는 사용자 인터페이스(UI)를 만들기 위한 오픈 소스 자바스크립트 라이브러리(완전한 프레임워크가 아님)이며, 특히 싱글 페이지 애플리케이션(SPA) 개발에 최적화되어 있습니다. 페이스북(현 Meta)이 개발하여 2013년에 공개했습니다.
"3대 원칙" (The Big Three)
React를 이해하려면 다음 세 가지 기둥을 이해해야 합니다.
- 선언형 (Declarative): 현재 데이터(State)를 기반으로 UI가 무엇(What) 이 되어야 하는지를 React에게 알려주면, React가 어떻게(How) DOM을 업데이트할지 효율적으로 처리합니다. 개발자가 직접 DOM을 조작(예:
document.getElementById('demo').innerText = ...)하지 않습니다. - 컴포넌트 기반 (Component-Based): 자체 상태를 관리하는 캡슐화된 '컴포넌트'를 만들고, 이를 조립하여 복잡한 UI를 구성합니다.
- 한 번 배워서 어디서나 사용 (Learn Once, Write Anywhere): React는 웹(React DOM), 모바일(React Native), 심지어 VR(React 360) 렌더링까지 지원합니다.
2. 핵심 개념 및 문법
JSX (JavaScript XML)
React는 JSX라는 문법 확장을 사용합니다. HTML처럼 보이지만, 자바스크립트 내부에서 직접 마크업을 작성할 수 있게 해줍니다.
const element = Hello, {name}!
;
- 브라우저는 JSX를 읽지 못합니다. 따라서 Babel과 같은 도구를 통해 표준 자바스크립트 함수 호출(
React.createElement())로 변환(Transpile)되어야 합니다. - 카멜 케이스 (CamelCase): HTML 속성은 카멜 케이스로 작성됩니다 (예:
onclick→onClick,class→className).
컴포넌트 (Components)
React의 모든 것은 컴포넌트입니다. 역사적으로 두 가지 유형이 있었으나, 현재는 함수형 컴포넌트가 표준입니다.
- 함수형 컴포넌트 (Functional Components): JSX를 반환하는 단순한 자바스크립트 함수입니다.
- 클래스형 컴포넌트 (Class Components): 예전 방식(ES6 클래스)입니다. 주로 레거시 코드에서 볼 수 있습니다.
Props vs. State
React 데이터 흐름에서 가장 중요한 구분입니다.
| 기능 | 설명 | 변경 가능성 (Mutability) |
|---|---|---|
| Props | "Properties"의 약자. 부모 컴포넌트에서 자식으로 내려주는 데이터. | 읽기 전용 (Immutable) |
| State | 컴포넌트 _내부_에서 관리되는 데이터. State가 변경되면 컴포넌트는 다시 렌더링(Re-render)됩니다. | 변경 가능 (Setter 함수 사용) |
단방향 데이터 흐름 (Unidirectional Data Flow)
React의 데이터는 오직 한 방향(위에서 아래로)으로만 흐릅니다. 부모는 자식에게 Props로 데이터를 줍니다. 만약 자식이 부모에게 데이터를 보내야 한다면, 부모가 자식에게 *함수(콜백)*를 전달하고 자식이 그 함수를 실행하는 방식을 사용합니다.
3. 마법과 같은 원리: Virtual DOM & 재조정
React의 가장 큰 혁신 중 하나는 가상 DOM (Virtual DOM) 입니다.
- 스냅샷 (The Snapshot): 앱의 상태(State)가 변경되면, React는 새로운 "가상 DOM" 트리(UI를 표현하는 가벼운 자바스크립트 객체)를 생성합니다.
- 비교 (Diffing): React는 이 새로운 트리와 이전 가상 DOM 트리를 비교하여 정확히 무엇이 바뀌었는지 찾아냅니다. 이 과정을 재조정(Reconciliation) 이라고 합니다.
- 패치 (Patching): React는 실제 브라우저 DOM에서 변경된 부분만 업데이트합니다. 이는 페이지 전체를 새로고침하거나 수동으로 DOM을 조작하는 것보다 훨씬 빠릅니다.
4. Hooks: 현대적인 엔진 (v16.8+)
2019년 이전에는 "State"를 사용하려면 클래스형 컴포넌트가 필요했습니다. 하지만 Hooks의 등장으로 함수형 컴포넌트에서도 State와 생명주기(Lifecycle) 기능을 사용할 수 있게 되었습니다.
필수 Hooks
-
useState: 함수형 컴포넌트에 상태 변수를 추가할 수 있게 해줍니다.const [count, setCount] = useState(0); -
useEffect: "부수 효과(Side effects)"를 처리합니다 (데이터 가져오기, 구독, 문서 제목 변경 등).componentDidMount나componentDidUpdate같은 생명주기 메서드를 대체합니다. -
useContext: 모든 레벨에 일일이 Props를 넘기지 않고도(Prop Drilling 방지) 전역 데이터(테마, 사용자 인증 등)에 접근할 수 있게 해줍니다.
성능 관련 Hooks
useMemo: 무거운 연산 결과를 캐싱(저장)하여 매 렌더링마다 다시 계산하지 않도록 합니다.useCallback: 함수 정의를 캐싱하여 매 렌더링마다 함수가 새로 생성되는 것을 방지합니다 (자식 컴포넌트에 함수를 넘길 때 유용).
5. 고급 개념
Context API
컴포넌트 트리 전체에 데이터를 전달할 수 있는 방법으로, 일일이 수동으로 Props를 전달할 필요가 없습니다. React에 내장된 전역 상태 관리 도구라고 볼 수 있습니다.
React Fiber
React v16에서 도입된 새로운 내부 엔진입니다. React의 렌더링을 비동기적이고 중단 가능하게 만들었습니다.
- 타임 슬라이싱 (Time Slicing): 무거운 렌더링 작업을 작은 조각으로 나누고, 중간중간 사용자 입력(타이핑 등)을 처리할 수 있도록 일시 정지하여 앱의 반응성을 유지합니다.
React Server Components (RSC)
최신 기술이며 Next.js를 통해 대중화되었습니다.
- 기존 React: 브라우저가 거대한 JS 번들을 다운로드하고 모든 것을 렌더링합니다 (클라이언트 사이드 렌더링, CSR).
- RSC: 컴포넌트가 서버에서 렌더링되고, HTML/CSS 결과만 클라이언트로 전송됩니다. 해당 컴포넌트를 위한 자바스크립트 코드는 브라우저로 전송되지 않아 로딩 속도가 획기적으로 빨라집니다.
6. 생태계 (The Stack)
React는 라이브러리이므로 완전한 앱을 만들려면 다른 도구들이 필요합니다.
라우팅 (Routing)
- React Router: 페이지 새로고침 없이 URL을 변경하고 이동하는 내비게이션 표준입니다.
상태 관리 (State Management)
useState와 Context만으로 부족할 때 (복잡한 앱의 경우):
- Redux: "고전적인" 선택지입니다. 강력하지만 보일러플레이트(상용구) 코드가 많습니다.
- Zustand: Redux의 현대적이고 더 단순한 대안입니다.
- TanStack Query (React Query): 서버 상태(API 데이터 가져오기, 캐싱, 업데이트)를 관리하는 업계 표준입니다.
스타일링 (Styling)
- Tailwind CSS: 유틸리티 우선(Utility-first) CSS 프레임워크로 React와 매우 잘 어울립니다.
- Styled Components: CSS-in-JS 방식입니다. 자바스크립트 파일 안에 CSS를 작성합니다.
프레임워크 (Meta frameworks)
오늘날 React 팀은 프로덕션 앱을 만들 때 React 기반 의 프레임워크 사용을 권장합니다.
- Next.js: 업계 표준입니다. 서버 사이드 렌더링(SSR), 정적 사이트 생성(SSG), API 라우트 기능을 제공합니다.
- Remix: 웹 표준과 빠른 데이터 로딩에 중점을 둔 프레임워크입니다.
7. 컴포넌트의 생명주기 (Lifecycle)
함수형 컴포넌트에서도 생명주기를 이해하는 것은 필수적입니다.
- 마운팅 (Mounting): 컴포넌트가 생성되어 DOM에 삽입되는 단계입니다.
- 업데이트 (Updating): Props나 State가 변경되어 컴포넌트가 다시 렌더링되는 단계입니다.
- 언마운팅 (Unmounting): 컴포넌트가 DOM에서 제거되는 단계입니다 (정리/Cleanup 작업이 여기서 일어납니다).
8. 요약: 왜 React를 사용하는가?
장점
- 거대한 커뮤니티: 문제가 생기면 누군가 이미 해결책을 만들어 두었습니다.
- 유연성: 라우터, 상태 관리자 등을 원하는 대로 선택할 수 있습니다.
- 취업 시장: 현재 가장 수요가 많은 프론트엔드 기술입니다.
- 성능: 가상 DOM과 Fiber 아키텍처 덕분에 매우 효율적입니다.
단점
- "useEffect"의 복잡성: 의존성 배열(dependency array) 관리가 까다로울 수 있으며, 잘못하면 무한 루프에 빠질 수 있습니다.
- 선택의 피로 (Decision Fatigue): 정해진 틀이 없기 때문에 어떤 라우터, 스타일링, 상태 관리 라이브러리를 쓸지 직접 결정해야 합니다.
references