Vue 2와 Vue Router를 활용한 라우팅 설정 및 페이지 렌더링

Vue 컴포넌트 템플릿 생성

프로젝트 구조가 잡혔다면, 이제 실제 화면을 구성할 뷰 컴포넌트를 작성해야 합니다. 간단한 예제로 목록을 보여주는 메인 화면과 상세 내용을 보여주는 화면 두 가지를 만들어 보겠습니다.

src/views 디렉토리를 생성하고, 그 안에 HomeView.vue와 DetailView.vue 파일을 만듭니다.

HomeView.vue:

<template>
  <section class="home-container">
    <h1>메인 목록 화면</h1>
    <p>여기에 데이터 리스트가 표시됩니다.</p>
  </section>
</template>

<script>
export default {
  name: 'HomeView'
}
</script>

DetailView.vue:

<template>
  <section class="detail-container">
    <h1>상세 내용 화면</h1>
    <p>선택한 항목의 상세 정보가 여기에 렌더링됩니다.</p>
  </section>
</template>

<script>
export default {
  name: 'DetailView'
}
</script>

Vue Router 설정 파일 작성

이제 생성한 컴포넌트들을 URL 경로와 매핑하기 위해 라우터 설정 파일을 구성합니다. src/router 폴더 아래에 index.js 파일을 생성하고 다음과 같이 코드를 작성합니다.

import Vue from 'vue';
import VueRouter from 'vue-router';

import HomeView from '../views/HomeView.vue';
import DetailView from '../views/DetailView.vue';

Vue.use(VueRouter);

const routeDefinitions = [
  {
    path: '/',
    name: 'Home',
    component: HomeView
  },
  {
    path: '/detail',
    name: 'Detail',
    component: DetailView
  }
];

const appRouter = new VueRouter({
  mode: 'history',
  routes: routeDefinitions
});

export default appRouter;

메인 엔트리 파일에 라우터 연동

애플리케이션의 시작점인 main.js 파일을 수정하여, 앞서 만든 라우터 인스턴스를 Vue 루트 인스턴스에 주입합니다.

import Vue from 'vue';
import RootComponent from './RootComponent.vue';
import appRouter from './router/index.js';

Vue.config.productionTip = false;

new Vue({
  el: '#root-app',
  router: appRouter,
  render: h => h(RootComponent)
});

루트 컴포넌트 및 내비게이션 구성

전체 레이아웃을 담당할 루트 컴포넌트(RootComponent.vue)에 내비게이션 링크와 라우터 뷰 포트를 배치합니다. <router-link>를 사용하면 페이지 새로고침 없이 경로를 이동할 수 있습니다.

<template>
  <div id="root-app">
    <nav class="main-navigation">
      <router-link class="nav-link" to="/">홈</router-link>
      <router-link class="nav-link" to="/detail">상세 페이지</router-link>
    </nav>
    
    <main class="content-area">
      <router-view></router-view>
    </main>
  </div>
</template>

<script>
export default {
  name: 'RootComponent'
}
</script>

<style>
#root-app {
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  text-align: center;
  color: #333;
  padding-top: 40px;
}

.main-navigation {
  margin-bottom: 20px;
}

.nav-link {
  margin: 0 15px;
  text-decoration: none;
  color: #42b983;
  font-weight: bold;
}

.nav-link.router-link-exact-active {
  color: #35495e;
}
</style>

ESLint 포맷팅 규칙 조정

개발 서버를 실행할 때 ESLint로 인한 불필요한 포맷팅 오류가 발생한다면, 웹팩 설정에서 해당 로더를 제외시키거나 규칙을 완화할 수 있습니다. build/webpack.base.conf.js 파일을 열어 eslint-loader 관련 설정을 주석 처리하거나 삭제합니다.

// build/webpack.base.conf.js
module.exports = {
  module: {
    rules: [
      // 아래 ESLint 로더 설정을 제거하거나 주석 처리하여 포맷팅 검사를 건너뜁니다.
      /*
      {
        test: /\.(js|vue)$/,
        loader: 'eslint-loader',
        enforce: 'pre',
        include: [resolve('src'), resolve('test')],
        options: {
          formatter: require('eslint-friendly-formatter')
        }
      }
      */
    ]
  }
}

설정을 저장한 후 npm run dev 명령어를 다시 실행하면, 브라우저에서 내비게이션이 정상적으로 동작하는 것을 확인할 수 있습니다.

SASS/SCSS 스타일시트 통합

프로젝트에서 SCSS 문법을 사용하려면 관련 로더를 설치해야 합니다. RootComponent.vue의 스타일 블록에 lang="scss" 속성을 추가하고 외부 스타일시트를 불러와 보겠습니다.

<style lang="scss">
  @import "./assets/styles/global.scss";
  
  #root-app {
    background-color: #f9f9f9;
  }
</style>

이 상태에서 빌드를 시도하면 sass-loader를 찾을 수 없다는 오류가 발생합니다. 이를 해결하기 위해 터미널에서 다음 패키지를 개발 의존성으로 설치합니다. 최신 환경에서는 node-sass 대신 sass (Dart Sass)를 사용하는 것이 권장됩니다.

npm install sass-loader sass --save-dev

패키지 설치 후 개발 서버를 재시작하면 SCSS로 작성된 스타일이 성공적으로 컴파일되어 화면에 적용됩니다.

태그: Vue2 VueRouter Webpack ESLint Sass

9월 28일 19:43에 게시됨