"매 UI 의 in-memory tree (VDOM) 의 매 diff → 매 minimal real-DOM mutation 만 commit." React 가 2013년 도입 → 2017년 Fiber rewrite → 2024년 React 19 (compiler) 로 evolve. 매 2026 은 매 fine-grained reactivity (SolidJS, Svelte 5 runes) 와 매 architectural rivalry — 매 VDOM 의 default 지위 의 erosion.
매 핵심
매 VDOM 작동
Render: JSX → VDOM tree (object literal).
Diff (reconcile): prev tree vs next tree 의 비교 — 매 O(n) heuristic.
Commit: minimal real-DOM operation 의 batch apply.
매 React Fiber (2017+)
Unit of work: 매 fiber node — 매 component 의 단위.
Interruptible: 매 work loop 가 매 yield 가능 — 매 priority-based scheduling.
Double buffering: current tree + work-in-progress tree.
import{startTransition,useDeferredValue}from"react";functionSearchBox() {const[query,setQuery]=useState("");constdeferred=useDeferredValue(query);// 매 low-priority lane
return(<><inputvalue={query}onChange={e=>setQuery(e.target.value)}/><ExpensiveResultsquery={deferred}/></>);}// 매 startTransition: 매 non-urgent state update
functiontabSwitch(newTab: Tab){startTransition(()=>setActiveTab(newTab));}
매 key 의 올바른 사용
// 매 BAD: index key — 매 reorder 시 매 잘못된 reuse
{items.map((item,i)=><Rowkey={i}{...item}/>)}// 매 GOOD: stable id
{items.map(item=><Rowkey={item.id}{...item}/>)}// 매 reorder edge case: 매 form input state 의 보존 의 보장
매 SolidJS signal (no VDOM)
import{createSignal,createMemo,For}from"solid-js";functionCounter() {const[count,setCount]=createSignal(0);constdoubled=createMemo(()=>count()*2);// 매 JSX 가 매 reactive primitive 로 compile
// 매 setCount 호출 시 매 doubled 만 update — 매 component re-render X
return<buttononClick={()=>setCount(c=>c+1)}>{doubled()}</button>;}
매 React 19 compiler (auto-memo)
// 매 React 19 compiler enabled — 매 useMemo / useCallback 불필요
functionParent({items}:{items: Item[]}){constsorted=items.toSorted((a,b)=>a.score-b.score);// 매 compiler 가 매 dependency analysis → 매 auto-memo
returnsorted.map(item=><Childkey={item.id}item={item}/>);}
매 RSC (server component)
// 매 server component — 매 zero JS shipped
asyncfunctionProductPage({id}:{id: string}){constproduct=awaitdb.product.findUnique({where:{id}});return(<article><h1>{product.name}</h1><ClientCartproduct={product}/>{/* 매 client island */}</article>);}
매 reconciliation profiling
import{Profiler}from"react";<Profilerid="App"onRender={(id,phase,actualDuration)=>{if(actualDuration>16){console.warn(`매 slow render: ${id} took ${actualDuration}ms`);}}}><App/></Profiler>
매 결정 기준
상황
Approach
매 large existing React codebase
매 React 19 + compiler
매 new SPA, performance-critical
매 SolidJS or Svelte 5
매 SEO + dynamic
매 Next.js 15 (RSC) or Remix
매 enterprise, 매 ecosystem 우선
매 React (libraries · talent pool)
매 Vue ecosystem 매 lock-in
매 Vue 3.5 + Vapor mode
기본값: 매 generic web app 매 React 19 + Vite or Next.js 15.