Vue 2에서 3 마이그레이션
Vue 2에서 3으로의 마이그레이션은 단번에 하기보다 점진적으로 진행하는 것이 안전합니다. @vue/compat(호환 빌드)를 활용하면 기존 코드를 유지하면서 단계적으로 전환할 수 있습니다.
면접에서 "Vue 2에서 3으로 마이그레이션 경험이 있나요?"라고 물으면, Breaking Changes와 점진적 전환 전략을 구체적으로 설명할 수 있어야 합니다.
주요 Breaking Changes
글로벌 API 변경
// 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 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 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 제거
// 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
기타 주요 변경
- $listeners 제거 → $attrs에 통합
- 필터(filter) 제거 → computed 또는 메서드 사용
- $children 제거 → template refs 사용
- $set / $delete 제거 → Proxy가 자동 감지
- 다중 루트 엘리먼트 허용 (Fragment)
- emits 옵션 추가 (이벤트 명시적 선언)
- Teleport, Suspense 추가
@vue/compat — 호환 빌드
npm install vue@^3 @vue/compat
// vue.config.js 또는 vite.config.ts
module.exports = {
resolve: {
alias: {
vue: '@vue/compat' // vue를 호환 빌드로 교체
}
}
}
호환 빌드는 Vue 2의 동작을 에뮬레이션하면서 호환되지 않는 사용을 경고합니다.
마이그레이션 단계
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 2 | Vue 3 |
|---|---|
| Vuex | Pinia (공식 권장) |
| Vue Router 3 | Vue Router 4 |
| Vuetify 2 | Vuetify 3 |
| VueX | Pinia |
| Vue CLI | Vite (create-vue) |
| Class Components | Composition 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)도 함께 전환해야 합니다.
댓글 로딩 중...