Vue 2에서 3으로의 마이그레이션은 단번에 하기보다 점진적으로 진행하는 것이 안전합니다. @vue/compat(호환 빌드)를 활용하면 기존 코드를 유지하면서 단계적으로 전환할 수 있습니다.

면접에서 "Vue 2에서 3으로 마이그레이션 경험이 있나요?"라고 물으면, Breaking Changes와 점진적 전환 전략을 구체적으로 설명할 수 있어야 합니다.


주요 Breaking Changes

글로벌 API 변경

JAVASCRIPT
// Vue 2 — 전역 API
Vue.component('MyComponent', {})
Vue.directive('focus', {})
Vue.use(router)
Vue.mixin(globalMixin)

// Vue 3 — 앱 인스턴스 API
const app = createApp(App)
app.component('MyComponent', {})
app.directive('focus', {})
app.use(router)
// 전역 mixin은 권장하지 않음

v-model 변경

VUE
<!-- Vue 2 -->
<!-- 기본: value prop + input event -->
<!-- .sync 수식어: :title.sync="pageTitle" -->

<!-- Vue 3 -->
<!-- 기본: modelValue prop + update:modelValue event -->
<!-- .sync 제거 → v-model:title="pageTitle" -->

<!-- Vue 2 -->
<ChildComponent v-model="value" :title.sync="pageTitle" />

<!-- Vue 3 -->
<ChildComponent v-model="value" v-model:title="pageTitle" />

v-for와 v-if 우선순위

VUE
<!-- Vue 2: v-for가 v-if보다 우선 -->
<!-- Vue 3: v-if가 v-for보다 우선 (반대!) -->

<!-- Vue 3에서는 같은 엘리먼트에 함께 사용 금지 -->
<!-- template으로 분리해야 함 -->
<template v-for="item in items" :key="item.id">
  <div v-if="item.active">{{ item.name }}</div>
</template>

이벤트 API 제거

JAVASCRIPT
// Vue 2 — 이벤트 버스 패턴
const eventBus = new Vue()
eventBus.$on('event', handler)
eventBus.$emit('event', data)

// Vue 3 — 제거됨
// 대안 1: mitt 라이브러리
import mitt from 'mitt'
const emitter = mitt()
emitter.on('event', handler)
emitter.emit('event', data)

// 대안 2: Provide/Inject 또는 Pinia

기타 주요 변경

PLAINTEXT
- $listeners 제거 → $attrs에 통합
- 필터(filter) 제거 → computed 또는 메서드 사용
- $children 제거 → template refs 사용
- $set / $delete 제거 → Proxy가 자동 감지
- 다중 루트 엘리먼트 허용 (Fragment)
- emits 옵션 추가 (이벤트 명시적 선언)
- Teleport, Suspense 추가

@vue/compat — 호환 빌드

BASH
npm install vue@^3 @vue/compat
JAVASCRIPT
// vue.config.js 또는 vite.config.ts
module.exports = {
  resolve: {
    alias: {
      vue: '@vue/compat'  // vue를 호환 빌드로 교체
    }
  }
}

호환 빌드는 Vue 2의 동작을 에뮬레이션하면서 호환되지 않는 사용을 경고합니다.


마이그레이션 단계

PLAINTEXT
1단계: 준비
  - Vue 2 최신 버전(2.7)으로 업데이트
  - vue-demi 호환 라이브러리 확인
  - 사용 중인 패키지의 Vue 3 지원 여부 확인

2단계: @vue/compat 도입
  - vue를 @vue/compat으로 교체
  - 앱 실행하여 경고 메시지 확인
  - 가장 많이 나오는 경고부터 수정

3단계: 점진적 전환
  - Options API → Composition API (선택적)
  - Vuex → Pinia
  - 이벤트 버스 → Provide/Inject 또는 mitt
  - 필터 → computed/메서드

4단계: 완료
  - @vue/compat 제거, vue 3 직접 사용
  - Vue 3 전용 기능 도입 (script setup, defineModel 등)

생태계 마이그레이션

Vue 2Vue 3
VuexPinia (공식 권장)
Vue Router 3Vue Router 4
Vuetify 2Vuetify 3
VueXPinia
Vue CLIVite (create-vue)
Class ComponentsComposition API

면접 팁

  • 점진적 마이그레이션 의 중요성을 강조하세요. 한 번에 전환하면 리스크가 큽니다
  • Vue 2.7이 Composition API를 백포트했다는 사실을 알면 마이그레이션 전략을 더 유연하게 설명할 수 있습니다
  • Breaking Changes 중 v-model 변경 과 v-for/v-if 우선순위 변경 은 실무에서 가장 많이 만나는 문제입니다

요약

Vue 2→3 마이그레이션은 @vue/compat 호환 빌드를 활용하여 점진적으로 진행하는 것이 안전합니다. 주요 Breaking Changes(글로벌 API, v-model, v-for/v-if 우선순위, 이벤트 API 제거)를 이해하고, 생태계 라이브러리(Vuex→Pinia, Vue CLI→Vite)도 함께 전환해야 합니다.

댓글 로딩 중...