Vue Router의 네비게이션 가드는 라우트 이동 전후에 특정 로직을 실행할 수 있는 훅입니다.
주로 아래 같은 상황에서 사용합니다.
로그인 여부 확인
관리자 페이지 접근 제어
페이지 진입 전 데이터 준비
저장하지 않은 폼 이탈 방지
페이지 이동 로그/분석 처리
기본 예제// router/index.tsimport { createRouter, createWebHistory } from 'vue-router'import Home from '../views/Home.vue'import About from '../views/About.vue'import Profile from '../views/Profile.vue'const routes = [ { path: '/', name: 'Home', component: Home, }, { path: '/about', name: 'About', component: About, beforeEnter: (to, from, next) => { console.log('About 페이지로 이동 시도') next() }, }, { path: '/profile', name: 'Profile', component: Profile, meta: { requiresAuth: true }, },]const router = createRouter({ history: createWebHistory(), routes,})router.beforeEach((to, from, next) => { const isAuthenticated = localStorage.getItem('token') !== null if (to.meta.requiresAuth && !isAuthenticated) { next({ name: 'Home' }) } else { console.log(`Navigating from ${from.path} to ${to.path}`) next() }})router.beforeResolve(async (to, from, next) => { if (to.meta.requiresData) { try { console.log('Resolving data for', to.path) next() } catch (error) { next(false) } } else { next() }})router.afterEach((to, from) => { console.log(`Navigation completed to ${to.path}`)})export default router
컴포넌트 내부 가드 예제<!-- views/Profile.vue --><template> <div> <h1>Profile Page</h1> </div></template><script>export default { name: 'Profile', beforeRouteEnter(to, from, next) { console.log('Entering Profile component') next((vm) => { vm.loadUserData() }) }, beforeRouteUpdate(to, from, next) { console.log('Updating Profile component') next() }, beforeRouteLeave(to, from, next) { const confirmLeave = window.confirm('정말 페이지를 나가시겠습니까?') if (confirmLeave) { next() } else { next(false) } }, methods: { loadUserData() { console.log('Loading user data') }, },}</script>
전역 가드
beforeEach: 모든 라우트 이동 전에 실행
beforeResolve: 컴포넌트가 렌더링되기 직전에 실행
afterEach: 네비게이션 완료 후 실행