React는 컴포넌트를 정의하는 API(Application Programming Interface)를 담은 react 패키지와, 그 컴포넌트 트리를 특정 플랫폼의 화면으로 바꾸는 렌더러(renderer) 패키지로 나뉜다. 브라우저 DOM(Document Object Model)용이 react-dom, iOS·Android 네이티브 뷰용이 react-native다.
import { useState } from 'react' // 컴포넌트를 정의하는 API
import { createRoot } from 'react-dom/client' // 그 트리를 브라우저 DOM에 그리는 렌더러
createRoot(document.getElementById('root')!).render(<App />)누가 무엇을 하나
react(코어):createElement·JSX가 만드는 엘리먼트, 훅, Context처럼 컴포넌트를 정의하는 데 필요한 API만 있다. 예전 React 코드베이스 문서는 코어에 재조정 알고리즘과 플랫폼별 코드가 없다고 설명한다- 재조정자(reconciler):
setState같은 업데이트가 예약되면 컴포넌트를 다시 렌더하고, 이전 트리와 비교해 바꿀 점을 찾는다(재조정(Reconciliation)). React 16부터 이 일은 Fiber 재조정자가 맡는다. DOM과 네이티브처럼 전혀 다른 렌더러도 이 로직은 같이 쓴다 - 렌더러: 재조정자가 찾은 변경을 플랫폼 호출로 옮긴다. DOM 노드를 만들고, 속성을 바꾸고, 이벤트를 연결한다.
react-dom은 서버 렌더링(react-dom/server)과 하이드레이션도 맡는다
흔한 오해는 "react가 비교를 계산하고 react-dom은 결과를 칠하기만 한다"는 그림이다. 실제로는 재조정자가 각 렌더러 번들 안에 들어간다. react 패키지는 어느 렌더러에서든 같은 코드로 컴포넌트를 쓰게 해 주는 얇은 층이다.
렌더러를 갈아 끼우는 지점
재조정자는 플랫폼을 직접 알지 못한다. 대신 렌더러가 host config라는 객체로 "이 환경에서 노드를 어떻게 만들고 붙이고 고치는지"를 알려 준다.
const HostConfig = {
supportsMutation: true, // DOM처럼 노드를 직접 고치는 방식
createInstance(type, props) { /* 플랫폼 노드를 만들어 반환 */ },
appendChild(parentInstance, child) { /* 자식 붙이기 */ },
commitUpdate(instance, /* ... */ nextProps) { /* nextProps에 맞게 고치기 */ },
// ...
}
const MyRenderer = Reconciler(HostConfig)react-reconciler 패키지로 이런 커스텀 렌더러를 만들 수 있다. 다만 README가 실험적 패키지이고 API가 React 본체만큼 안정적이지 않으며 일반 버전 규칙도 따르지 않는다고 밝힌다(2026 기준). 예전 React 코드베이스 문서는 재조정자를 따로 배포하지 않는다고 적었는데, 지금은 이 실험적 패키지로 공개돼 있다.
그래서 생기는 일
react-dom의 API(createRoot,createPortal,flushSync등)는 브라우저 환경 전용이라 React Native에서는 쓸 수 없다(React Portal)- React Native 컴포넌트는
div가 아니라View·Text같은 기본 요소를 쓴다. 이 요소는 실행 중에 Android·iOS의 네이티브 뷰로 만들어진다 - 하이브리드 앱의 WebView 안 화면은 브라우저 페이지라 DOM이 있다. 그 화면을 React로 만들면
react-dom을 쓰고, 네이티브 렌더러와는 다른 길이다
출처: React(구 문서) — Codebase Overview: React Core · React(구 문서) — Codebase Overview: Renderers · React(구 문서) — Codebase Overview: Reconcilers · react-reconciler README · React — React DOM APIs · React Native — Core Components and Native Components