Skip to content

๋™์  ๋ผ์šฐํŒ… โ€‹

๋ผ์šฐํ„ฐ์— ๋ผ์šฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ณดํ†ต routes ์˜ต์…˜์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€์ง€๋งŒ, ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ผ ๋•Œ ๋ผ์šฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Vue CLI UI์™€ ๊ฐ™์€ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์šฐํŠธ ์ถ”๊ฐ€ํ•˜๊ธฐ โ€‹

๋™์  ๋ผ์šฐํŒ…์€ ์ฃผ๋กœ ๋‘ ๊ฐ€์ง€ ํ•จ์ˆ˜์ธ router.addRoute()์™€ router.removeRoute()๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋“ค์€ ์˜ค์ง ์ƒˆ๋กœ์šด ๋ผ์šฐํŠธ๋ฅผ ๋“ฑ๋ก๋งŒ ํ•˜๋ฉฐ, ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋ผ์šฐํŠธ๊ฐ€ ํ˜„์žฌ ์œ„์น˜์™€ ์ผ์น˜ํ•˜๋”๋ผ๋„ ์ˆ˜๋™์œผ๋กœ router.push()๋‚˜ router.replace()๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ๋ผ์šฐํŠธ๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋‚˜์˜ ๋ผ์šฐํŠธ๋งŒ ์žˆ๋Š” ๋ผ์šฐํ„ฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค:

js
const router = createRouter({
  history: createWebHistory(),
  routes: [{ path: '/:articleName', component: Article }],
})

/about, /store, /3-tricks-to-improve-your-routing-code์™€ ๊ฐ™์€ ์–ด๋–ค ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ด๋„ Article ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ /about์— ์žˆ์„ ๋•Œ ์ƒˆ๋กœ์šด ๋ผ์šฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด:

js
router.addRoute({ path: '/about', component: About })

ํŽ˜์ด์ง€๋Š” ์—ฌ์ „ํžˆ Article ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์žˆ๋˜ ์œ„์น˜๋ฅผ ๋ฎ์–ด์“ฐ๋ ค๋ฉด(์ƒˆ๋กœ์šด ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํžˆ์Šคํ† ๋ฆฌ์— ๊ฐ™์€ ์œ„์น˜๊ฐ€ ๋‘ ๋ฒˆ ์ƒ๊ธฐ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด) ์ˆ˜๋™์œผ๋กœ router.replace()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

js
router.addRoute({ path: '/about', component: About })
// this.$route ๋˜๋Š” useRoute()๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
router.replace(router.currentRoute.value.fullPath)

์ƒˆ๋กœ์šด ๋ผ์šฐํŠธ๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค๋ฉด await router.replace()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ ๋‚ด์—์„œ ๋ผ์šฐํŠธ ์ถ”๊ฐ€ํ•˜๊ธฐ โ€‹

๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ ๋‚ด์—์„œ ๋ผ์šฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด, router.replace()๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋ง๊ณ  ์ƒˆ๋กœ์šด ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฆฌ๋””๋ ‰์…˜์„ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

js
router.beforeEach(to => {
  if (!hasNecessaryRoute(to)) {
    router.addRoute(generateRoute(to))
    // ๋ฆฌ๋””๋ ‰์…˜์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค
    return to.fullPath
  }
})

์œ„ ์˜ˆ์‹œ๋Š” ๋‘ ๊ฐ€์ง€๋ฅผ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค: ์ฒซ์งธ, ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋ผ์šฐํŠธ ๋ ˆ์ฝ”๋“œ๊ฐ€ to ์œ„์น˜์™€ ์ผ์น˜ํ•˜์—ฌ ์šฐ๋ฆฌ๊ฐ€ ์ ‘๊ทผํ•˜๋ ค๋˜ ์œ„์น˜์™€๋Š” ๋‹ค๋ฅธ ์œ„์น˜๊ฐ€ ๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋‘˜์งธ, hasNecessaryRoute()๊ฐ€ ์ƒˆ๋กœ์šด ๋ผ์šฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฌดํ•œ ๋ฆฌ๋””๋ ‰์…˜์„ ๋ฐฉ์ง€ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๋ฆฌ๋””๋ ‰์…˜์„ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง„ํ–‰ ์ค‘์ธ ๋‚ด๋น„๊ฒŒ์ด์…˜์„ ๋Œ€์ฒดํ•˜๊ฒŒ ๋˜๋ฉฐ, ์•ž์„œ ๋ณด์—ฌ์ค€ ์˜ˆ์‹œ์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ƒํ™ฉ์—์„œ๋Š” ๋ผ์šฐํŠธ ์ถ”๊ฐ€๊ฐ€ ๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ ์™ธ๋ถ€, ์˜ˆ๋ฅผ ๋“ค์–ด ๋ทฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋  ๋•Œ ์ƒˆ๋กœ์šด ๋ผ์šฐํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ๋งŽ์Šต๋‹ˆ๋‹ค.

๋ผ์šฐํŠธ ์ œ๊ฑฐํ•˜๊ธฐ โ€‹

๊ธฐ์กด ๋ผ์šฐํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์ด๋ฆ„์ด ์ถฉ๋Œํ•˜๋Š” ๋ผ์šฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•. ๊ธฐ์กด ๋ผ์šฐํŠธ์™€ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ผ์šฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ๋จผ์ € ํ•ด๋‹น ๋ผ์šฐํŠธ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ ์ƒˆ ๋ผ์šฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

    js
    router.addRoute({ path: '/about', name: 'about', component: About })
    // ์ด๋ฆ„์ด ๊ฐ™์œผ๋ฏ€๋กœ ์ด์ „์— ์ถ”๊ฐ€๋œ ๋ผ์šฐํŠธ๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
    // ๋ชจ๋“  ๋ผ์šฐํŠธ์—์„œ ์ด๋ฆ„์€ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    router.addRoute({ path: '/other', name: 'about', component: Other })
  • router.addRoute()๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•:

    js
    const removeRoute = router.addRoute(routeRecord)
    removeRoute() // ๋ผ์šฐํŠธ๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค

    ๋ผ์šฐํŠธ์— ์ด๋ฆ„์ด ์—†๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • router.removeRoute()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฆ„์œผ๋กœ ๋ผ์šฐํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•:

    js
    router.addRoute({ path: '/about', name: 'about', component: About })
    // ๋ผ์šฐํŠธ ์ œ๊ฑฐ
    router.removeRoute('about')

    ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์ด๋ฆ„ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ผ์šฐํŠธ์˜ ์ด๋ฆ„์— Symbol์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์šฐํŠธ๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋ผ์šฐํŠธ์˜ ๋ชจ๋“  ๋ณ„์นญ๊ณผ ์ž์‹ ๋ผ์šฐํŠธ๋„ ํ•จ๊ป˜ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

์ค‘์ฒฉ ๋ผ์šฐํŠธ ์ถ”๊ฐ€ํ•˜๊ธฐ โ€‹

๊ธฐ์กด ๋ผ์šฐํŠธ์— ์ค‘์ฒฉ ๋ผ์šฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด, router.addRoute()์˜ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ผ์šฐํŠธ์˜ ์ด๋ฆ„ ์„ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด children์„ ํ†ตํ•ด ์ถ”๊ฐ€ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ผ์šฐํŠธ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค:

js
router.addRoute({ name: 'admin', path: '/admin', component: Admin })
router.addRoute('admin', { path: 'settings', component: AdminSettings })

์ด๋Š” ๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค:

js
router.addRoute({
  name: 'admin',
  path: '/admin',
  component: Admin,
  children: [{ path: 'settings', component: AdminSettings }],
})

๊ธฐ์กด ๋ผ์šฐํŠธ ํ™•์ธํ•˜๊ธฐ โ€‹

Vue Router๋Š” ๊ธฐ์กด ๋ผ์šฐํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • router.hasRoute(): ๋ผ์šฐํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • router.getRoutes(): ๋ชจ๋“  ๋ผ์šฐํŠธ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋ชจ๋‘๋ฅผ ์œ„ํ•œ ๋ฌธ์„œ ํ•œ๊ธ€ํ™”