300===Dev Framework/VueJS

Vue2 기초 개념 완벽 가이드 😎

블로글러 2024. 11. 18. 17:50

안녕하세요! 오늘은 Vue2의 핵심 기초 개념들을 쉽고 재미있게 설명해드리려고 해요. Vue2를 한마디로 정의하자면, 사용자 인터페이스(UI)를 만들기 위한 JavaScript 프레임워크입니다.
만약 여러분이 레고 블록을 맞추듯이 원하는 웹 애플리케이션을 조립해나갈 수 있다면 얼마나 편리할까요? Vue2는 그런 꿈을 실현해주는 강력하고 직관적인 도구랍니다.


1. Vue2란? 🤔

Vue2는 "점진적 프레임워크(Progressive Framework)"라는 별칭을 가지고 있어요. 이는 기존 프로젝트에 조금씩 도입할 수 있다는 뜻입니다.
예를 들어, 완전히 새로운 프로젝트를 시작하지 않아도, 현재의 웹 페이지나 앱의 특정 영역을 Vue로 먼저 구축해볼 수 있죠.

🔹 Vue2의 주요 특징

  1. 점진적 도입 가능:
    • 처음엔 Vue를 통해 간단한 버튼 클릭 이벤트나 작은 위젯만 만들어볼 수 있어요.
    • 점차 Vue의 사용 범위를 확장해나가며 전반적인 애플리케이션을 Vue로 전환할 수 있습니다.
  2. 반응형 데이터(리액티브 시스템):
    • Vue는 데이터가 변경되면 화면(HTML)이 자동으로 업데이트되는 구조를 가지고 있어요.
    • 예를 들어, message라는 변수를 변경하면, 그 변수를 사용한 UI 요소들이 실시간으로 변경 사항을 반영합니다.
  3. 컴포넌트 기반 아키텍처:
    • UI를 독립적인 ‘블록’(컴포넌트) 단위로 쪼개서 개발할 수 있습니다.
    • 이를 통해 재사용 가능하고, 유지보수가 쉬운 코드 구조를 만들 수 있습니다.

2. 어떻게 동작하나요? 🎬

1) Vue 인스턴스 생성하기

Vue 애플리케이션은 기본적으로 Vue 인스턴스부터 시작합니다. 아래와 같은 형태로 인스턴스를 생성합니다.

const app = new Vue({
  el: '#app',
  data: {
    message: '안녕하세요!'
  },
  methods: {
    sayHi() {
      alert(this.message)
    }
  }
})
  • el: Vue가 어떤 DOM 요소를 제어할지 선택하는 옵션입니다. 예: '#app'
  • data: 화면에서 사용하고자 하는 상태(state)를 정의합니다.
  • methods: UI에서 발생하는 이벤트를 처리할 함수를 정의합니다.

2) 핵심 문법 요소 📝

Vue2에서 자주 사용하는 템플릿 문법을 살펴보겠습니다.

(1) 데이터 바인딩

  • 텍스트 바인딩
    <div>{{ message }}</div>
    message라는 data 속성 값을 HTML에 바로 삽입합니다.
  • 속성 바인딩
    <img v-bind:src="imageUrl">
    <!-- 축약형 -->
    <img :src="imageUrl">
    HTML 태그의 속성(attribute)에 JavaScript 데이터를 연결할 때 v-bind:(또는 :)를 사용합니다.

(2) 디렉티브 사용하기

Vue에서는 v- 접두사를 가진 디렉티브를 통해 강력한 기능을 제공합니다.

  • 조건부 렌더링: v-if, v-else-if, v-else
    <p v-if="seen">이제 나를 볼 수 있어요</p>
    seentrue일 때만 <p> 태그가 화면에 나타납니다.
  • 반복 렌더링: v-for
    <ul>
      <li v-for="item in items" :key="item.id">
        {{ item.text }}
      </li>
    </ul>
    items 배열을 순회하며 여러 <li> 요소를 동적으로 생성합니다.
  • 이벤트 핸들링: v-on
    <button v-on:click="doSomething">클릭하세요</button>
    <!-- 축약형 -->
    <button @click="doSomething">클릭하세요</button>
    버튼 클릭 시 doSomething 메서드를 실행합니다.

3) computed와 watch 🔄

Vue에서는 반응형 데이터를 더욱 편리하게 다루기 위해 계산된 속성(computed)감시자(watch)를 제공합니다.

export default {
  data() {
    return {
      firstName: '길동',
      lastName: '홍'
    }
  },
  computed: {
    // 계산된 속성
    fullName() {
      return this.lastName + ' ' + this.firstName
    }
  },
  watch: {
    // 데이터 감시
    firstName(newValue, oldValue) {
      console.log('이름이 변경되었습니다:', oldValue, '->', newValue)
    }
  }
}
  • computed:
    • 종속된 데이터가 변경될 때만 자동으로 다시 계산되어, 캐싱 기능을 제공합니다.
    • 예를 들어, fullNamefirstName 혹은 lastName이 변경될 때만 재계산됩니다.
  • watch:
    • 특정 데이터가 변경될 때마다 추가 로직을 수행하고 싶을 때 사용합니다.
    • 파일 업로드와 같은 무거운 작업이나 API 호출 타이밍 등을 제어하기에 유용합니다.

3. 컴포넌트 시스템 🎨

Vue의 진정한 힘은 컴포넌트를 활용할 때 발휘됩니다. 컴포넌트는 UI를 여러 블록으로 쪼개고 독립적으로 개발, 유지보수할 수 있게 해줍니다.

1) 컴포넌트 등록

Vue.component('my-component', {
  template: '<div>커스텀 컴포넌트입니다!</div>'
})
  • 'my-component': 컴포넌트의 이름(커스텀 태그)입니다.
  • template: 해당 컴포넌트가 렌더링될 HTML 구조를 정의합니다.

2) Props 전달

컴포넌트 간 데이터를 주고받을 때는 Props를 사용합니다.

Vue.component('child', {
  props: ['message'],
  template: '<span>{{ message }}</span>'
})
<child message="안녕하세요!"></child>
  • 부모 컴포넌트에서 자식 컴포넌트로 문자열, 숫자, 객체 등 다양한 형태의 데이터 전달이 가능합니다.

3) 이벤트 발신 (자식 → 부모)

자식 컴포넌트가 이벤트를 통해 부모에게 메시지를 전달할 수 있습니다.

// 자식 컴포넌트
methods: {
  notify() {
    this.$emit('alert', '자식이 부모에게 알립니다!')
  }
}
<!-- 부모 컴포넌트 -->
<child @alert="handleAlert"></child>
  • this.$emit('이벤트명', 전달할 데이터) 형태로 자식 → 부모 통신을 구현합니다.
  • 부모 컴포넌트에서는 @alert="handleAlert"와 같이 이벤트를 청취(listen)할 수 있습니다.

4. 생명주기 훅 🌱

Vue 인스턴스 또는 컴포넌트는 생성 → 마운트 → 업데이트 → 소멸이라는 과정을 거칩니다. Vue에서는 각 단계마다 특정 함수를 호출할 수 있도록 생명주기 훅(Lifecycle Hooks)을 제공합니다.

export default {
  beforeCreate() {
    console.log('인스턴스 초기화 전')
  },
  created() {
    console.log('인스턴스 생성됨')
  },
  mounted() {
    console.log('DOM에 마운트됨')
  },
  updated() {
    console.log('데이터 변경으로 재렌더링됨')
  },
  destroyed() {
    console.log('인스턴스 제거됨')
  }
}
  1. beforeCreate: data, methods 등 아직 초기화되지 않은 단계
  2. created: 인스턴스가 생성된 직후, data와 methods에 접근 가능
  3. mounted: DOM에 컴포넌트가 실제로 삽입된 뒤
  4. updated: 반응형 데이터의 변경으로 DOM이 업데이트된 후
  5. destroyed: 컴포넌트가 DOM에서 제거된 후

각 훅을 적절히 활용해 API 호출 시점이나 이벤트 등록/해제, 메모리 정리 등을 수행할 수 있습니다.


5. 실전 사용 예시 💫

Vue를 이용한 가장 기본적인 “할 일 목록(To-Do)” 예시를 살펴봅시다.

<div id="todo-app">
  <input v-model="newTodo" @keyup.enter="addTodo">
  <button @click="addTodo">추가</button>

  <ul>
    <li v-for="todo in todos" :key="todo.id">
      {{ todo.text }}
      <button @click="removeTodo(todo.id)">삭제</button>
    </li>
  </ul>
</div>
new Vue({
  el: '#todo-app',
  data: {
    newTodo: '',
    todos: []
  },
  methods: {
    addTodo() {
      if (this.newTodo.trim()) {
        this.todos.push({
          id: Date.now(),
          text: this.newTodo
        })
        this.newTodo = ''
      }
    },
    removeTodo(id) {
      this.todos = this.todos.filter(todo => todo.id !== id)
    }
  }
})
  • v-model: 양방향 데이터 바인딩을 손쉽게 구현할 수 있는 디렉티브입니다.
  • @keyup.enter="addTodo": 엔터 키를 눌렀을 때 addTodo 함수를 실행합니다.
  • this.todos.push(...): 새로운 할 일을 리스트에 추가합니다.
  • this.todos.filter(...): 클릭된 항목을 제외하여 목록을 갱신합니다.

6. 주요 장점 🌟

  1. 러닝 커브(Learning Curve)가 낮음
    • 다른 프레임워크에 비해 진입 장벽이 낮고, HTML/CSS/JS 지식만 있어도 쉽게 시작할 수 있습니다.
  2. 컴포넌트 기반 개발
    • 재사용성과 유지보수가 용이해 대규모 프로젝트에서도 생산성을 높일 수 있습니다.
  3. 뛰어난 반응형 시스템
    • 데이터 변경 시 DOM 업데이트가 자동으로 이뤄져, 개발자가 직접 DOM을 조작해야 하는 부담이 줄어듭니다.
  4. 점진적 확장성
    • Vue Router(라우팅), Vuex(상태 관리), Vue CLI(프로젝트 초기 세팅) 등 다양한 생태계 툴을 필요에 따라 도입할 수 있습니다.

7. 주의할 점 ⚠️

  1. 반응형 한계
    • Vue는 객체에 새로운 속성을 추가하거나 삭제하는 경우 이를 즉시 감지하지 못합니다.
    • 이를 위해 Vue.set(obj, 'newProp', value) 또는 Vue.delete(obj, 'prop')를 사용해야 합니다.
    • 배열을 인덱스로 직접 수정(예: this.items[0] = ...)하면 반응형이 깨질 수 있으니 this.$set(this.items, 0, 새값)을 사용합니다.
  2. Props의 단방향 데이터 흐름
    • 자식 컴포넌트에서 받은 props를 직접 수정하지 마세요.
    • 데이터 흐름의 일관성을 유지하기 위해 이벤트를 통해 부모와 소통하는 것이 좋습니다.
  3. 프로덕션 환경에 맞는 빌드와 최적화
    • 개발 모드에서는 Vue가 다양한 경고와 디버그 기능을 제공하지만, 프로덕션 배포 시에는 빌드 과정에서 경고 제거최적화가 필요합니다.

8. 성능 최적화 팁 🚀

  1. v-show vs v-if
    • 빠르게 토글되어야 하는 요소에는 v-show를 사용하세요.
    • 조건이 거의 바뀌지 않는 요소라면 v-if를 사용하는 것이 렌더링 낭비를 줄일 수 있습니다.
  2. key 속성 활용
    • v-for로 리스트를 렌더링할 때 고유한 key를 지정하세요.
    • DOM 재사용 최적화를 통해 빠른 렌더링이 가능합니다.
  3. 라이프사이클 훅에서 불필요한 작업 자제
    • mountedupdated 등의 훅에서 너무 무거운 연산을 하면 전체 렌더링 성능에 악영향을 줄 수 있습니다.
  4. 빌드 환경에서의 최적화
    • Webpack, Vue CLI 등으로 코드 스플리팅(Code Splitting)과 트리 셰이킹(Tree Shaking)을 활용하세요.
    • 필요 없는 코드나 라이브러리를 제거해 애플리케이션 크기를 줄일 수 있습니다.

9. 마치며 🎁

지금까지 Vue2의 핵심 기초 개념들을 살펴보았습니다. Vue2는 직관적인 문법반응형 데이터를 통해 초보자부터 숙련 개발자까지 모두에게 편리함을 제공하는 멋진 프레임워크입니다.
이 기술을 사용하면 개발 속도를 높이고, 유지보수하기 쉬운 UI를 빠르게 만들 수 있어요! 작은 규모의 프로젝트부터 대규모 애플리케이션까지, 단계적으로 Vue2를 도입해보시길 추천드립니다.


참고 자료 및 출처

Vue2를 마스터하면, 더 나아가 Vue3나 Nuxt.js 같은 확장 기술에도 쉽게 적응할 수 있을 거예요.
앞으로도 계속 발전하는 Vue 생태계에서 흥미로운 도전을 이어나가시길 바랍니다!

728x90