Learning
레슨 6 / 9·20분

Vue Router

Vue Router 설정

Vue Router는 Vue.js 공식 라우팅 라이브러리입니다. URL에 따라 다른 컴포넌트를 보여주는 SPA 라우팅을 구현합니다.

typescript
// router/index.ts
import { createRouter, createWebHistory } from 'vue-router';

const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      path: '/',
      name: 'home',
      component: () => import('@/views/Home.vue'),
    },
    {
      path: '/about',
      name: 'about',
      component: () => import('@/views/About.vue'),
    },
    {
      path: '/users/:id',
      name: 'user-detail',
      component: () => import('@/views/UserDetail.vue'),
      props: true, // params를 props로 전달
    },
    {
      path: '/:pathMatch(.*)*',
      name: 'not-found',
      component: () => import('@/views/NotFound.vue'),
    },
  ],
});

export default router;

네비게이션과 파라미터

vue
<script setup lang="ts">
import { useRoute, useRouter } from 'vue-router';

const route = useRoute();     // 현재 라우트 정보
const router = useRouter();   // 프로그래밍 방식 이동

// URL 파라미터 읽기: /users/42 → id = "42"
const userId = route.params.id;

// 쿼리 파라미터: /search?q=vue → q = "vue"
const query = route.query.q;

// 프로그래밍 방식 이동
function goToUser(id: number) {
  router.push({ name: 'user-detail', params: { id } });
}

function goBack() {
  router.back();
}
</script>

<template>
  <nav>
    <!-- 선언적 네비게이션 -->
    <RouterLink to="/">홈</RouterLink>
    <RouterLink :to="{ name: 'about' }">소개</RouterLink>

    <!-- active 클래스 자동 추가됨 -->
    <RouterLink
      to="/users"
      active-class="font-bold text-blue-600"
    >
      사용자
    </RouterLink>
  </nav>

  <!-- 매칭된 컴포넌트가 여기에 렌더링 -->
  <RouterView />
</template>

네비게이션 가드

네비게이션 가드는 라우트 이동 전에 실행되는 훅으로, 인증 확인이나 페이지 접근 제어에 사용됩니다.

typescript
// 전역 가드 — 모든 라우트 이동 전 실행
router.beforeEach((to, from) => {
  const isAuthenticated = checkAuth();

  if (to.meta.requiresAuth && !isAuthenticated) {
    // 로그인 페이지로 리다이렉트
    return { name: 'login', query: { redirect: to.fullPath } };
  }
});

// 라우트별 가드
{
  path: '/admin',
  component: AdminPanel,
  meta: { requiresAuth: true, role: 'admin' },
  beforeEnter: (to) => {
    const user = getUser();
    if (user?.role !== 'admin') {
      return { name: 'forbidden' };
    }
  },
}
💡

() => import("./View.vue") 형태의 동적 import를 사용하면 각 라우트의 컴포넌트가 별도 청크로 분리되어, 초기 로딩 시간을 크게 줄일 수 있습니다 (코드 스플리팅).