μμνκΈ° β
Vue Routerλ Vueμ 곡μ ν΄λΌμ΄μΈνΈ μ¬μ΄λ λΌμ°ν μ루μ μ λλ€.
ν΄λΌμ΄μΈνΈ μ¬μ΄λ λΌμ°ν μ μ±κΈ νμ΄μ§ μ ν리μΌμ΄μ (SPA)μμ λΈλΌμ°μ URLμ μ¬μ©μκ° λ³΄λ μ½ν μΈ μ μ°κ²°νλ λ° μ¬μ©λ©λλ€. μ¬μ©μκ° μ ν리μΌμ΄μ μ νμν λ URLμ΄ κ·Έμ λ§κ² μ λ°μ΄νΈλμ§λ§, νμ΄μ§λ₯Ό μλ²μμ λ€μ λ‘λν νμλ μμ΅λλ€.
Vue Routerλ Vueμ μ»΄ν¬λνΈ μμ€ν μμ ꡬμΆλμ΄ μμ΅λλ€. λΌμ°νΈλ₯Ό ꡬμ±νμ¬ κ° URL κ²½λ‘μ μ΄λ€ μ»΄ν¬λνΈλ₯Ό 보μ¬μ€μ§ Vue Routerμ μλ €μ€λλ€.
μ¬μ μ€λΉ μ¬ν
μ΄ κ°μ΄λλ μ¬λ¬λΆμ΄ μ΄λ―Έ Vue μ체μ μ΅μνλ€κ³ κ°μ ν©λλ€. Vue μ λ¬Έκ°μΌ νμλ μμ§λ§, νΉμ κΈ°λ₯μ λν΄ λ λ§μ μ λ³΄κ° νμν λ Vue 곡μ λ¬Έμλ₯Ό μ°Έκ³ ν΄μΌ ν μλ μμ΅λλ€.
μμ β
μ£Όμ κ°λ μ μκ°νκΈ° μν΄, λ€μκ³Ό κ°μ μμλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
μ°λ¦¬λ λ¨Όμ λ£¨νΈ μ»΄ν¬λνΈμΈ App.vue
λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
App.vue β
<template>
<h1>Hello App!</h1>
<p>
<strong>νμ¬ λΌμ°νΈ κ²½λ‘:</strong> {{ $route.fullPath }}
</p>
<nav>
<RouterLink to="/">νμΌλ‘ μ΄λ</RouterLink>
<RouterLink to="/about">μκ°λ‘ μ΄λ</RouterLink>
</nav>
<main>
<RouterView />
</main>
</template>
μ΄ ν
νλ¦Ώμ Vue Routerμμ μ 곡νλ λ κ°μ§ μ»΄ν¬λνΈμΈ RouterLink
μ RouterView
λ₯Ό μ¬μ©νκ³ μμ΅λλ€.
μΌλ°μ μΈ <a>
νκ·Έ λμ , λ§ν¬λ₯Ό λ§λ€κΈ° μν΄ μ»€μ€ν
μ»΄ν¬λνΈμΈ RouterLink
λ₯Ό μ¬μ©ν©λλ€. μ΄λ₯Ό ν΅ν΄ Vue Routerλ νμ΄μ§λ₯Ό μλ‘ κ³ μΉμ§ μκ³ λ URLμ λ³κ²½νκ³ , URL μμ±, μΈμ½λ©, λ€μν κΈ°λ₯μ μ²λ¦¬ν μ μμ΅λλ€. RouterLink
μ λν΄μλ κ°μ΄λμ λ·λΆλΆμμ λ μμΈν λ€λ£° μμ μ
λλ€.
RouterView
μ»΄ν¬λνΈλ Vue Routerμκ² νμ¬ λΌμ°νΈ μ»΄ν¬λνΈλ₯Ό μ΄λμ λ λλ§ν μ§ μλ €μ€λλ€. μ΄λ νμ¬ URL κ²½λ‘μ ν΄λΉνλ μ»΄ν¬λνΈμ
λλ€. λ°λμ App.vue
μ μμ νμλ μμΌλ©°, λ μ΄μμμ λ§κ² μ΄λμλ λ μ μμ§λ§, λ°λμ μ΄λκ°μ ν¬ν¨λμ΄μΌ Vue Routerκ° μ무κ²λ λ λλ§νμ§ μλ μν©μ λ°©μ§ν μ μμ΅λλ€.
μ μμμμλ {{ $route.fullPath }}
λ μ¬μ©νκ³ μμ΅λλ€. μ»΄ν¬λνΈ ν
νλ¦Ώμμ $route
λ₯Ό μ¬μ©νμ¬ νμ¬ λΌμ°νΈλ₯Ό λνλ΄λ κ°μ²΄μ μ κ·Όν μ μμ΅λλ€.

λΌμ°ν° μΈμ€ν΄μ€ μμ±νκΈ° β
λΌμ°ν° μΈμ€ν΄μ€λ createRouter()
ν¨μλ₯Ό νΈμΆνμ¬ μμ±ν©λλ€:
import { createMemoryHistory, createRouter } from 'vue-router'
import HomeView from './HomeView.vue'
import AboutView from './AboutView.vue'
const routes = [
{ path: '/', component: HomeView },
{ path: '/about', component: AboutView },
]
const router = createRouter({
history: createMemoryHistory(),
routes,
})
routes
μ΅μ
μ URL κ²½λ‘λ₯Ό μ»΄ν¬λνΈμ λ§€ννμ¬ λΌμ°νΈ μ체λ₯Ό μ μν©λλ€. component
μ΅μ
μ μ§μ λ μ»΄ν¬λνΈκ° μμ λ³Έ App.vue
μ <RouterView>
μ μν΄ λ λλ§λ©λλ€. μ΄λ¬ν λΌμ°νΈ μ»΄ν¬λνΈλ _λ·°(view)_λΌκ³ λ λΆλ¦¬μ§λ§, μ¬μ€ μΌλ°μ μΈ Vue μ»΄ν¬λνΈμ
λλ€.
λ§μ½ _ν¨μν μ»΄ν¬λνΈ_λ₯Ό λΌμ°νΈ μ»΄ν¬λνΈλ‘ μ¬μ©νκ³ μΆλ€λ©΄, μ§μ° λ‘λ© λΌμ°νΈμ ꡬλΆν μ μλλ‘ λ°λμ displayName
μ μ§μ ν΄μΌ ν©λλ€:
const AboutPage: FunctionalComponent = () => {
return h('h1', {}, 'About')
}
AboutPage.displayName = 'AboutPage'
λΌμ°νΈλ μ΄ μΈμλ λ€μν μ΅μ
μ μ§μνμ§λ§, μ§κΈμ path
μ component
λ§ νμν©λλ€.
history
μ΅μ
μ λΌμ°νΈκ° URLμ μ΄λ»κ² λ§€νλλμ§, κ·Έλ¦¬κ³ κ·Έ λ°λμ κ²½μ°λ₯Ό μ μ΄ν©λλ€. Playground μμμμλ λΈλΌμ°μ URLμ μμ ν 무μνκ³ μ체 λ΄λΆ URLμ μ¬μ©νλ createMemoryHistory()
λ₯Ό μ¬μ©νκ³ μμ΅λλ€. μ΄λ Playgroundμλ μ ν©νμ§λ§, μ€μ μ ν리μΌμ΄μ
μμλ μΌλ°μ μΌλ‘ μνλ λ°©μμ΄ μλλλ€. 보ν΅μ createWebHistory()
λ, νΉμ createWebHashHistory()
λ₯Ό μ¬μ©νκ² λ©λλ€. μ΄μ λν΄μλ νμ€ν 리 λͺ¨λ κ°μ΄λμμ λ μμΈν λ€λ£Ήλλ€.
λΌμ°ν° νλ¬κ·ΈμΈ λ±λ‘νκΈ° β
λΌμ°ν° μΈμ€ν΄μ€λ₯Ό μμ±ν νμλ, μ ν리μΌμ΄μ
μμ use()
λ₯Ό νΈμΆνμ¬ νλ¬κ·ΈμΈμΌλ‘ λ±λ‘ν΄μΌ ν©λλ€:
createApp(App)
.use(router)
.mount('#app')
λλ, λ€μκ³Ό κ°μ΄ μΈ μλ μμ΅λλ€:
const app = createApp(App)
app.use(router)
app.mount('#app')
λλΆλΆμ Vue νλ¬κ·ΈμΈκ³Ό λ§μ°¬κ°μ§λ‘, use()
νΈμΆμ mount()
νΈμΆ μ μ μ΄λ£¨μ΄μ ΈμΌ ν©λλ€.
μ΄ νλ¬κ·ΈμΈμ΄ λ¬΄μ¨ μΌμ νλμ§ κΆκΈνλ€λ©΄, μ£Όμ μν μ λ€μκ³Ό κ°μ΅λλ€:
RouterView
μRouterLink
μ»΄ν¬λνΈλ₯Ό μ μ λ±λ‘ν©λλ€.- μ μ
$router
μ$route
μμ±μ μΆκ°ν©λλ€. useRouter()
μuseRoute()
μ»΄ν¬μ λΈμ μ¬μ©ν μ μκ² ν©λλ€.- λΌμ°ν°κ° μ΄κΈ° λΌμ°νΈλ₯Ό ν΄μνλλ‘ νΈλ¦¬κ±°ν©λλ€.
λΌμ°ν°μ νμ¬ λΌμ°νΈμ μ κ·ΌνκΈ° β
μ ν리μΌμ΄μ μ λ€λ₯Έ κ³³μμ λΌμ°ν°μ μ κ·Όνκ³ μΆμ λκ° λ§μ κ²μ λλ€.
λΌμ°ν° μΈμ€ν΄μ€λ₯Ό ES λͺ¨λμμ exportνκ³ μλ€λ©΄, νμν κ³³μμ μ§μ importν μλ μμ΅λλ€. κ²½μ°μ λ°λΌ μ΄ λ°©λ²μ΄ κ°μ₯ μ’μ μ μμ§λ§, μ»΄ν¬λνΈ λ΄λΆλΌλ©΄ λ€λ₯Έ λ°©λ²λ μμ΅λλ€.
μ»΄ν¬λνΈ ν
νλ¦Ώμμλ λΌμ°ν° μΈμ€ν΄μ€κ° $router
λ‘ λ
ΈμΆλ©λλ€. μ΄λ μμ λ³Έ $route
μμ±κ³Ό λΉμ·νμ§λ§, λμ r
μ΄ νλ λ λΆμ΄ μμ΅λλ€.
Options APIλ₯Ό μ¬μ©ν λλ, JavaScript μ½λμμ this.$router
μ this.$route
λ‘ μ΄ λ μμ±μ μ κ·Όν μ μμ΅λλ€. Playground μμμ HomeView.vue
μ»΄ν¬λνΈλ λ€μκ³Ό κ°μ΄ λΌμ°ν°μ μ κ·Όν©λλ€:
export default {
methods: {
goToAbout() {
this.$router.push('/about')
},
},
}
μ΄ λ©μλλ νλ‘κ·Έλλ° λ°©μμ λ€λΉκ²μ΄μ
μ μ¬μ©λλ push()
λ₯Ό νΈμΆνκ³ μμ΅λλ€. μ΄μ λν΄μλ λμ€μ λ μμΈν λ°°μλλ€.
Composition APIμμλ this
λ₯Ό ν΅ν΄ μ»΄ν¬λνΈ μΈμ€ν΄μ€μ μ κ·Όν μ μμΌλ―λ‘, Vue Routerλ λμ μ¬μ©ν μ μλ λͺ κ°μ§ μ»΄ν¬μ λΈμ μ 곡ν©λλ€. Playground μμμ AboutView.vue
λ μ΄ λ°©μμ μ¬μ©ν©λλ€:
<script setup>
import { computed } from 'vue'
import { useRoute, useRouter } from 'vue-router'
const router = useRouter()
const route = useRoute()
const search = computed({
get() {
return route.query.search ?? ''
},
set(search) {
router.replace({ query: { search } })
},
})
</script>
μ§κΈ λΉμ₯ μ΄ μ½λ μ 체λ₯Ό μ΄ν΄ν νμλ μμ΅λλ€. μ€μν μ μ, useRouter()
μ useRoute()
μ»΄ν¬μ λΈμ μ¬μ©νμ¬ κ°κ° λΌμ°ν° μΈμ€ν΄μ€μ νμ¬ λΌμ°νΈμ μ κ·Όνλ€λ κ²μ
λλ€.
λ€μ λ¨κ³ β
Viteλ₯Ό μ¬μ©ν μ 체 μμλ₯Ό λ³΄κ³ μΆλ€λ©΄, create-vue μ€μΊν΄λ© λꡬλ₯Ό μ¬μ©ν μ μμ΅λλ€. μ΄ λꡬλ μμ νλ‘μ νΈμ Vue Routerλ₯Ό ν¬ν¨ν μ μλ μ΅μ μ μ 곡ν©λλ€:
npm create vue@latest
yarn create vue
pnpm create vue
create-vueλ‘ μμ±λ μμ νλ‘μ νΈλ μ¬κΈ°μ λ³Έ κ²κ³Ό μ μ¬ν κΈ°λ₯μ μ¬μ©ν©λλ€. μ΄ νλ‘μ νΈλ μ΄ κ°μ΄λμ λ€μ νμ΄μ§μμ μκ°ν κΈ°λ₯λ€μ νμνλ λ° μ μ©ν μΆλ°μ μ΄ λ μ μμ΅λλ€.
μ΄ κ°μ΄λμ κ΄λ‘ β
μ±κΈ νμΌ μ»΄ν¬λνΈ β
Vue Routerλ λ²λ€λ¬(μ: Vite)μ SFC(μ¦, .vue
νμΌ)λ₯Ό μ¬μ©νλ μ ν리μΌμ΄μ
μμ κ°μ₯ μΌλ°μ μΌλ‘ μ¬μ©λ©λλ€. μ΄ κ°μ΄λμ λλΆλΆμ μμλ μ΄λ¬ν μ€νμΌλ‘ μμ±λμ§λ§, Vue Router μ체λ λΉλ λꡬλ SFC μ¬μ©μ μꡬνμ§ μμ΅λλ€.
μλ₯Ό λ€μ΄, Vueμ Vue Routerμ _κΈλ‘λ² λΉλ_λ₯Ό μ¬μ©νλ κ²½μ°, λΌμ΄λΈλ¬λ¦¬λ importκ° μλ μ μ κ°μ²΄λ₯Ό ν΅ν΄ λ ΈμΆλ©λλ€:
const { createApp } = Vue
const { createRouter, createWebHistory } = VueRouter
μ»΄ν¬λνΈ API μ€νμΌ β
Vue Routerλ Composition APIμ Options API λͺ¨λμμ μ¬μ©ν μ μμ΅λλ€. κ΄λ ¨μ΄ μμ λ, μ΄ κ°μ΄λμ μμλ λ κ°μ§ μ€νμΌλ‘ μμ±λ μ»΄ν¬λνΈλ₯Ό 보μ¬μ€λλ€. Composition API μμλ μΌλ°μ μΌλ‘ λͺ
μμ μΈ setup
ν¨μ λμ <script setup>
μ μ¬μ©ν©λλ€.
λ κ°μ§ μ€νμΌμ λν 볡μ΅μ΄ νμνλ€λ©΄ Vue - API μ€νμΌμ μ°Έκ³ νμΈμ.
router
μ route
β
κ°μ΄λ μ λ°μ κ±Έμ³, λΌμ°ν° μΈμ€ν΄μ€λ₯Ό router
λΌκ³ λΆλ¦
λλ€. μ΄λ createRouter()
κ° λ°ννλ κ°μ²΄μ
λλ€. μ ν리μΌμ΄μ
μμ μ΄ κ°μ²΄μ μ κ·Όνλ λ°©λ²μ μν©μ λ°λΌ λ€λ¦
λλ€. μλ₯Ό λ€μ΄, Composition APIλ₯Ό μ¬μ©νλ μ»΄ν¬λνΈμμλ useRouter()
λ₯Ό νΈμΆνμ¬ μ κ·Όν μ μμ΅λλ€. Options APIμμλ this.$router
λ₯Ό μ¬μ©ν©λλ€.
λ§μ°¬κ°μ§λ‘, νμ¬ λΌμ°νΈλ route
λΌκ³ λΆλ¦
λλ€. μ»΄ν¬λνΈμμλ μ¬μ©νλ APIμ λ°λΌ useRoute()
λλ this.$route
λ‘ μ κ·Όν μ μμ΅λλ€.
RouterView
μ RouterLink
β
RouterView
μ RouterLink
μ»΄ν¬λνΈλ λͺ¨λ μ μ λ±λ‘λμ΄ μμΌλ―λ‘, μ»΄ν¬λνΈ ν
νλ¦Ώμμ μ¬μ©ν λ importν νμκ° μμ΅λλ€. νμ§λ§ μνλ€λ©΄, μλ₯Ό λ€μ΄ import { RouterLink } from 'vue-router'
μ κ°μ΄ λ‘μ»¬λ‘ importν μλ μμ΅λλ€.
ν
νλ¦Ώμμλ μ»΄ν¬λνΈ μ΄λ¦μ PascalCase λλ μΌλ°₯ μΌμ΄μ€λ‘ μΈ μ μμ΅λλ€. Vueμ ν
νλ¦Ώ μ»΄νμΌλ¬λ λ κ°μ§ νμμ λͺ¨λ μ§μνλ―λ‘, <RouterView>
μ <router-view>
λ λ³΄ν΅ λμΌνκ² λμν©λλ€. νλ‘μ νΈ λ΄μμ μ¬μ©λλ κ΄λ‘λ₯Ό λ°λ₯΄λ©΄ λ©λλ€.
in-DOM ν
νλ¦Ώμ μ¬μ©νλ κ²½μ° μΌλ°μ μΈ μ£Όμμ¬νμ΄ μ μ©λ©λλ€: μ»΄ν¬λνΈ μ΄λ¦μ λ°λμ μΌλ°₯ μΌμ΄μ€λ‘ μμ±ν΄μΌ νλ©°, μ
ν ν΄λ‘μ§ νκ·Έλ μ§μλμ§ μμ΅λλ€. λ°λΌμ <RouterView />
λμ <router-view></router-view>
λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.