반응형
 

Vue.js 네비게이션 가드란 무엇인가?

Vue.js의 네비게이션 가드는 Vue Router에서 제공하는 기능으로, 특정 조건에 따라 라우트 전환을 허용하거나 거부할 수 있게 합니다. 이를 통해 다음과 같은 작업을 처리할 수 있습니다:

  • 인증되지 않은 사용자가 특정 페이지에 접근하는 것을 막기
  • 라우트 변경 전에 데이터를 가져오거나 상태를 초기화
  • 페이지 전환 중 사용자의 동작 확인 (예: 저장되지 않은 변경 사항 경고)

네비게이션 가드의 종류

Vue Router에서 사용할 수 있는 네비게이션 가드는 세 가지로 나뉩니다:

  1. 전역 가드
    모든 라우트 전환에 적용됩니다.
  2. 라우트별 가드
    특정 라우트에서만 작동합니다.
  3. 컴포넌트 가드
    컴포넌트 내에서 작동합니다.

네비게이션 가드 사용 방법

1. 전역 가드

전역 가드는 router.beforeEachrouter.afterEach를 사용하여 설정할 수 있습니다.

import { createRouter, createWebHistory } from 'vue-router';
import Home from './views/Home.vue';
import Dashboard from './views/Dashboard.vue';

const routes = [
  { path: '/', component: Home },
  { path: '/dashboard', component: Dashboard }
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

// 전역 가드 설정
router.beforeEach((to, from, next) => {
  console.log('전역 가드 실행:', to.path);
  if (to.path === '/dashboard') {
    const isAuthenticated = false; // 인증 상태 확인
    if (!isAuthenticated) {
      alert('로그인이 필요합니다.');
      return next('/'); // 홈으로 리다이렉트
    }
  }
  next(); // 전환 허용
});

export default router;
 

2. 라우트별 가드

라우트 정의에 beforeEnter 옵션을 추가하여 특정 라우트에만 가드를 설정할 수 있습니다.

const routes = [
  { path: '/', component: Home },
  { 
    path: '/dashboard', 
    component: Dashboard,
    beforeEnter: (to, from, next) => {
      console.log('라우트별 가드 실행:', to.path);
      const isAuthenticated = false; // 인증 상태 확인
      if (!isAuthenticated) {
        alert('로그인이 필요합니다.');
        return next('/'); // 홈으로 리다이렉트
      }
      next(); // 전환 허용
    }
  }
];
 

3. 컴포넌트 가드

컴포넌트에서 beforeRouteEnter, beforeRouteUpdate, beforeRouteLeave 훅을 사용하여 가드를 설정할 수 있습니다.

<script>
export default {
  name: 'Dashboard',
  beforeRouteEnter(to, from, next) {
    console.log('컴포넌트 가드 (enter):', to.path);
    next(); // 전환 허용
  },
  beforeRouteUpdate(to, from, next) {
    console.log('컴포넌트 가드 (update):', to.path);
    next(); // 전환 허용
  },
  beforeRouteLeave(to, from, next) {
    console.log('컴포넌트 가드 (leave):', from.path);
    if (confirm('이 페이지를 떠나시겠습니까?')) {
      next(); // 전환 허용
    } else {
      next(false); // 전환 취소
    }
  }
};
</script>
 

네비게이션 가드 활용 예제: 인증 시스템

아래는 네비게이션 가드를 활용하여 간단한 인증 시스템을 구현한 예제입니다.

import { createRouter, createWebHistory } from 'vue-router';
import Home from './views/Home.vue';
import Login from './views/Login.vue';
import Dashboard from './views/Dashboard.vue';

const routes = [
  { path: '/', component: Home },
  { path: '/login', component: Login },
  { 
    path: '/dashboard', 
    component: Dashboard,
    meta: { requiresAuth: true } // 인증 필요 플래그
  }
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

// 전역 가드: 인증 처리
router.beforeEach((to, from, next) => {
  if (to.meta.requiresAuth) {
    const isAuthenticated = false; // 인증 상태 확인
    if (!isAuthenticated) {
      alert('로그인이 필요합니다.');
      return next('/login'); // 로그인 페이지로 리다이렉트
    }
  }
  next(); // 전환 허용
});

export default router;
 

결론

Vue.js의 네비게이션 가드는 앱의 라우팅 로직을 제어하고, 사용자 경험을 관리하는 데 중요한 역할을 합니다. 인증 처리, 데이터 로딩, 사용자 경고 등의 작업에 효과적으로 활용할 수 있습니다. 상황에 따라 전역, 라우트별, 컴포넌트 가드를 적절히 조합해 사용하면 더욱 강력한 앱을 만들 수 있습니다.

 
반응형

'개발 부트캠프 > 프론트엔드' 카테고리의 다른 글

[Vue] Pinia (State Manager)  (1) 2024.12.26
[Vue] Props & Emit  (0) 2024.12.24
[Vue] 조건문&반복문 (v-if, v-for)  (0) 2024.12.23
[Vue] 데이터 바인딩(Data Binding)  (0) 2024.12.23
[Vue] 뷰 라우터(Vue Router)  (2) 2024.12.23
반응형
 

Vue에서 State Manager란 무엇인가?

State Manager는 애플리케이션의 상태(state)를 중앙에서 관리하고, 이를 효율적으로 업데이트하거나 공유할 수 있도록 도와주는 도구입니다. Vue와 같은 프런트엔드 프레임워크에서 상태 관리는 컴포넌트 간 데이터 흐름을 명확하게 하고, 복잡한 데이터 구조를 보다 쉽게 다룰 수 있도록 해줍니다.

State Manager의 필요성

Vue는 기본적으로 컴포넌트 간 데이터 흐름을 위해 propsemit을 사용합니다. 하지만 애플리케이션 규모가 커질수록 아래와 같은 문제들이 발생할 수 있습니다:

  1. 컴포넌트 간 데이터 전달의 복잡성: 부모-자식 관계가 깊어질수록 데이터 전달이 번거로워집니다.
  2. 형제 컴포넌트 간 데이터 공유의 어려움: 상태를 공유하려면 부모 컴포넌트를 경유해야 하는 경우가 많아집니다.
  3. 상태의 일관성 유지: 여러 컴포넌트에서 같은 상태를 수정하다 보면 데이터 불일치 문제가 발생할 수 있습니다.

이러한 문제를 해결하기 위해 Vuex와 같은 상태 관리 라이브러리가 등장했으며, 최근에는 Pinia가 더욱 간단하고 직관적인 API로 주목받고 있습니다.

Pinia란 무엇인가?

Pinia는 Vue 3를 위해 설계된 차세대 상태 관리 라이브러리입니다. Vuex의 대안으로, 사용이 간단하고 Vue 3의 Composition API와 완벽하게 통합됩니다. Pinia는 다음과 같은 장점을 제공합니다:

  1. 간단한 문법: boilerplate가 적고 설정이 쉽습니다.
  2. Typescript 친화적: 강력한 타입 지원을 제공합니다.
  3. Devtools 통합: Vue Devtools와 자연스럽게 연동됩니다.
  4. 모듈화된 설계: 스토어를 모듈 단위로 나눌 수 있어 확장성이 높습니다.

Pinia 설치 및 설정

1. Pinia 설치

npm install pinia

2. Pinia 설정

먼저, Vue 애플리케이션에 Pinia를 설정해야 합니다. main.js 또는 main.ts 파일에서 Pinia를 생성하고 Vue 애플리케이션에 추가합니다:

// main.js 또는 main.ts
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from './App.vue';

const app = createApp(App);
const pinia = createPinia();

app.use(pinia);
app.mount('#app');

3. 스토어 생성

Pinia에서 상태 관리를 위해 스토어를 정의합니다. 예를 들어, 카운터 애플리케이션을 위한 counter 스토어를 생성한다고 가정해보겠습니다:

// stores/counter.js
import { defineStore } from 'pinia';

export const useCounterStore = defineStore('counter', {
    state: () => ({
        count: 0,
    }),
    actions: {
        increment() {
        	this.count++;
        },
        decrement() {
        	this.count--;
        },
    },
    getters: {
	    doubleCount: (state) => state.count * 2,
    },
});

4. 스토어 사용

스토어를 사용하는 방법은 아래와 같습니다:

<script setup>
import { useCounterStore } from '@/stores/counter';

const counterStore = useCounterStore();
</script>

<template>
    <div>
        <p>Count: {{ counterStore.count }}</p>
        <p>Double Count: {{ counterStore.doubleCount }}</p>
        <button @click="counterStore.increment">Increment</button>
        <button @click="counterStore.decrement">Decrement</button>
    </div>
</template>

Pinia의 주요 기능

  1. State: 컴포넌트 간 공유되는 데이터.
  2. Getters: 계산된 상태를 정의.
  3. Actions: 상태를 변경하는 메서드.

결론

Pinia는 Vue 3 애플리케이션에서 상태 관리를 간소화하고, 더 나은 개발 경험을 제공합니다. 간단한 API, Vue Devtools와의 통합, 그리고 Typescript 지원 덕분에 Pinia는 현대 Vue 애플리케이션의 이상적인 선택입니다. 이제 Pinia를 사용하여 더 깔끔하고 유지보수하기 쉬운 코드를 작성해보세요!

반응형

'개발 부트캠프 > 프론트엔드' 카테고리의 다른 글

[Vue] 네비게이션 가드  (1) 2024.12.27
[Vue] Props & Emit  (0) 2024.12.24
[Vue] 조건문&반복문 (v-if, v-for)  (0) 2024.12.23
[Vue] 데이터 바인딩(Data Binding)  (0) 2024.12.23
[Vue] 뷰 라우터(Vue Router)  (2) 2024.12.23
반응형
 

Vue의 Props와 Emit: 무엇이고 어떻게 사용할까?

Vue.js는 컴포넌트 기반 프레임워크로, 컴포넌트 간의 데이터를 주고받기 위해 propsemit을 사용합니다. 이 글에서는 propsemit이 무엇인지, 그리고 이를 사용하는 방법을 Parent-Child 컴포넌트 예제를 통해 알아보겠습니다.


Props란?

props는 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달하기 위한 속성입니다. 부모 컴포넌트에서 데이터를 정의하고, 자식 컴포넌트에서 이를 받아서 사용할 수 있습니다.

Emit이란?

emit은 자식 컴포넌트가 부모 컴포넌트로 이벤트를 전달할 때 사용됩니다. 자식 컴포넌트에서 특정 작업이 완료되거나 이벤트가 발생했을 때 이를 부모 컴포넌트로 알릴 수 있습니다.


예제 구성

우리는 Parent.vue와 Child.vue 두 개의 파일로 구성된 간단한 예제를 만들 것입니다.

1. Props를 사용하는 경우

부모가 데이터를 자식으로 전달합니다.

Parent.vue

<script setup>
import { ref } from 'vue';
import Child from './Child.vue';

// 부모 컴포넌트의 데이터
const parentMessage = ref('Hello from Parent!');
</script>

<template>
    <div>
        <h1>Parent Component</h1>
        <p>Message to Child: {{ parentMessage }}</p>

        <!-- 자식 컴포넌트 사용 -->
        <Child :message="parentMessage"></Child>
    </div>
</template>

Child.vue

Script
<script setup>
import { defineProps } from 'vue';

// 부모로부터 전달받을 props 정의
const props = defineProps({
message: String,
});
</script>

<template>
    <div>
        <h2>Child Component</h2>
        <p>Received from Parent: {{ message }}</p>
    </div>
</template>

 


2. Emit을 사용하는 경우

자식이 이벤트를 부모로 전달합니다.

Parent.vue

<script setup>
import { ref } from 'vue';
import Child from './Child.vue';

// 부모 컴포넌트의 데이터
const childResponse = ref('');

// 자식 컴포넌트의 이벤트 처리 함수
const handleChildResponse = (message) => {
	childResponse.value = message;
};
</script>

<template>
    <div>
        <h1>Parent Component</h1>

        <!-- 자식 컴포넌트 사용 -->
        <Child @response="handleChildResponse"></Child>

        <p>Response from Child: {{ childResponse }}</p>
    </div>
</template>

Child.vue

Script
<script setup>
import { reactive } from 'vue';
import { defineEmits } from 'vue';

// 부모로 이벤트를 전달할 emit 정의
const emit = defineEmits(['response']);

// 자식 컴포넌트의 데이터
const childData = reactive({
	inputMessage: '',
});

// 버튼 클릭 시 호출되는 함수
const sendResponse = () => {
	emit('response', `Child says: ${childData.inputMessage}`);
};
</script>

<template>
    <div>
        <h2>Child Component</h2>

        <input
        v-model="childData.inputMessage"
        placeholder="Type a response"
        />
	    <button @click="sendResponse">Send Response</button>
    </div>
</template>

 


동작 설명

Props 사용

  1. 부모 컴포넌트에서 데이터를 정의합니다.
  2. 자식 컴포넌트는 props를 통해 데이터를 받습니다.

Emit 사용

  1. 자식 컴포넌트에서 이벤트가 발생합니다.
  2. emit을 사용해 부모 컴포넌트로 메시지를 전달합니다.
  3. 부모 컴포넌트는 전달받은 메시지를 처리합니다.

이처럼 propsemit은 Vue.js 컴포넌트 간 데이터와 이벤트를 주고받는 데 매우 유용합니다. 이를 통해 컴포넌트 간의 역할을 명확히 나누고, 유지보수가 용이한 구조를 설계할 수 있습니다.

 

반응형
반응형
 

Vue.js에서 v-if와 v-for의 이해와 활용

Vue.js는 사용자 인터페이스를 효율적으로 구축할 수 있는 프레임워크로, 그 중 v-ifv-for는 조건문과 반복문을 처리하는 데 사용됩니다. 이 글에서는 v-ifv-for의 개념, 사용 방법, 그리고 응용 방법을 예제와 함께 자세히 알아보겠습니다.


v-if: 조건에 따라 DOM 요소 렌더링하기

v-if는 조건에 따라 특정 DOM 요소를 렌더링할지 말지를 제어하는 디렉티브입니다. 조건이 true이면 해당 요소가 DOM에 렌더링되고, false이면 렌더링되지 않습니다.

기본 사용법

<script setup>
import { ref } from 'vue';

const isLoggedIn = ref(false);
</script>

<template>
    <div>
        <p v-if="isLoggedIn">환영합니다!</p>
        <p v-else>로그인해주세요.</p>
    </div>
</template>

설명:

  • isLoggedIntrue이면 "환영합니다!"가 렌더링됩니다.
  • v-else를 사용하여 조건이 false일 때 다른 요소를 렌더링할 수도 있습니다.

v-else-if

<script setup>
import { ref } from 'vue';

const userRole = ref('editor');
</script>

<template>
    <div>
        <p v-if="userRole === 'admin'">관리자 화면</p>
        <p v-else-if="userRole === 'editor'">에디터 화면</p>
        <p v-else>일반 사용자 화면</p>
    </div>
</template>

설명:

  • 여러 조건을 v-else-if로 연결해 다양한 결과를 처리할 수 있습니다.

v-for: 리스트 렌더링

v-for는 배열이나 객체를 반복하여 DOM 요소를 렌더링할 때 사용됩니다. Vue.js는 이를 통해 효율적으로 리스트를 생성합니다.

기본 사용법

<script setup>
import { reactive } from 'vue';

const items = reactive(['사과', '바나나', '체리']);
</script>

<template>
    <ul>
        <li v-for="(item, index) in items" :key="index">
	        {{ index + 1 }}. {{ item }}
        </li>
    </ul>
</template>

설명:

  • items 배열의 각 항목이 <li> 요소로 렌더링됩니다.
  • :key 속성은 Vue가 각 요소를 고유하게 식별할 수 있도록 돕습니다.

객체 반복하기

<script setup>
import { reactive } from 'vue';

const user = reactive({
	name: '홍길동',
	age: 30,
	job: '개발자',
});
</script>

<template>
	<ul>
		<li v-for="(value, key) in user" :key="key">
			{{ key }}: {{ value }}
		</li>
	</ul>
</template>

설명:

  • 객체의 키와 값을 반복적으로 렌더링할 수 있습니다.

v-if와 v-for의 결합: 주의점과 사용법

v-ifv-for를 함께 사용하는 것은 가능하지만, 성능과 코드 가독성을 고려하여 신중히 사용해야 합니다. Vue.js는 v-for이 먼저 실행된 후 v-if를 평가하므로, 불필요한 요소를 렌더링할 가능성이 있습니다.

비효율적인 사용법

<script setup>
import { reactive } from 'vue';

const items = reactive([
    { id: 1, name: '사과', show: true },
    { id: 2, name: '바나나', show: false },
    { id: 3, name: '체리', show: true },
]);
</script>

<template>
    <ul>
        <li v-for="item in items" v-if="item.show" :key="item.id">
        	{{ item.name }}
        </li>
    </ul>
</template>

문제점:

  • v-for가 모든 항목을 반복한 뒤 v-if를 평가하므로 성능에 부정적인 영향을 미칠 수 있습니다.

효율적인 사용법

v-if 조건을 배열 필터링으로 처리합니다.

<script setup>
import { reactive, computed } from 'vue';

const items = reactive([
    { id: 1, name: '사과', show: true },
    { id: 2, name: '바나나', show: false },
    { id: 3, name: '체리', show: true },
]);

const filteredItems = computed(() => {
	return items.filter(item => item.show);
});
</script>

<template>
    <ul>
        <li v-for="item in filteredItems" :key="item.id">
	        {{ item.name }}
        </li>
    </ul>
</template>

장점:

  • 렌더링 전에 조건을 필터링하여 불필요한 계산을 줄입니다.

활용 예제: 동적 데이터 렌더링

사용자 목록과 상태 표시

<script setup>
import { reactive } from 'vue';

const users = reactive([
    { id: 1, name: '홍길동', active: true },
    { id: 2, name: '김철수', active: false },
    { id: 3, name: '이영희', active: true },
]);

const toggleActive = (id) => {
	const user = users.find(user => user.id === id);
	if (user) user.active = !user.active;
};
</script>

<template>
    <div>
        <h1>사용자 목록</h1>
        <ul>
            <li v-for="user in users" :key="user.id">
                <span :class="{ active: user.active }">
	                {{ user.name }}
                </span>
                <button @click="toggleActive(user.id)">
	                {{ user.active ? '비활성화' : '활성화' }}
                </button>
            </li>
        </ul>
    </div>
</template>

<style scoped>
.active {
    font-weight: bold;
    color: green;
    }
</style>

설명:

  • 각 사용자 상태를 active 여부에 따라 동적으로 표시합니다.
  • 버튼을 통해 사용자의 상태를 변경할 수 있습니다.

결론

v-ifv-for는 Vue.js 애플리케이션에서 중요한 역할을 하며, 이를 효과적으로 사용하면 효율적이고 가독성 높은 코드를 작성할 수 있습니다. 하지만 이 두 디렉티브를 결합할 때는 성능을 고려해야 합니다. 필터링이나 계산 속성을 사용해 효율성을 극대화하고, 유지보수를 쉽게 할 수 있는 구조를 선택하세요.

 
반응형
반응형
 

데이터 바인딩(Data Binding)의 이해와 사용법

Vue.js는 사용자 인터페이스를 구축하기 위한 JavaScript 프레임워크로, 데이터와 DOM(Document Object Model)을 효과적으로 연결하는 기능을 제공합니다. 이 연결을 데이터 바인딩(Data Binding)이라고 부르며, Vue의 핵심 개념 중 하나입니다. 데이터 바인딩을 통해 데이터 상태에 따라 뷰(View)를 동적으로 업데이트하거나, 사용자 입력에 따라 데이터 상태를 변경할 수 있습니다. 이 글에서는 Vue.js에서 데이터 바인딩이 무엇인지, 어떻게 사용하는지, 어떤 방법이 있는지 예제와 함께 살펴보겠습니다.


데이터 바인딩이란?

데이터 바인딩은 Vue 컴포넌트의 데이터와 HTML DOM 요소를 동기화하는 메커니즘입니다. Vue.js는 양방향 데이터 바인딩을 제공하므로, 데이터가 변경되면 화면이 자동으로 업데이트되고, 화면에서 사용자 입력이 발생하면 데이터에도 반영됩니다.


Vue에서 데이터 바인딩의 종류

Vue.js에서 데이터 바인딩은 크게 아래 두 가지로 나눌 수 있습니다:

  1. 단방향 바인딩 (One-Way Binding): 데이터를 컴포넌트에서 뷰로 전달합니다.
  2. 양방향 바인딩 (Two-Way Binding): 데이터가 컴포넌트와 뷰 간에 양방향으로 동기화됩니다.

데이터 바인딩의 주요 방법

1. 단방향 데이터 바인딩

단방향 데이터 바인딩은 Vue의 v-bind 디렉티브 또는 Mustache 구문({{}})을 사용하여 데이터를 HTML 속성이나 콘텐츠에 바인딩합니다.

  • Mustache 구문 예제
<script setup>
import { ref, reactive } from 'vue';
const message = ref('안녕하세요, Vue.js!');
</script>

<template>
  <div>
 	 <p>{{ message }}</p>
  </div>
</template

<style scoped></scoped>

결과: message 값이 DOM에 출력됩니다.

 

  • v-bind 디렉티브 예제
<script setup>
import { ref, reactive } from 'vue';
const imageUrl = ref('https://vuejs.org/images/logo.png');
</script>

<template>
    <div>
        <img v-bind:src="imageUrl" alt="Vue 로고">
    </div>
</template>

<style scoped></style>

결과: imageUrl 값이 <img> 태그의 src 속성에 바인딩됩니다.

 

2. 양방향 데이터 바인딩

양방향 데이터 바인딩은 v-model 디렉티브를 사용하여 DOM 요소의 값과 Vue 데이터 객체를 동기화합니다.

  • v-model 예제
<script setup>
import { ref, reactive } from 'vue';
const name = ref('');
</script>

<template>
    <div>
        <input v-model="name" placeholder="이름을 입력하세요">
        <p>입력한 이름: {{ name }}</p>
    </div>
</template>

<style scoped></style>

결과: 사용자가 입력 필드에 텍스트를 입력하면 name 데이터가 업데이트되고, 텍스트가 <p> 태그에 표시됩니다.


고급 바인딩 기법

1. 동적 바인딩

v-bind를 사용하여 동적으로 속성을 설정할 수 있습니다.

<script setup>
import { ref, reactive } from 'vue';
const buttonClass = ref('primary-button');
</script>

<template>
    <div>
    	<button v-bind:class="buttonClass">클릭하세요</button>
    </div>
</template>

<style scoped></style>

2. 조건부 렌더링과 반복 바인딩

  • 조건부 렌더링 (v-if)
<script setup>
import { ref, reactive } from 'vue';
const isVisible = ref(true);
</script>

<template>
    <div>
	    <p v-if="isVisible">이 문장은 조건적으로 렌더링됩니다.</p>
    </div>
</template>

<style scoped></style>
  • 리스트 렌더링 (v-for)
<script setup>
import { ref, reactive } from 'vue';
const items = reactive(
    { id: 1, name: '사과' },
    { id: 2, name: '바나나' },
    { id: 3, name: '체리' }
);
</script>

<template>
    <div>
        <ul>
	        <li v-for="item in items" :key="item.id">{{ item.name }}</li>
        </ul>
    </div>
</template>

<style scoped></style>

 


결론

Vue.js에서 데이터 바인딩은 뷰와 데이터 간의 상호작용을 단순화하고, 코드의 가독성과 유지보수성을 높이는 중요한 도구입니다. 단방향 바인딩으로 데이터를 효율적으로 표시하고, 양방향 바인딩으로 사용자 입력을 처리하며, 필요에 따라 조건부 렌더링과 리스트 렌더링을 활용하면 강력한 사용자 인터페이스를 쉽게 구축할 수 있습니다. 데이터 바인딩의 다양한 방법을 적절히 사용하여 Vue 애플리케이션의 생산성을 극대화해보세요!

 
반응형
반응형
 

Vue Router 

Vue Router는 Vue.js 애플리케이션에서 라우팅을 처리하는 공식 라이브러리입니다. 이를 사용하면 URL에 따라 컴포넌트를 렌더링하거나 SPA(Single Page Application) 내에서 페이지를 전환할 수 있습니다. 이 글에서는 Vue Router를 설정하는 방법을 예시와 함께 단계별로 설명하겠습니다.


1. Vue Router란?

Vue Router는 Vue.js에서 라우팅을 구현하기 위한 도구로, 다음과 같은 기능을 제공합니다:

  • URL에 따라 다른 컴포넌트를 렌더링.
  • 동적 라우팅과 쿼리 파라미터 처리.
  • 네비게이션 가드로 사용자 접근 제어.
  • 히스토리 모드 및 해시 모드 지원.

SPA에서는 URL이 변경되더라도 전체 페이지를 다시 로드하지 않고 필요한 부분만 업데이트합니다. Vue Router는 이를 가능하게 하며, 간단하고 직관적인 방식으로 라우팅을 설정할 수 있도록 도와줍니다.


2. 사용 방법

Vue Router를 사용하려면 설치 후 다음 파일을 생성하거나 수정해야 합니다:

(1) router 설치

npm install vue-router@4

Vue 프로젝트 경로 shell에서 Vue Router을 설치합니다.

(2) router/index.js 파일 생성

src/router 디렉토리를 만들고, 그 안에 index.js 파일을 생성합니다. 이 파일은 라우터 설정을 정의하는 중심 파일입니다.

(3) main.js 파일 수정

Vue 애플리케이션의 진입 파일인 src/main.js에서 라우터를 애플리케이션에 등록해야 합니다.

(4) 컴포넌트 파일 생성

각 라우트에 대응하는 컴포넌트를 생성합니다. 예를 들어, Home.vueAbout.vue를 만들어보겠습니다.


3. 각 파일의 내용

(1) router/index.js

import { createRouter, createMemoryHistory } from 'vue-router';
import Home from '../components/Home.vue';
import About from '../components/About.vue';

const routes = [
{ path: '/', name: 'Home', component: Home },
{ path: '/about', name: 'About', component: About },
];

const router = createRouter({
history: createMemoryHistory(),
routes,
});

export default router;

이 코드는 Vue Router 인스턴스를 생성하고, 두 개의 라우트를 정의합니다.

  • / 경로: Home 컴포넌트를 렌더링.
  • /about 경로: About 컴포넌트를 렌더링.

(2) main.js

import { createApp } from 'vue';
import App from './App.vue';
import router from './router';

const app = createApp(App);

app.use(router); // 라우터 등록
app.mount('#app');

라우터를 Vue 애플리케이션에 등록하여 사용할 수 있도록 설정합니다.

(3) 컴포넌트 파일

Home.vue

<script setup>
export default {
name: 'Home',
};
</script>

<template>
    <div>
    <h1>Home Page</h1>
    <p>Welcome to the Home Page!</p>
    </div>
</template>

<style scoped></style>

About.vue

<script setup>
export default {
name: 'About',
};
</script>

<template>
    <div>
    <h1>About Page</h1>
    <p>This is the About Page.</p>
    </div>
</template>

<style scoped></style>

이제 Vue Router를 통해 두 페이지를 전환할 수 있습니다. 브라우저에서 / 또는 /about 경로로 이동하면 각각의 컴포넌트가 렌더링됩니다. 추가적으로, 네비게이션 바를 구현하여 라우팅을 쉽게 탐색할 수도 있습니다.

네비게이션 바 예시

<template>
    <nav>
    <router-link to="/">Home</router-link>
    <router-link to="/about">About</router-link>
    </nav>
    <router-view></router-view>
</template>

이렇게 하면 Vue Router를 이용한 기본적인 라우팅 설정이 완료됩니다. 더 복잡한 애플리케이션에서는 동적 라우트 매칭, 네비게이션 가드 등을 활용하여 확장된 기능을 구현할 수 있습니다. 시작하기 좋은 단계로 위의 과정을 따라해 보세요!

 

 
 
반응형
반응형
 

Vite로 Vue 프로젝트 시작하기

Vue.js는 가볍고 빠른 성능을 가진 프론트엔드 프레임워크로, Vite는 현대적인 번들링 도구입니다. 이 두 가지를 조합하면 매우 효율적인 개발 환경을 구축할 수 있습니다. 이번 글에서는 Vite로 Vue 프로젝트를 생성하는 방법과 생성된 각 파일의 용도에 대해 알아보겠습니다.


1. Vite 기반 Vue 프로젝트 생성

먼저 Vite와 Vue를 사용해 새로운 프로젝트를 생성합니다. 다음은 단계별 과정입니다:

Step 1: 프로젝트 생성 명령어 실행

npm init vite [project name] --template vue
  • my-vue-app은 프로젝트 이름으로 원하는 이름으로 변경 가능합니다.
  • 명령어 실행 후 "Select a framework"에서 Vue, JavaScript를 선택하세요.
  • 옵션에 따라 TypeScript를 선택할 수도 있습니다.

Step 2: 프로젝트 디렉터리로 이동

cd my-vue-app

Step 3: 패키지 설치

npm install

Step 4: 로컬 개발 서버 실행

npm run dev

이제 브라우저에서 http://localhost:5173을 열어 새 프로젝트를 확인할 수 있습니다!


2. 프로젝트 구조와 파일 용도

my-vue-app 디렉터리에 생성된 파일과 폴더를 살펴보겠습니다.

📁 src/

Vue 애플리케이션의 핵심 코드가 위치하는 폴더입니다.

🔸 src/main.js

import { createApp } from 'vue';
import App from './App.vue';

createApp(App).mount('#app');
  • Vue 애플리케이션의 진입점 파일입니다.
  • createApp 함수로 Vue 인스턴스를 생성하고, App.vue 컴포넌트를 마운트합니다.
  • HTML의 #app 요소와 연결됩니다.

🔸 src/App.vue

<template>
<h1>Hello Vite + Vue!</h1>
</template>

<script>
export default {
name: 'App',
};
</script>

<style>
h1 {
color: #42b983;
}
</style>
  • 최상위 Vue 컴포넌트입니다.
  • 프로젝트의 메인 UI를 정의합니다.
  • template, script, style 섹션을 포함하여 Vue의 컴포넌트 구조를 보여줍니다.

🔸 src/assets/

정적 파일(이미지, 폰트 등)을 저장하는 폴더입니다.


🔸 
src/components/

Vue 컴포넌트를 관리하는 폴더입니다.

📁 public/

  • 앱에서 사용할 정적 파일(예: favicon, 로고 등)을 저장합니다.
  • 이 폴더의 파일은 빌드 시 그대로 복사됩니다.

📄 index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vite + Vue</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
  • Vue 애플리케이션의 HTML 템플릿입니다.
  • Vite의 특성상, <script type="module">을 사용해 ES 모듈로 JavaScript 파일을 로드합니다.

📄 vite.config.js

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
plugins: [vue()],
});
  • Vite 설정 파일입니다.
  • Vue 플러그인을 추가해 Vue 파일을 처리합니다.
  • 프로젝트의 빌드 및 개발 환경을 구성합니다.

📄 package.json

{
"name": "my-vue-app",
"version": "0.0.0",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"vue": "^3.2.47"
},
"devDependencies": {
"@vitejs/plugin-vue": "^4.0.0",
"vite": "^4.0.0"
}
}
  • 프로젝트의 메타데이터와 의존성을 관리합니다.
  • 중요한 스크립트:
    • dev: 개발 서버를 실행합니다.
    • build: 애플리케이션을 프로덕션 용도로 번들링합니다.
    • preview: 로컬에서 빌드된 애플리케이션을 미리 봅니다.

📄 .gitignore

/node_modules/
/dist/
.env
  • Git에 포함되지 않아야 하는 파일과 폴더를 정의합니다.
  • 주요 내용:
    • node_modules: 설치된 의존성 파일들이 포함된 폴더로, 다시 설치할 수 있으므로 Git에 포함하지 않습니다.
    • dist: 빌드된 결과물 폴더로, 프로덕션에만 배포하며 Git에서는 제외합니다.
    • .env: 환경 변수 파일로, 민감한 정보(API 키 등)가 포함될 수 있어 보안상 제외합니다.

 

반응형

'개발 부트캠프 > 프론트엔드' 카테고리의 다른 글

[Vue] Pinia (State Manager)  (1) 2024.12.26
[Vue] Props & Emit  (0) 2024.12.24
[Vue] 조건문&반복문 (v-if, v-for)  (0) 2024.12.23
[Vue] 데이터 바인딩(Data Binding)  (0) 2024.12.23
[Vue] 뷰 라우터(Vue Router)  (2) 2024.12.23

+ Recent posts