๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
Development/Vue.js

Vue.js - Vue Router

by DevIseo 2022. 5. 9.

๐Ÿ””Vue Router

|Vue Router

โ€œVue.js ๊ณต์‹ ๋ผ์šฐํ„ฐโ€

  • ๋ผ์šฐํŠธ(route)์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งคํ•‘ํ•œ ํ›„, ์–ด๋–ค ์ฃผ์†Œ์—์„œ ๋ Œ๋”๋งํ•  ์ง€ ์•Œ๋ ค์คŒ
  • SPA ์ƒ์—์„œ ๋ผ์šฐํŒ…์„ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต

|Vue Router Start!

  1. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐ ์ด๋™
vue create my-router-app
cd my-router-app
  1. Vue Router plugin์„ค์น˜ (Vue CLI ํ™˜๊ฒฝ)
vue add router

[์ฃผ์˜]

๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋˜ ๋„์ค‘์— ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด App.vue๋ฅผ ๋ฎ์–ด์“ฐ๋ฏ€๋กœ, ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํŒŒ์ผ์„ ๋ฐฑ์—…(์ปค๋ฐ‹)ํ•ด์•ผ ํ•จ

  1. commit ์—ฌ๋ถ€(Yes)
Warn There are uncommitted changes in the current repository, it's recommended to commit or stash them first.
? Still procced? Yes
  1. History mode ์‚ฌ์šฉ ์—ฌ๋ถ€(Yes)
? Use history mode for router? (Requires proper server setup for index fallback in production) (Y/n)
Yes

 

Vue Router๋กœ ์ธํ•œ ๋ณ€ํ™”

  1. App.vue ์ฝ”๋“œ
  2. router/index.js ์ƒ์„ฑ
  3. views ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ

 

 

|Vue Router โ€“ โ€œindex.jsโ€

  • ๋ผ์šฐํŠธ์— ๊ด€๋ จ๋œ ์ •๋ณด ๋ฐ ์„ค์ •์ด ์ž‘์„ฑ ๋˜๋Š” ๊ณณ
import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeView from '../views/HomeView.vue'
import AboutView from '../views/AboutView.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView
  },
  {
    path: '/about',
    name: 'about',
    component: AboutView,
  },
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

export default router

 

 

|Vue Router - โ€œrouter-linkโ€ & โ€œrouter-viewโ€

<template>
  <div id="app">
    <nav>
      <router-link :to="{ name: 'home' }">Home</router-link> |
      <router-link :to="{ name: 'about' }">About</router-link>
    </nav>
    <p>
      <router-view/>
    </p>
    
  </div>
</template>
  • <router-link>
    • ์‚ฌ์šฉ์ž ๋„ค๋น„๊ฒŒ์ด์…˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ
    • ๋ชฉํ‘œ ๊ฒฝ๋กœ๋Š” โ€˜toโ€™ prop์œผ๋กœ ์ง€์ •๋จ
    • HTML5 ํžˆ์Šคํ† ๋ฆฌ ๋ชจ๋“œ์—์„œ router-link๋Š” ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ฐจ๋‹จํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋กœ๋“œ ํ•˜์ง€ ์•Š๋„๋ก ํ•จ โ€”>์ƒˆ๋กœ๊ณ ์นจ ์•ˆ๋จ!
    • a ํƒœ๊ทธ์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” GET ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” a ํƒœ๊ทธ์™€ ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ, ๊ธฐ๋ณธ GET ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ฑฐํ•œ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋จ
  • <router-view>
    • ์ฃผ์–ด์ง„ ๋ผ์šฐํŠธ์— ๋Œ€ํ•ด ์ผ์น˜ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ
    • ์‹ค์ œ component๊ฐ€ DOM์— ๋ถ€์ฐฉ๋˜์–ด ๋ณด์ด๋Š” ์ž๋ฆฌ๋ฅผ ์˜๋ฏธ
    • router-link๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ๊ฒฝ๋กœ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” index.js์— ์ •์˜ํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์œ„์น˜

 

 

|History mode

  • HTML History API๋ฅผ ์‚ฌ์šฉํ•ด์„œ router๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ
  • ๋ธŒ๋ผ์šฐ์ €์˜ ํžˆ์Šคํ† ๋ฆฌ๋Š” ๋‚จ๊ธฐ์ง€๋งŒ ์‹ค์ œ ํŽ˜์ด์ง€๋Š” ์ด๋™ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›
  • ์ฆ‰, ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  URL์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Œ
    • SPA์˜ ๋‹จ์  ์ค‘ ํ•˜๋‚˜์ธ โ€œURL์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.โ€ ๋ฅผ ํ•ด๊ฒฐ

 

 

|1. Named Routes

  • ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” ๋ผ์šฐํŠธ
  • ๋ช…๋ช…๋œ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ vue-router ์ปดํฌ๋„ŒํŠธ ์š”์†Œ์˜ prop์— ์ „๋‹ฌ
//App.vue -- to์•ž์— v-bind!!
<template>
  <div id="app">
    <nav>
      <router-link :to="{ name: 'home' }">Home</router-link> |
      <router-link :to="{ name: 'about' }">About</router-link>
    </nav>
      <router-view/> 
  </div>
</template>

//router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeView from '../views/HomeView.vue'
import AboutView from '../views/AboutView.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView
  },
  {
    path: '/about',
    name: 'about',
    component: AboutView,
  },
]

 

|2. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ๋„ค๋น„๊ฒŒ์ด์…˜

  • <router-link>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธ์  ํƒ์ƒ‰์„ ์œ„ํ•œ a ํƒœ๊ทธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ ์™ธ์—๋„, router์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
์„ ์–ธ์  ๋ฐฉ์‹  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹
<router-link to=โ€œโ€ฆโ€> $router.push(โ€ฆ)
  • Vue ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์—์„œ ๋ผ์šฐํ„ฐ ์ธ์Šคํ„ด์Šค์— $router๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ
  • ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ URL๋กœ ์ด๋™ํ•˜๋ ค๋ฉด this.$router.push๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ
  • ์ด ๋ฉ”์„œ๋“œ๋Š” ์ƒˆ๋กœ์šด ํ•ญ๋ชฉ์„ ํžˆ์Šคํ† ๋ฆฌ ์Šคํƒ์— ๋„ฃ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์˜ ๋’ค๋กœ ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ด์ „ URL๋กœ ์ด๋™ํ•˜๊ฒŒ ๋จ
  • <router-link>๋ฅผ ํด๋ฆญํ•  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๋ฏ€๋กœ <router-link :to="...">๋ฅผ ํด๋ฆญํ•˜๋ฉด, **router.push(...)**๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Œ
  • ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ž ์˜ˆ์‹œ

 

 

|3. Dynamic Route Matching

  • ๋™์  ์ธ์ž ์ „๋‹ฌ
  • ์ฃผ์–ด์ง„ ํŒจํ„ด์„ ๊ฐ€์ง„ ๋ผ์šฐํŠธ๋ฅผ ๋™์ผํ•œ ์ปดํฌ๋„ŒํŠธ์— ๋งคํ•‘ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  User์— ๋Œ€ํ•ด ๋™์ผํ•œ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง€์ง€๋งŒ, ๋‹ค๋ฅธ User ID๋กœ ๋ Œ๋”๋ง ๋˜์–ด์•ผํ•˜๋Š” User ์ปดํฌ๋„ŒํŠธ ์˜ˆ์‹œ
//router/index.js
const routes = [
	{
    path: '/user/:userId',
    name: 'User',
    component: User
  }
]
  • ๋™์  ์ธ์ž๋Š” :(์ฝœ๋ก )์œผ๋กœ ์‹œ์ž‘
  • ์ปดํฌ๋„ŒํŠธ์—์„œ this.$route.params๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅ

 

pattern  matched path  $route.params
/user/:userName /user/john { username : โ€˜johnโ€™ }
/user/:userName/article/:articleId /user/john/article/12 { username: โ€˜johnโ€™,articleId: 12 }
     

|components์™€ views

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘์„ฑ๋œ ๊ตฌ์กฐ์—์„œ components ํด๋”์™€ views ํด๋” ๋‚ด๋ถ€์— ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์กด์žฌํ•˜๊ฒŒ ๋จ
  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•ด ๊ฐˆ ๋•Œ ์ •ํ•ด์ง„ ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, ์ฃผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์กฐํ™”ํ•˜์—ฌ ํ™œ์šฉํ•จ
  • App.vue
    • ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ
  • views/
    • router(index.js)์— ๋งคํ•‘๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ชจ์•„๋‘๋Š” ํด๋”
    • ex) App ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— AboutView & HomeView ์ปดํฌ๋„ŒํŠธ ๋“ฑ๋ก
  • components/
    • router์— ๋งคํ•‘๋œ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ์ž‘์„ฑํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ชจ์•„๋‘๋Š” ํด๋”
    • ex) Home ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— HelloWorld ์ปดํฌ๋„ŒํŠธ ๋“ฑ๋ก

|Vue Router๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

  1. SPA ๋“ฑ์žฅ ์ด์ „
    1. ์„œ๋ฒ„๊ฐ€ ๋ชจ๋“  ๋ผ์šฐํŒ…์„ ํ†ต์ œ
    2. ์š”์ฒญ ๊ฒฝ๋กœ์— ๋งž๋Š” HTML๋ฅผ ์ œ๊ณต
  2. SPA ๋“ฑ์žฅ ์ดํ›„
    1. ์„œ๋ฒ„๋Š” index.html ํ•˜๋‚˜๋งŒ ์ œ๊ณต
    2. ์ดํ›„ ๋ชจ๋“  ์ฒ˜๋ฆฌ๋Š” HTML ์œ„์—์„œ JS ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•ด ์ง„ํ–‰
    3. ์ฆ‰, ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๋” ์ด์ƒ ์„œ๋ฒ„๊ฐ€ ํ•˜์ง€ ์•Š์Œ (ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง)
  3. ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ ์ฐจ์ด
    • SSR
      • ๋ผ์šฐํŒ…์— ๋Œ€ํ•œ ๊ฒฐ์ •๊ถŒ์„ ์„œ๋ฒ„๊ฐ€ ๊ฐ€์ง
    • CSR
      • ํด๋ผ์ด์–ธํŠธ๋Š” ๋” ์ด์ƒ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ์‘๋‹ต๋ฐ›์€ HTML ๋ฌธ์„œ์•ˆ์—์„œ ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํŠน์ • ์ฃผ์†Œ์— ๋งž๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง
      • ๋ผ์šฐํŒ…์— ๋Œ€ํ•œ ๊ฒฐ์ •๊ถŒ์„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ€์ง
      • ๊ฒฐ๊ตญ Vue Router๋Š” ๋ผ์šฐํŒ…์˜ ๊ฒฐ์ •๊ถŒ์„ ๊ฐ€์ง„ Vue.js์—์„œ ๋ผ์šฐํŒ…์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” Tool์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    •  

๋Œ“๊ธ€