--- title: Vue 인스턴스 type: guide order: 3 --- ## Vue 인스턴스 만들기 모든 Vue 앱은 `Vue` 함수로 새 **Vue 인스턴스**를 만드는 것부터 시작합니다. ```js var vm = new Vue({ // 옵션 }) ``` 엄격히 [MVVM 패턴](https://en.wikipedia.org/wiki/Model_View_ViewModel)과 관련이 없지만 Vue의 디자인은 부분적으로 그것에 영감을 받았습니다. 관례적으로, Vue 인스턴스를 참조하기 위해 종종 변수 `vm`(ViewModel의 약자)을 사용합니다. Vue 인스턴스를 생성할 때는 **options 객체**를 전달해야 합니다. 이 가이드는 대부분 원하는 생성을 구현할 때 이런 옵션들을 사용하여 원하는 동작을 구현하는 방법에 대해 다룹니다. 전체 옵션 목록은 [API reference](../api/#Options-Data)에서 확인할 수 있습니다. Vue 앱은 `new Vue`를 통해 만들어진 `루트 Vue 인스턴스`로 구성되며 선택적으로 중첩이 가능하고 재사용 가능한 컴포넌트 트리로 구성됩니다. 예를 들어 Todo 앱의 컴포넌트 트리는 다음과 같습니다. ``` Root Instance └─ TodoList ├─ TodoItem │ ├─ DeleteTodoButton │ └─ EditTodoButton └─ TodoListFooter ├─ ClearTodosButton └─ TodoListStatistics ``` 나중에 [컴포넌트 시스템](components.html)에 대해 자세히 설명합니다. 지금은 모든 Vue 컴포넌트가 본질적으로 확장된 Vue 인스턴스이기에 모두 같은 옵션 객체(몇 가지 루트 인스턴스 전용 옵션 제외)를 전달해야 하는 것만 알면 됩니다. ## 데이터와 메소드 Vue 인스턴스가 생성될 때 `data` 객체에 있는 모든 속성이 Vue의 **반응형 시스템**에 추가됩니다. 각 속성값이 변경될 때 뷰가 "반응"하여 새로운 값과 일치하도록 업데이트됩니다. ``` js // 데이터 객체 var data = { a: 1 } // Vue인스턴스에 데이터 객체를 추가합니다. var vm = new Vue({ data: data }) // 인스턴스에 있는 속성은 // 원본 데이터에 있는 값을 반환합니다. vm.a === data.a // => true // 인스턴스에 있는 속성값을 변경하면 // 원본 데이터에도 영향을 미칩니다. vm.a = 2 data.a // => 2 // ... 반대로 마찬가지입니다. data.a = 3 vm.a // => 3 ``` 데이터가 변경되면 화면은 다시 렌더링됩니다. 유념할 점은, `data`에 있는 속성들은 인스턴스가 생성될 때 존재한 것들만 **반응형**이라는 것입니다. 즉, 다음과 같이 새 속성을 추가하면: ```js vm.b = 'hi' ``` `b`가 변경되어도 화면이 갱신되지 않습니다. 어떤 속성이 나중에 필요하다는 것을 알고 있으며, 빈 값이거나 존재하지 않은 상태로 시작한다면 아래와 같이 초기값을 지정할 필요가 있습니다. ```js data: { newTodoText: '', visitCount: 0, hideCompletedTodos: false, todos: [], error: null } ``` 여기에서 유일한 예외는 `Object.freeze ()`를 사용하는 경우입니다. 이는 기존 속성이 변경되는 것을 막아 반응성 시스템이 추적할 수 없다는 것을 의미합니다. ```js var obj = { foo: 'bar' } Object.freeze(obj) new Vue({ el: '#app', data: obj }) ``` ```html
{{ foo }}
options 속성이나 콜백에 created: () => console.log(this.a)
이나 vm.$watch('a', newValue => this.myMethod())
와 같은 화살표 함수 사용을 지양하기 바랍니다.
화살표 함수는 this
를 가지지 않기 때문에 화살표 함수에서의 this
는 다른 변수로 취급되거나 렉시컬하게 호출한 변수를 발견할 때까지 부모 스코프에서 해당 변수를 찾습니다. 이 때문에 Uncaught TypeError: Cannot read property of undefined
또는 Uncaught TypeError: this.myMethod is not a function
와 같은 오류가 발생하게 됩니다.