노트

Vue 3와 React 대응표

Vue 3 vs. React

프런트엔드#vue#react · 연결된 개념 7개

쉽게 말하면

Vue는 엑셀처럼 어떤 값을 어디서 읽었는지 기억해 두고 바뀐 값에 걸린 곳만 다시 계산하고, React는 값이 바뀌면 컴포넌트를 통째로 다시 실행해 차이를 찾아요. 그래서 Vue에는 의존성 배열이 없어요.

비유가 깨지는 곳 자동 추적에도 조건이 있어요. reactive 객체는 구조분해하거나 변수를 재할당하면 연결이 끊겨서, 실무에선 대부분 ref로 통일하고 Pinia 스토어도 storeToRefs로 꺼내 써요.

React에 익숙한 개발자가 Vue 3(Composition API, script setup)를 빠르게 읽을 수 있게 짝지어 본 표. 가장 큰 차이는 Vue는 반응성(Reactivity)을 자동으로 추적해서 의존성 배열(Dependency Array)이 없다는 점이다.

반응성

ReactVue 3메모
useState(0)ref(0)JS(JavaScript)에서는 x.value, 템플릿에서는 x
객체 상태reactive(obj).value 없음. 구조분해하면 반응성이 끊긴다
useMemocomputed(() => ...)의존성 자동 추적
useCallback필요 없음리렌더마다 함수를 다시 만드는 문제가 없다
useEffect(fn, [dep])watch(dep, fn)특정 값에 반응
자동 추적 EffectwatchEffect(fn)안에서 읽은 값에 반응
useEffect(fn, [])onMounted(fn)정리는 onUnmounted나 watch의 onCleanup
useRefref(null) + 템플릿 ref="el"상태와 DOM(Document Object Model) 참조를 겸한다

React는 상태가 바뀌면 컴포넌트 함수를 다시 실행하고 재조정(Reconciliation)으로 차이를 찾는다. 그래서 메모이제이션(Memoization)과 의존성 배열을 신경 써야 한다(React Compiler가 이 부담을 줄이는 중이다). Vue는 값을 읽은 곳을 기록해 두었다가 바뀐 곳만 다시 계산한다.

ref와 reactive

  • ref: 원시값이든 객체든 담는다. 어디서나 .value, 통째로 재할당 가능. 실무에서는 대부분 ref로 통일한다
  • reactive: 객체·배열 전용. 변수 자체를 재할당하면 연결이 끊기고, 구조분해해도 끊긴다. 꺼내 쓰려면 toRefs

컴포넌트

ReactVue
propsdefineProps
onXxx 콜백 propdefineEmits + emit('xxx', payload)
childrenslot(이름 붙인 slot으로 여러 구멍)
onClick={fn}@click="fn"
cond && <X />v-if / v-show
list.map()v-for + :key
className·style:class·:style(객체·배열 바인딩)

상태 공유

  • Context → provide/inject
  • Redux·Zustand → Pinia(공식 상태 관리). 스토어를 구조분해할 때 상태는 storeToRefs로 꺼낸다 → Redux 이후의 상태 관리 선택
  • TanStack Query는 Vue용도 있어 서버 상태 패턴을 그대로 가져갈 수 있다
export const useCounter = defineStore('counter', () => {
  const n = ref(0)
  const double = computed(() => n.value * 2)
  const inc = () => n.value++
  return { n, double, inc }
})

두 프레임워크 모두 상태에서 화면을 계산하는 선언형 UI이고, 반응성 모델이 다르다. Vue는 설계가 MVVM(Model-View-ViewModel) 패턴에서 일부 영감을 받았다고 Vue 2 공식 가이드에서 밝혔다. 템플릿 대신 컴파일러에 더 기대는 쪽은 Svelte.

출처: Vue 공식 문서 — Reactivity Fundamentals · Pinia

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • React로 보는 SOLID

    SOLID는 원래 객체 지향 설계 원칙이지만 React 컴포넌트·props·훅에도 그대로 옮겨 볼 수 있다. 원칙 자체보다 "어떤 코드 모양이 되는가"를 짧게 정리한다.

  • 내부 가변성과 메모이제이션

    내부 가변성(Interior Mutability)은 객체나 함수의 참조는 그대로인데 안에 숨은 상태가 바뀌는 성질이다. React의 메모이제이션은 "입력이 다른 참조인가"만 보기 때문에, 참조가 같으면 내용이 바뀌어도 바뀌지 않았다고 판단한다. React 공식 문서는 이를 "겉모습은 같은데 몰래 내용물을 바꾸는 상자"에 비유한다.

  • React 엘리먼트와 JSX

    React 엘리먼트(React Element)는 "화면에 무엇을 그릴지"를 설명하는 불변의 평범한 JavaScript 객체다. JSX(JavaScript XML)는 이 객체를 만드는 문법이고, 컴파일하면 createElement(새 JSX 변환에서는 jsx()) 호출이 된다.

  • React 상태 갱신

    React는 상태를 직접 고치지 않고 새 값을 setState로 넘겨야 다시 그린다. 이전 값과 Object.is로 비교하므로, 같은 객체를 고친 뒤 넘기면 바뀐 줄 모른다.

  • Effect가 필요 없는 경우

    Effect는 외부 시스템과 동기화할 때 쓰는 탈출구(Escape Hatch)다. 렌더 중에 계산할 수 있는 값이나 사용자 이벤트 처리에 Effect를 쓰면 렌더가 한 번 더 일어나고 흐름이 꼬인다. React 공식 문서가 이런 경우를 따로 정리해 두었다.

보기 옵션