Vue(/vjuː/ 로 발음, view 와 발음이 같습니다.)는 사용자 인터페이스를 만들기 위한 진보적인 프레임워크 입니다. 다른 단일형 프레임워크와 달리 Vue는 점진적으로 채택할 수 있도록 설계하였습니다. 핵심 라이브러리는 뷰 레이어만 초점을 맞추어 다른 라이브러리나 기존 프로젝트와의 통합이 매우 쉽습니다. 그리고 Vue는 현대적 도구 및 지원하는 라이브러리와 함께 사용한다면 정교한 단일 페이지 응용프로그램을 완벽하게 지원할 수 있습니다.
숙련된 프론트엔드 개발자이고 Vue를 다른 라이브러리/프레임워크와 비교하고 싶다면 다른 프레임워크와의 비교를 확인하십시오.
공식 가이드는 HTML, CSS 및 JavaScript에 대한 중간 수준의 지식을 전제로 합니다. 프론트 엔드 개발에 완전히 익숙하지 않다면 첫 번째 단계로 프레임워크를 시작하는 것은 좋은 생각이 아닙니다. 기본을 파악한 다음 다시 해보세요! 다른 프레임워크에 대한 사전 경험이 도움 되지만 필수는 아닙니다.
Vue.js를 시험해 볼 수 있는 가장 쉬운 방법은 JSFiddle Hello World 예제를 사용하는 것입니다. 다른 탭에서 자유롭게 열어 본 후 몇 가지 기본 예제를 따라가십시오. 또는 단순히 index.html 파일을 만들고 Vue를 다음과 같이 포함할 수 있습니다.
Vue.js의 핵심은 간단한 템플릿 구문을 사용해 선언적으로 DOM에 데이터를 렌더링하는 것입니다.
<divid="app"> {{ message }} </div>
var app = new Vue({ el: '#app', data: { message: '안녕하세요 Vue!' } })
안녕하세요 Vue!
우리는 이미 첫 Vue 앱을 만들었습니다! 문자열 템플릿을 렌더링하는 것과 매우 유사하지만 사실 Vue는 더 많은 작업을 합니다. 데이터와 DOM이 연결되어 이제 모든 것이 반응형입니다. 어떻게 알 수 있을까요? 브라우저의 JavaScript 콘솔을 열고 app.message를 다른 값으로 설정해 보십시오. 그에 따라 렌더링 된 예제를 볼 수 있습니다.
텍스트 보간 이외에도 다음과 같은 엘리먼트 속성을 바인딩할 수 있습니다.
<divid="app-2"> <spanv-bind:title="message"> 내 위에 잠시 마우스를 올리면 동적으로 바인딩 된 title을 볼 수 있습니다! </span> </div>
var app2 = new Vue({ el: '#app-2', data: { message: '이 페이지는 ' + newDate() + ' 에 로드 되었습니다' } })
내 위에 마우스를 올리면 동적으로 바인딩 된 title을 볼 수 있습니다!
여기서 우리는 새로운 곳에 다다랐습니다. v-bind 속성은 디렉티브 이라고 합니다. 디렉티브는 Vue에서 제공하는 특수 속성임을 나타내는 v- 접두어가 붙어있으며 사용자가 짐작할 수 있듯 렌더링 된 DOM에 특수한 반응형 동작을 합니다. 기본적으로 “이 요소의 title 속성을 Vue 인스턴스의 message 속성으로 최신 상태를 유지 합니다.”
JavaScript 콘솔을 다시 열고 app2.message = '새로운 메시지'라고 입력하면 HTML(이 경우에 title 속성)이 업데이트되었음을 다시 한번 확인할 수 있습니다.
컴포넌트 시스템은 Vue의 또 다른 중요한 개념입니다. 이는 작고 그 자체로 제 기능을 하며 재사용할 수 있는 컴포넌트로 구성된 대규모 응용 프로그램을 구축할 수 있게 해주는 추상적 개념입니다. 생각해보면 거의 모든 유형의 응용 프로그램 인터페이스를 컴포넌트 트리로 추상화할 수 있습니다.
Vue에서, 컴포넌트는 본질적으로 미리 정의된 옵션을 가진 Vue 인스턴스 입니다. Vue에서 컴포넌트를 등록하는 방법은 간단합니다.
// todo-item 이름을 가진 컴포넌트를 정의합니다 Vue.component('todo-item', { template: '<li>할일 항목 하나입니다.</li>' })
이제 다른 컴포넌트의 템플릿에서 이 컴포넌트를 사용할 수 있습니다.
<ol> <!-- todo-item 컴포넌트의 인스턴스 만들기 --> <todo-item></todo-item> </ol>
그러나 이는 모든 할 일 인스턴스에 똑같은 내용을 렌더링할 것입니다. 이래서는 무언가가 부족합니다. 부모 영역의 데이터를 자식 컴포넌트에 집어넣을 수 있어야겠습니다. prop을 전달받을 수 있도록 할 일 컴포넌트의 정의를 수정해봅시다.
Vue.component('todo-item', { // 이제 todo-item 컴포넌트는 "prop" 이라고 하는 // 사용자 정의 속성 같은 것을 입력받을 수 있습니다. // 이 prop은 todo라는 이름으로 정의했습니다. props: ['todo'], template: '<li>{{ todo.text }}</li>' })
이제 이 todo를 v-bind를 사용하여 각각의 반복되는 컴포넌트에 전달할 수 있습니다.
<divid="app-7"> <ol> <!-- 이제 각 todo-item 에 todo 객체를 제공합니다. 화면에 나오므로, 각 항목의 컨텐츠는 동적으로 바뀔 수 있습니다. 또한 각 구성 요소에 "키"를 제공해야합니다 (나중에 설명 됨). --> <todo-item v-for="item in groceryList" v-bind:todo="item" v-bind:key="item.id"> </todo-item> </ol> </div>
var app7 = new Vue({ el: '#app-7', data: { groceryList: [ { id: 0, text: 'Vegetables' }, { id: 1, text: 'Cheese' }, { id: 2, text: 'Whatever else humans are supposed to eat' } ] } })
Vegetables
Cheese
Whatever else humans are supposed to eat
이것은 인위적으로 만든 예시이지만, 우리는 앱을 두 개의 더 작은 단위로 나눌 수 있었고, 자식을 props 인터페이스를 통하여 부모로부터 합리적인 수준으로 분리할 수 있었습니다. 이제 앞으로는 부모 앱에 영향을 주지 않으면서 <todo-item> 컴포넌트를 더 복잡한 템플릿과 로직으로 더욱 향상시킬 수 있을 것입니다.
대규모 응용 프로그램에서는 개발 과정을 관리할 수 있는 수준 하에 두기 위해 전체 앱을 컴포넌트로 나누는 것이 필수적입니다. 나중에 이 가이드에서 컴포넌트에 대해 더 많은 이야기를 나누겠습니다. 하지만 여기서는 컴포넌트를 사용한 앱의 모습이 어떻게 구성될지에 대한 (상상의) 예를 제시하겠습니다.
Vue 컴포넌트는 Web Components Spec의 일부인 사용자 지정 엘리먼트 와 매우 유사하다는 것을 눈치 챘을 수 있습니다. Vue의 컴포넌트 구문은 스펙 이후 느슨하게 모델링 되었기 때문입니다. 예를 들어 Vue 컴포넌트는 Slot API와 is 특수 속성을 구현합니다. 그러나 몇가지 중요한 차이가 있습니다.
Web Components Spec은 여전히 초안이며 모든 브라우저에서 기본적으로 구현되지 않습니다. 이에 비해 Vue 컴포넌트는 지원되는 모든 브라우저 (IE 9 이상)에서 폴리필을 필요로 하지 않으며 일관되게 작동합니다. 필요한 경우 Vue 컴포넌트는 기본 사용자 정의 엘리먼트 내에 래핑할 수 있습니다.
Vue 컴포넌트는 일반 사용자 정의 엘리먼트에서 사용할 수 없는 중요한 기능을 제공합니다. 특히 컴포넌트 데이터 흐름, 사용자 지정 이벤트 통신 및 빌드 도구 통합이 중요합니다.
에뮬레이터? 보통 앱을 하나 만들어서 테스트할 때 만든 앱을 자신의 스마트폰에 설치해서 돌려보는 것이 일반적이다. 하지만 또 다른 방법이 있는데, 컴퓨터로 가상의 스마트폰을 조작하는 것이다. 이 때 필요한 것이 에뮬레이터다. 안드로이드 스튜디오에 탑재된 에뮬레이터를 써도되고, 별도의 에뮬레이터 프로그램을 구글에서 검색하여 설치해서 써도 된다.(블루 스택 등) 에뮬레이터의 장점은 알다시피 스마트폰이 필요없다는 것에 있다. 하지만 단점도 존재하는데, 컴퓨터 사양에 따라 구동속도가 느리고, 때에 따라선 오동작도 심하고, 개발한 앱이 전혀 문제가 없음에도 불구하고 에뮬레이터 자체 문제로 인해 앱의 문제로 오인하는 경우도 발생한다. 그래서 필자는 에뮬레이터 쓰는 것을 그리 찬성하지 않는다. 하지만 실제로 쓰는 것의 별도로 알고 있는 것과 모르고 있는 것의 차이가 있어 이번 장에 언급하기로 결정했다. 에뮬레이터 설정 안드로이드 스튜디오 상단 툴바에 보면 [AVD Manager]이라는 아이콘을 클릭한다
이미 한개의 에뮬레이터가 만들어진 것을 볼 수 있다. 우리는 새로운 것을 만들 것이다. 화면 왼쪽 하단의 + Create Virtual Device... 버튼을 클릭한다
Select Hardware 화면이다. 어떤 기기를 가상 스마트폰으로 만들 것인지 물어보는 것이다. 이미 기본으로 Phone 과 Nexus 5 가 디폴트(기본)로 선택되어졌을 것이다. Next 버튼을 클릭해서 넘어간다.
System Image 화면이다. ABI 값이 x86_64 (윈도우 32비트 사용자는 x64를 선택), Target 값은 Android 5.0 (with Google APIs) 인 3번째 이미지를 선택하고 Next 버튼을 클릭한다
AVD Name 을 정해줘야 하는데, 그냥 건들지 말고 Finish 버튼을 누른다
자, 자신이 새로 만든 에뮬레이터가 목록 맨 위에 위치한 것을 화면을 통해 알 수 있다. 바로 목록에서 자신이 만든 가상 머신을 더블 클릭한다. 또는 자신이 만든 에뮬레이터 항목 맨 오른쪽에 재생버튼(▶)을 클릭한다
자신의 컴퓨터 사양에 따라 대략 1분~10분 사이에 아래 화면과 같이 작동하는 것을 볼 수 있다. 이것은 말 그대로 가상의 스마트폰이라 자신이 설치한 앱을 실행해 볼 수 있고, 인터넷도 가능한 가상 머신이다. (먼저 잠금해제해야 한다. 화면 하단의 Charging 쪽을 마우스 왼쪽버튼을 누른상태에서 위로 밀어서 해제) 다만, 알다시피 우리는 앱 하나 테스트하는데 1분 이상 시간을 낭비할 수 없다. 도저히 환경이 구비되지 않는 경우(스마트폰이 없다던지)를 제외하고서는 그냥 자신의 스마트폰을 가지고 테스트하기를 권유한다.
여기까지 왔으니 저번 시간에 Hello World 앱을 실행해보자. 안드로이드 스튜디오 화면에서 재생 버튼Run 'app' (Shift + F10) 을 누른다
앱을 실행할 장치를 고르는 화면이 나타나고, 기본적으로 Launch emulator (에뮬레이터 접근) 에 마킹되어 있다. 디바이스 이름(자신이 만든 것이 맞는지)을 확인 후, OK 버튼을 누른다
아까보다 조금 적은 시간이 걸리고(한번 에뮬레이터를 실행하면 이후 실행 시간은 단축된다) 위의 가상 머신 화면이 뜬다. 위에 설명대로 마우스로 잠금해제하면 아래 화면과 같이 앱 실행 화면을 볼 수 있다
실제 이 앱은 단말기에 넣어도 정상작동하는 앱이다. 안드로이드 스튜디오는 이처럼 초간단하게 앱을 만들수 있는 도구다.