
SPA에서 URL로 페이지를 다루는 방법
Vue Router는 Vue 공식 라우팅 라이브러리다.
SPA에서 단순히 v-if 로 화면을 바꿀 수도 있지만, 아래 기능을 제대로 쓰려면 라우터가 필수에 가깝다.
/users/1 같은 주소로 직접 접근npm install vue-router@next
routes 배열로 path → component 매핑 정의createRouter() 로 라우터 인스턴스 생성app.use(router) 로 Vue 앱에 플러그인 등록<RouterView> 배치 (페이지가 들어갈 자리)const routes = [
{ path: '/', component: HomeView },
{ path: '/about', component: AboutView }
];
path : URL 패턴component : 해당 URL에서 렌더링할 컴포넌트createRouter + history 모드import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter({
history: createWebHistory(), // 또는 createWebHashHistory()
routes
});
createWebHistory()
/about 처럼 깔끔한 URLindex.html 로 돌려주는 설정 필요createWebHashHistory()
/#/about 형태실무에서는 보통 createWebHistory() 선택.
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
createApp(App)
.use(router)
.mount('#app');
.use(router) 로 라우터를 전역 플러그인으로 등록한다.
<RouterView> – 페이지가 끼워지는 자리<template>
<div>
<HeaderBar />
<RouterView />
<FooterBar />
</div>
</template>
<RouterView> 위치에 렌더링<RouterLink> – SPA용 링크<RouterLink to="/">Home</RouterLink>
<RouterLink to="/about">About</RouterLink>
<a href="..."> 와 비슷하지만 페이지 새로고침 없이 라우트 전환router-link-active 클래스 부여replace 옵션
<RouterLink to="/login" replace>로그인</RouterLink>
useRoute – 현재 라우트 정보 읽기import { useRoute } from 'vue-router';
const route = useRoute();
route.path; // "/users/1"
route.params.id; // "1"
route.query.page; // "2" (예: ?page=2)
params, query, meta 등 라우트 관련 정보에 접근할 수 있다useRouter – 코드에서 라우트 이동import { useRouter } from 'vue-router';
const router = useRouter();
const goHome = () => {
router.push('/');
};
const goUser = id => {
router.push(`/users/${id}`);
};
router.push() : 히스토리에 기록 남기면서 이동router.replace() : 현재 기록을 덮어쓰기버튼 클릭, 폼 전송 이후 특정 페이지로 보내는 작업에 사용한다.
/users/:idconst routes = [
{ path: '/users/:id', component: UserDetailView }
];
/users/10 에 접근하면 route.params.id === "10"
주로 리소스 식별자 표현에 사용
/products/123, /posts/2024-11-20?page=2&keyword=vue// /search?keyword=vue&page=2
const route = useRoute();
route.query.keyword; // "vue"
route.query.page; // "2"
간단히 정리하면
paramsqueryApp.vue 같은 최상위 컴포넌트에서:
<template>
<div>
<HeaderBar />
<main>
<RouterView /> <!-- 페이지 영역 -->
</main>
<FooterBar />
</div>
</template>
<RouterView> 안에만 집중관리자 페이지 같은 경우:
const routes = [
{
path: '/admin',
component: AdminLayout, // 내부에 <RouterView> 포함
children: [
{ path: 'users', component: AdminUsers },
{ path: 'settings', component: AdminSettings }
]
}
];
/admin/users → AdminLayout + AdminUsers/admin/settings → 같은 레이아웃 + AdminSettings섹션별로 공통 레이아웃을 재사용할 수 있다.
라우트가 변경되기 전에
를 결정하는 훅이다.
종류
router.beforeEachbeforeEnterbeforeRouteLeave 등기본적인 로그인/권한 체크는 보통 전역 beforeEach 에서 처리한다.
beforeEach 개념 흐름/mypage 로 이동 시도beforeEach 에서 로그인 여부, 권한 확인/login 으로 이동Vue 3 에서는 next() 대신 return false, return { path: '/login' } 같은 패턴을 사용한다는 정도만 기억해 두면 된다.
라우트 정의에 임의 정보를 붙일 수 있다.
const routes = [
{
path: '/mypage',
component: MyPageView,
meta: { requiresAuth: true }
},
{
path: '/login',
component: LoginView,
meta: { guestOnly: true }
}
];
requiresAuth : 로그인한 사용자만 접근 가능해야 하는 페이지guestOnly : 로그인 안 한 사용자만 접근 가능 (로그인 페이지 등)전역 가드에서:
to.meta.requiresAuth 확인
/login 으로 리다이렉트to.meta.guestOnly 확인
/ 나 /mypage 로 돌려보내기이 패턴을 쓰면
라는 구조를 만들 수 있다.
모든 페이지 컴포넌트를 한 번에 번들링하면
사용자는 처음부터 모든 페이지에 가지 않는다.
그래서 필요한 페이지에 처음 들어갈 때만 해당 컴포넌트를 로딩하는 것이 효율적이다.
const routes = [
{
path: '/about',
component: () => import('../views/AboutView.vue')
}
];
함수 형태로 컴포넌트를 넘기면
번들러가 이 구문을 보고 코드 스플리팅 수행
효과
<RouterView> 는 페이지가 들어가는 슬롯, <RouterLink> 는 SPA용 링크useRoute 로 현재 라우트 상태를 읽고, useRouter 로 코드에서 이동 제어/users/:id), 옵션 값 → query (?page=2)<RouterView> 조합으로 구성meta + 전역 beforeEach 패턴으로 깔끔하게 관리