React와 Svelte는 같은 “UI 프레임워크”지만, 내부 동작과 철학은 완전히 다릅니다.
React는 런타임 중심(Virtual DOM, 함수 재실행), Svelte는 **컴파일러 중심(Fine-Grained Reactivity, direct DOM patch)**을 채택했습니다. 이 차이는 리렌더링, DOM 조작, 애니메이션 구현 방식에서 뚜렷하게 드러납니다.
React는 상태 변경 시 컴포넌트 전체를 함수로 다시 실행합니다.
이 과정에서 만들어진 Virtual DOM을 diff하여 실제 DOM에 반영합니다.
// React 예시
function Counter() {
const [count, setCount] = useState(0);
const double = useMemo(() => count * 2, [count]);
useEffect(() => {
console.log("count changed", count);
}, [count]);
return (
<button onClick={() => setCount(c => c + 1)}>
{double}
</button>
);
}
여기서 double 계산은 매번 재실행되지만 useMemo로 의존성을 직접 관리해야 합니다.
Svelte는 컴파일 타임에 의존성 그래프를 생성합니다.
값이 바뀌면, 해당 값을 참조하는 표현식과 DOM만 업데이트합니다.
<script>
let count = 0;
$: double = count * 2; // 자동 의존성 추적
</script>
<button on:click={() => count++}>
{double}
</button>
장점: deps 배열 필요 없음, 불필요한 재계산 없음 단점: 동적 구조보다는 정적 분석 가능한 코드에 최적화됨