What is Vue
작성일 : 2024.11.13
목차
- Vue.js 소개
- Vue.js vs React: 프레임워크 비교 분석
- Vue.js의 핵심 개념
- Vue.js 컴포넌트 생명주기
- Options API vs Composition API
- Vue.js 상태 관리
- 성능 최적화 전략
- 보안 고려사항
- 실전 활용 시나리오
1. Vue.js 소개
Vue.js는 사용자 인터페이스를 구축하기 위한 프로그레시브 JavaScript 프레임워크입니다. '프로그레시브'라는 단어는 Vue.js의 핵심 철학을 잘 나타내는데, 이는 필요에 따라 점진적으로 적용할 수 있다는 의미입니다.
1.1 주요 특징
- 점진적 프레임워크: 기존 프로젝트에 부분적으로 적용 가능
- 반응형 데이터 바인딩: 데이터 변경 시 자동 UI 업데이트
- 컴포넌트 기반 아키텍처: 재사용 가능한 UI 컴포넌트
- Virtual DOM: 효율적인 렌더링 성능
- 유연한 생태계: 코어 라이브러리와 지원 라이브러리로 구성
1.2 기술 스택 구성
Vue.js 코어
├── Vue Router (라우팅)
├── Vuex/Pinia (상태 관리)
├── Vue CLI (개발 도구)
└── Vue DevTools (디버깅 도구)
2. Vue.js vs React: 프레임워크 비교 분석
2.1 Vue.js의 강점
-
낮은 진입 장벽
- HTML, CSS, JavaScript 기본 지식만으로 시작 가능
- 직관적인 템플릿 문법
- 상세한 공식 문서
-
유연한 통합
- 기존 프로젝트에 점진적 적용 가능
- CDN 방식부터 SPA까지 다양한 적용 방식
- 서드파티 라이브러리와의 호환성
-
성능
- 작은 번들 사이즈 (약 20KB gzipped)
- 효율적인 메모리 사용
- 빠른 초기 렌더링
2.2 React 대비 한계점
-
생태계 규모
- 더 작은 커뮤니티 크기
- 써드파티 라이브러리 선택의 제한
- 기업용 솔루션 부족
-
타입스크립트 지원
- React보다 덜 성숙한 타입스크립트 통합
- 타입 추론의 제한사항
3. Vue.js의 핵심 개념
3.1 기본 문법
// 컴포넌트 정의
export default {
name: "MyComponent",
// 데이터 속성
data() {
return {
count: 0,
message: "Hello Vue!",
};
},
// 계산된 속성
computed: {
doubleCount() {
return this.count * 2;
},
},
// 감시자
watch: {
count(newVal, oldVal) {
console.log(`Count changed from ${oldVal} to ${newVal}`);
},
},
// 메서드
methods: {
increment() {
this.count++;
},
},
};
3.2 주요 디렉티브
<!-- 데이터 바인딩 -->
<div v-bind:id="dynamicId"></div>
<div :id="dynamicId"></div>
<!-- 축약형 -->
<!-- 이벤트 핸들링 -->
<button v-on:click="handleClick"></button>
<button @click="handleClick"></button>
<!-- 축약형 -->
<!-- 양방향 바인딩 -->
<input v-model="message" />
<!-- 조건부 렌더링 -->
<div v-if="isVisible">조건부 내용</div>
<div v-else>대체 내용</div>
<!-- 리스트 렌더링 -->
<ul>
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
4. Vue.js 컴포넌트 생명주기

4.1 생명주기 훅 상세 설명
-
생성 단계
beforeCreate: 컴포넌트 초기화 시작created: 반응형 데이터 설정 완료
-
마운트 단계
beforeMount: DOM 삽입 직전mounted: DOM 삽입 완료
-
업데이트 단계
beforeUpdate: 데이터 변경, DOM 패치 전updated: DOM 패치 완료
-
제거 단계
beforeUnmount: 컴포넌트 제거 직전unmounted: 컴포넌트 제거 완료
4.2 생명주기 활용 예제
export default {
created() {
// 데이터 초기화, API 호출
this.fetchInitialData();
},
mounted() {
// DOM 조작, 라이브러리 초기화
this.initializeThirdPartyLib();
},
beforeUnmount() {
// 리소스 정리
this.cleanupResources();
},
};
5. Options API vs Composition API
5.1 Options API
전통적인 Vue.js 컴포넌트 작성 방식:
export default {
data() {
return {
userData: null,
};
},
methods: {
async fetchUser() {
this.userData = await api.getUser();
},
},
mounted() {
this.fetchUser();
},
};
5.2 Composition API
Vue 3에서 도입된 새로운 방식:
import { ref, onMounted } from "vue";
export default {
setup() {
const userData = ref(null);
const fetchUser = async () => {
userData.value = await api.getUser();
};
onMounted(() => {
fetchUser();
});
return {
userData,
fetchUser,
};
},
};
6. Vue.js 상태 관리
6.1 Vuex 구조
// store/index.js
import { createStore } from "vuex";
export default createStore({
state: {
count: 0,
},
mutations: {
INCREMENT(state) {
state.count++;
},
},
actions: {
increment({ commit }) {
commit("INCREMENT");
},
},
getters: {
doubleCount: (state) => state.count * 2,
},
});
6.2 Pinia (Vue 3 권장 상태 관리)
import { defineStore } from "pinia";
export const useCounterStore = defineStore("counter", {
state: () => ({
count: 0,
}),
actions: {
increment() {
this.count++;
},
},
getters: {
doubleCount: (state) => state.count * 2,
},
});
7. 성능 최적화 전략
7.1 컴포넌트 최적화
- keep-alive 사용
<keep-alive>
<component :is="currentComponent" />
</keep-alive>
- 지연 로딩
const MyComponent = () => import("./MyComponent.vue");
- computed 속성 활용
computed: {
expensiveOperation() {
return this.items.filter(/* 복잡한 연산 */)
}
}
7.2 렌더링 최적화
- v-show vs v-if
<!-- 자주 토글되는 경우 -->
<div v-show="isVisible">자주 변경되는 내용</div>
<!-- 거의 변경되지 않는 경우 -->
<div v-if="isVisible">거의 변경되지 않는 내용</div>
- key 속성 최적화
<template v-for="item in items" :key="item.id">
<MyComponent :data="item" />
</template>
8. 보안 고려사항
8.1 XSS 방어
- 템플릿 이스케이핑
<!-- 안전 -->
<div>{{ userInput }}</div>
<!-- 위험 -->
<div v-html="userInput"></div>
- CSP 설정
// vue.config.js
module.exports = {
chainWebpack: (config) => {
config.plugin("html").tap((args) => {
args[0].CSP = true;
return args;
});
},
};
8.2 데이터 검증
props: {
userId: {
type: Number,
required: true,
validator: function(value) {
return value > 0
}
}
}
9. 실전 활용 시나리오
9.1 적합한 사용 케이스
-
중소규모 웹 애플리케이션
- 관리자 대시보드
- 이커머스 플랫폼
- 소셜 미디어 애플리케이션
-
점진적 마이그레이션이 필요한 프로젝트
- 레거시 jQuery 애플리케이션
- 모놀리식 백엔드 템플릿
-
빠른 프로토타이핑
- MVP 개발
- 프루프 오브 컨셉
9.2 실제 구현 예시
// 실용적인 컴포넌트 구조
├── components/
│ ├── common/
│ │ ├── BaseButton.vue
│ │ ├── BaseInput.vue
│ │ └── BaseModal.vue
│ └── features/
│ ├── UserProfile.vue
│ └── UserSettings.vue
├── views/
│ ├── Home.vue
│ └── Dashboard.vue
└── store/
├── modules/
│ ├── user.js
│ └── settings.js
└── index.js
결론
Vue.js는 현대 웹 개발에서 중요한 위치를 차지하고 있는 프레임워크입니다. 낮은 진입 장벽, 뛰어난 성능, 유연한 확장성을 제공하면서도 강력한 기능을 갖추고 있어 다양한 프로젝트에 적합합니다. 지속적인 발전과 커뮤니티의 성장으로 앞으로도 더욱 발전할 것으로 기대됩니다.