Skip to content

라우트 Meta 필드

때로는 transition 이름이나 라우트 접근 권한을 제어하기 위한 역할 같은 임의의 정보를 라우트에 붙이고 싶을 수 있습니다. 이는 속성 객체를 받으며 라우트 location과 내비게이션 가드에서 접근할 수 있는 meta 속성을 통해 구현할 수 있습니다. meta 속성은 다음과 같이 정의할 수 있습니다:

js
const routes = [
  {
    path: '/posts',
    component: PostsLayout,
    children: [
      {
        path: 'new',
        component: PostsNew,
        // 인증된 사용자만 게시물을 만들 수 있습니다
        meta: { requiresAuth: true },
      },
      {
        path: ':id',
        component: PostsDetail,
        // 누구나 게시물을 읽을 수 있습니다
        meta: { requiresAuth: false },
      },
    ],
  },
]

그렇다면 이 meta 필드에는 어떻게 접근할까요?

먼저 routes 구성의 각 라우트 객체를 라우트 레코드 라고 부릅니다. 라우트 레코드는 중첩될 수 있습니다. 따라서 라우트가 매치될 때는 여러 라우트 레코드에 동시에 매치될 수 있습니다.

예를 들어 위 라우트 구성에서는 URL /posts/new가 부모 라우트 레코드(path: '/posts')와 자식 라우트 레코드(path: 'new') 모두에 매치됩니다.

하나의 라우트에 매치된 모든 라우트 레코드는 route 객체(및 내비게이션 가드 안의 라우트 객체)에서 route.matched 배열로 노출됩니다. 이 배열을 순회하며 모든 meta 필드를 확인할 수도 있지만, Vue Router는 부모에서 자식까지의 모든 meta 필드를 비재귀적으로 병합한 route.meta도 제공합니다. 즉 다음처럼 간단히 작성할 수 있습니다:

js
router.beforeEach((to, from) => {
  // 각 라우트 레코드를 확인해야 하는 대신
  // to.matched.some(record => record.meta.requiresAuth)
  if (to.meta.requiresAuth && !auth.isLoggedIn()) {
    // 이 라우트는 인증이 필요하므로 로그인 여부를 확인합니다
    // 아니라면 로그인 페이지로 리다이렉트합니다.
    return {
      path: '/login',
      // 나중에 돌아올 수 있도록 현재 location을 저장합니다
      query: { redirect: to.fullPath },
    }
  }
})

TypeScript

vue-routerRouteMeta 인터페이스를 확장하여 meta 필드에 타입을 지정할 수 있습니다:

ts
// 이것은 `router.ts` 같은 어떤 `.ts` 파일에든 직접 추가할 수 있습니다
// `.d.ts` 파일에 추가할 수도 있습니다. 프로젝트의 tsconfig.json
// "files"에 포함되어 있는지 확인하세요
import 'vue-router'

// 모듈로 처리되도록 하려면 `export` 문을 하나 이상 추가하세요
export {}

declare module 'vue-router' {
  interface RouteMeta {
    // 선택 사항입니다
    isAdmin?: boolean
    // 모든 라우트에서 선언해야 합니다
    requiresAuth: boolean
  }
}

모두를 위한 문서 한글화