Vue Router란?
Vue Router는 Vue.js 애플리케이션에서 페이지 간 이동(라우팅)을 관리하는 공식 라이브러리
- 웹사이트에서 페이지를 클릭하면 새로운 화면으로 넘어가는 것이 필요하지?
-> Vue는 SPA(Single Page Application, 단일 페이지 애플리케이션) 방식이라 페이지가 새로고침 없이 동작하는데, 이때 Vue Router를 사용하면 페이지 이동처럼 보이게 만들 수 있다
- 라우트(Route)
- 특정 URL에 해당하는 화면(컴포넌트)을 지정하는 설정
- 예:
/home→HomeView.vue,/about→AboutView.vue- 라우터(Router)
- 여러 개의 라우트(Route) 설정을 관리하는 객체
VueRouter를 생성해서 등록하면 페이지 이동이 가능해짐- 네비게이션(Navigation)
<router-link>태그를 사용해서 페이지 이동을 쉽게 할 수 있음this.$router.push('/about')같은 코드로도 이동 가능!
사용자는 직접 경로를 입력해 이동하기도 한다. 하지만 동적 컴포넌트의 조합만으로는 이런 기능을 제공할 수 없다.
(여러 화면을 가진 애플리케이션을 만들 수는 있지만 특정 화면으로 직접 이동할 수 없으며, 반드시 초기 화면을 거쳐야만 한다)
이 문제를 해결하기 위해서는 라우팅 기능을 적용하여 개발이 필수다!
SPA(단일 페이지 애플리케이션: Single Page Application)
→ 화면마다 고유의 식별자(URI)를 기반으로 화면을 렌더링해야 함
(URI: Uniform Resource Identifier, 인터넷에서 어떤 특정한 파일, 웹페이지, 이미지 등을 찾기 위한 주소 체계)
createRouter()
import { createRouter, createWebHistory } from 'vue-router'
…
const router = createRouter({
history: createRouter(),
routes: [
{ path: '/', components: Home }, // https://localhost:5173/ -> 메인 화면(홈)
{ path: '/about', components: About },
{ path: '/members', components: Members },
{ path: '/videos', components: Videos},
]
});
router 객체의 등록
const app = createApp(App)
app.use(router) // *
app.mount('#app')
<RouterView>
<template>
<div class="container">
<Header />
<RouterView/>
</div>
</template>
<RouterLink to=”경로”>
<router-link to="[등록시킬 URI 경로]">[링크 텍스트]</router-link>
<RouterLink to="/">Home</RouterLink>
// route level code-splitting 라우트 단위 코드 분할 -> 특정 라우트(페이지)별로 코드를 나누어, 해당 페이지가 필요할 때만 로드하도록 설정한다
// this generates a separate chunk (About.[hash].js) for this route 이 설정은 해당 라우트를 위한 별도의 청크(파일)를 생성한다
// which is lazy-loaded when the route is visited. 이 페이지는 사용자가 해당 라우트(/about 경로)를 방문할 때만 지연 로딩(Lazy Loading)된다
import router from './router' → index.js의 설정을 가져옴
직접 a 태그를 쓰면 안 되고 라우터 링크를 써주어야 한다
/about 문자열로 해석
<RouterLink to="/">Home</RouterLink>
<RouterLink to="/about">About</RouterLink>
컴포넌트에서 router 객체 접근하기
| 구분 | Options API | Composition API |
|---|---|---|
| 라우터 객체 | this.$router | const router = useRouter() |
| 매칭된 라우트(currentRoute) | this.router.currentRoute | const currentRoute = useRoute() |
params, query
동적 라우트 →
:파라미터를 사용하여 변하는 값을 포함하는 라우트
- 예)
/users/:id→/users/1,/users/2등으로 변형 가능URI에서 값 가져오기
useRoute().params.id사용 → 경로(path)에서 데이터를 가져온다는 뜻
(URI는 자원을 식별하는 모든 방식을 포함함)즉, "한 개의 페이지에서 여러 개의 데이터를 구분할 때 사용하는 라우팅 방식!
중첩 라우트
중첩 라우트는 한 페이지 내에서 여러 개의 라우트 변경을 가능하게 함
children: []을 사용해 하위 라우트 설정router-view를 사용해 중첩된 라우트의 내용을 표시/members/1/profile,/members/1/activity같은 구조적인 URL을 만들 수 있음!
명명된 라우트(Named Route)
"라우트의 별명" 같은 개념
path대신name을 사용해 유지보수 & 가독성 향상
router-link,this.$router.push()에서name을 사용하면 더 직관적이고 편리함!
명명된 뷰(Named View)
라우터 객체의 메서드
[Options API 적용]
const router = this.$router;
[Composition API 적용]
import { useRouter } from 'vue-router'
....
const router = useRouter();
| 메서드 | 기능 | 히스토리 기록 |
|---|---|---|
push(to) | 새로운 페이지로 이동 | ⭕ |
replace(to) | 현재 페이지를 새로운 페이지로 변경 | ❌ (기록 덮어씀) |
go(n) | 히스토리 이동 (n만큼) | - |
back() | 뒤로 가기 (go(-1)) | - |
forward() | 앞으로 가기 (go(1)) | - |
push(to) vs replace(to) 차이
push() → 뒤로 가기 가능replace() → 이전 페이지 기록을 덮어씌움 (뒤로 가기 불가능)push() 메서드
이동 경로를 정적인 문자열을 인자로 전달 가능
경로 정보를 담은 객체를 인자로 전달 가능
push() 사용하는 방법
// 문자열 직접 전달
router.push('/home')
// 객체 정보로 전달
router.push({ path: 'about' })
// 명명된 라우트 사용
router.push({ name: 'members/id', params: { id: 1} })
// 쿼리 문자열 전달 ex) /board?pageno=1&pagesize=5
router.push({ path: '/board', query: { pageno: 1, pagesize: 5 }})
currentRoute & router
| 개념 | 설명 | 관련 메서드 |
|---|---|---|
currentRoute | 현재 활성화된 라우트 정보(경로, 파라미터 등)를 담고 있음 | useRoute() 사용 |
router | 라우트를 변경하는 기능을 제공하는 객체 | push(), replace(), go(), back(), forward() |
내비게이션 가드(Navigation Guard)
Vue Router에서 특정 경로로 이동할 때, 그 이동을 제어하는 기능
예를 들어, 로그인이 필요한 페이지에서 로그인 여부를 확인할 때 사용
라우팅이 일어날 때 프로그래밍 방식으로 내비게이션을 취소하거나, 다른 경로로 리디렉션 → 내비게이션을 안전하게 보호하는 기능을 수행
라우트하는 경로(path)가 바뀔 때 반응
동일한 경로에서 파라미터나 쿼리 문자열이 변경될 때는 작동하지 않음
사용 수준
| 내비게이션 가드 종류 | 설명 |
|---|---|
| 전역 가드 | router.beforeEach(), router.beforeResolve(), router.afterEach() |
| 라우트 가드 | beforeEnter (개별 라우트마다 설정) |
| 컴포넌트 가드 | beforeRouteEnter, beforeRouteUpdate, beforeRouteLeave |
전역 가드 → 모든 페이지 이동 전에 실행 (
beforeEach())라우트 가드 → 특정 라우트에서만 실행 (
beforeEnter)컴포넌트 가드 → 개별 컴포넌트에서 실행 (
beforeRouteEnter,beforeRouteLeave등)