React 엘리먼트(React Element)는 "화면에 무엇을 그릴지"를 설명하는 불변의 평범한 JavaScript 객체다. JSX(JavaScript XML)는 이 객체를 만드는 문법이고, 컴파일하면 createElement(새 JSX 변환에서는 jsx()) 호출이 된다.
<button key="save" onClick={save}>저장</button>
// ≈ 결과 객체
{
$$typeof: Symbol(react.transitional.element), // React 19 기준 이름
type: 'button', // 문자열이면 DOM 태그, 함수면 컴포넌트
key: 'save', // 형제 사이의 정체성. props와 따로 보관
props: { onClick: save, children: '저장' },
}- DOM(Document Object Model) 노드가 아니다. 엘리먼트는 설계도이고, 브라우저의
HTMLButtonElement가 실제 건물이다. 만들고 버리는 비용이 거의 없다(Virtual DOM) - 불변이다. 만든 뒤
props를 고치지 않는다. 화면이 바뀌면 렌더마다 새 엘리먼트 트리를 만들고 이전 트리와 비교한다(재조정(Reconciliation)) <Button />도 엘리먼트다.type에 문자열 대신Button함수가 들어갈 뿐이다$$typeof는 보안 장치다. 심볼은 JSON(JavaScript Object Notation)으로 만들 수 없어서, 서버에서 온 JSON 객체가 엘리먼트인 척 위조되어 렌더되는 것을 막는다. RSC 페이로드(React Server Components Payload)에서는 이 자리를"$"문자열 마커가 대신한다- React 19부터
ref는 별도 필드가 아니라props.ref로 들어간다 - 엘리먼트를 바탕으로 React 내부 작업 단위인 Fiber가 만들어진다(Fiber 아키텍처). 바뀌지 않는 엘리먼트를 컴포넌트 밖으로 빼 재사용하는 최적화는 memo·useMemo·useCallback
실제 DOM에 그려지는 과정은 브라우저 렌더링 파이프라인와 이어진다.