Vue.js๋ ๋ฌด์์ธ๊ฐ?
MVVM ํจํด์ ViewModel ๋ ์ด์ด์ ํด๋นํ๋ ํ๋ฉด๋จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ๊ณผ ํ๋ฉด ๋จ์๋ฅผ ์ปดํฌ๋ํธ ํํ๋ก ์ ๊ณตํ๋ฉฐ, ๊ด๋ จ API ๋ฅผ ์ง์ํ๋๋ฐ์ ๊ถ๊ทน์ ์ธ ๋ชฉ์ ์ด ์์
- Angular์์ ์ง์ํ๋ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์ ๋์ผํ๊ฒ ์ ๊ณต
- ํ์ง๋ง ์ปดํฌ๋ํธ ๊ฐ ํต์ ์ ๊ธฐ๋ณธ ๊ณจ๊ฒฉ์ React์ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ(๋ถ๋ชจ -> ์์)์ ์ฌ์ฉ
- ๋ค๋ฅธ ํ๋ฐํธ์๋ ํ๋ ์์ํฌ(Angular, React)์ ๋น๊ตํ์ ๋ ์๋์ ์ผ๋ก ๊ฐ๋ณ๊ณ ๋น ๋ฆ.
- ๋ฌธ๋ฒ์ด ๋จ์ํ๊ณ ๊ฐ๊ฒฐํ์ฌ ์ด๊ธฐ ํ์ต ๋น์ฉ์ด ๋ฎ๊ณ ๋๊ตฌ๋ ์ฝ๊ฒ ์ ๊ทผ ๊ฐ๋ฅ
MVVM ํจํด์ด๋?
์ํค์ ๋ช ์๋ ๊ฒ์ฒ๋ผ, Backend ๋ก์ง๊ณผ Client ์ ๋งํฌ์ & ๋ฐ์ดํฐ ํํ๋จ์ ๋ถ๋ฆฌํ๊ธฐ ์ํ ๊ตฌ์กฐ๋ก ์ ํต์ ์ธ MVC ํจํด์ ๋ฐฉ์์์ ๊ธฐ์ธํ์๋ค. ๊ฐ๋จํ๊ฒ ์๊ฐํด์ ํ๋ฉด ์๋จ์ ํ๋ฉด ๋์ ๊ด๋ จ ๋ก์ง๊ณผ ๋ท๋จ์ DB ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ์๋ฒ ๋ก์ง์ ๋ถ๋ฆฌํ๊ณ , ๋ท๋จ์์ ๋์ด์จ ๋ฐ์ดํฐ๋ฅผ Model ์ ๋ด์ View ๋ก ๋์ด์ฃผ๋ ์ค๊ฐ ์ง์ ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๊ฒ ๋ค.
Vue.js ์์ํ๊ธฐ
๋ค๋ฅธ ์ฃผ์ ํ๋ฐํธ์๋ ํ๋ ์์ํฌ(Angular, React)์ ๋น๊ตํ์ ๋ ๋ทฐ์ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ ๋ฐ๋ก ์์ํ๊ธฐ๊ฐ ์ ๋ง ์ฝ๋ค๋ ์ ์ด๋ค.
<!DOCTYPE html>
<html>
<head>
<title>Vue.js Sample</title>
</head>
<body>
<div id="app">
{{ message }}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
new Vue({
el: "#app",
data: {
message: "Hello Vue.js!"
}
});
</script>
</body>
</html>
CDN์ผ๋ก ์ฝ๋ ๋ก๊ฒจ์ค๊ณ ๋ฐ๋ก Vue ์ธ์คํด์ค๋ฅผ ํ๋ ์์ฑํ์ฌ ๊ฐ๋จํ ํ์ด์ง๋ฅผ ๋ง๋ค์ด๋ณด์๋ค. ๊ธฐ์กด์ ๊ตฌํ๋ ์์คํ ์ ์ ์ฉํ๊ธฐ๋ ํจ์ฌ ์์ํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
Vue Instance
์ธ์คํด์ค๋ Vue.js๋ก ํ๋ฉด์ ๊ฐ๋ฐํ๊ธฐ ์ํด ๊ผญ ์์ฑํด์ผ ํ๋ ํ์ ๋จ์์ด๋ค.
Vue Instance ์์ฑ์
Vue ์์ฑ์ ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
new Vue({
// instance option properties
});
Vue ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์๋์ ๊ฐ์ด data, template, el, methods, life cycle hook ๋ฑ์ ์ธ์คํด์ค ์ต์ ์์ฑ์ ํฌํจํ ์ ์๋ค.
new Vue({
// instance option properties
template: "",
el: "",
methods: {}
// ...
});
Vue Instance ๋ผ์ดํ์ธ์ดํด ์ด๊ธฐํ
์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋ ์๋์ ์ด๊ธฐํ ์์ ์ ์ํํ๋ค.
- ๋ฐ์ดํฐ ๊ด์ฐฐ
- ํ ํ๋ฆฟ ์ปดํ์ผ
- DOM ์ ๊ฐ์ฒด ์ฐ๊ฒฐ
- ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ DOM ์ ๋ฐ์ดํธ
์ด ์ด๊ธฐํ ์์ ์ธ์๋ ๊ฐ๋ฐ์๊ฐ ์๋ํ๋ ์ปค์คํ ๋ก์ง์ ์๋์ ๊ฐ์ด ์ถ๊ฐํ ์ ์๋ค.
new Vue({
data: {
a: 1
},
created: function() {
// this ๋ vm ์ ๊ฐ๋ฆฌํด
console.log("a is: " + this.a);
}
});
์ created
์ด์ธ์๋ ๋ผ์ดํ์ธ์ดํด ๋จ๊ณ์ ๋ฐ๋ผ mounted
, updated
, destroyed
๋ฑ์ ์ฌ์ฉํ ์ ์๋ค.
์ด ๋ผ์ดํ์ธ์ดํด ์ด๊ธฐํ ๋ฉ์๋๋ก ์ปค์คํ
๋ก์ง์ ์ํํ๊ธฐ ๋๋ฌธ์ ๋ทฐ์์๋ ๋ฐ๋ก Controller๋ฅผ ๊ฐ๊ณ ์์ง ์๋ค.
Vue Components
ํ๋ฉด์ ์์ญ์ ์ผ์ ํ ๋จ์๋ก ์ชผ๊ฐ์ด ์ฌํ์ฉ ๊ฐ๋ฅํ ํํ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ปดํฌ๋ํธ
์ปดํฌ๋ํธ ๋ฑ๋ก์ ์๋์ ๊ฐ์ ์ฝ๋๋ก ์์ฑ ๊ฐ๋ฅํ๋ค.
<div id="app">
<my-component></my-component>
</div>
new Vue({
el: "#app",
// ์ปดํฌ๋ํธ ๋ฑ๋ก ์ฝ๋
components: {
// '์ปดํฌ๋ํธ ์ด๋ฆ': ์ปดํฌ๋ํธ ๋ด์ฉ
"my-component": {
template: "<div>A custom component!</div>"
}
}
});
Global or Local Component
์๋์ ์ปดํฌ๋ํธ ๋ฑ๋ก ๋ฐฉ์์ ์ ์ญ ์ปดํฌ๋ํธ ๋ฑ๋ก ๋ฐฉ์์ด๋ค.
Vue.component('my-component', {
// ์ปดํฌ๋ํธ ๋ด์ฉ
template: '',
...
})
์๋์ ๊ฐ์ด ์ง์ญ ์ปดํฌ๋ํธ๋ก๋ ๋ฑ๋กํ ์ ์๋ค.
var cmp = {
// ์ปดํฌ๋ํธ ๋ด์ฉ
template: '',
...
}
new Vue({
components: {
'my-cmp' : cmp
}
})
๋ถ๋ชจ์ ์์ ์ปดํฌ๋ํธ ๊ด๊ณ
์ปดํฌ๋ํธ ๊ด๊ณ๋์์ ์-ํ ๊ด๊ณ์ ์๋ ์ปดํฌ๋ํธ์ ํต์ ์
- ์์์ ์๋๋ก๋ ๋ฐ์ดํฐ(props)๋ฅผ ๋ด๋ฆฌ๊ณ
- ์๋์์ ์๋ก๋ ์ด๋ฒคํธ๋ฅผ ์ฌ๋ฆฐ๋ค(event emit)
Props
ํ๋กญ์ค๋ ์์ ์ปดํฌ๋ํธ์์ ํ์ ์ปดํฌ๋ํธ๋ก ๋ด๋ฆฌ๋ ๋ฐ์ดํฐ ์์ฑ์ ์๋ฏธํ๋ค. ์ด๋ ๊ฒ ํ๋ ์ด์ ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๊ฐ ์ปดํฌ๋ํธ ์์ฒด์ ์ค์ฝํ๋ฅผ ๊ฐ๊ณ ์์ด ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๊ฐ์ ๋ฐ๋ก ์ฐธ์กฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
<!-- ์์ ์ปดํฌ๋ํธ -->
<div id="app">
<!-- ํ์ ์ปดํฌ๋ํธ์ ์์ ์ปดํฌ๋ํธ๊ฐ ๊ฐ๊ณ ์๋ message๋ฅผ ์ ๋ฌํจ -->
<child-component v-bind:propsdata="message"></child-component>
</div>
// ํ์ ์ปดํฌ๋ํธ
Vue.component("child-component", {
// ์์ ์ปดํฌ๋ํธ์ data ์์ฑ์ธ message๋ฅผ propsdata๋ผ๋ ์์ฑ์ผ๋ก ๋๊ฒจ๋ฐ์
props: ["propsdata"],
template: '<p>{{ propsdata }}</p>'
});
// ์์ ์ปดํฌ๋ํธ
var app = new Vue({
el: "#app",
data: {
message: "Hello Vue! from Parent Component"
}
});
์ฃผ์ํ ์ : props ๋ณ์ ๋ช
์ ์นด๋ฉ ๊ธฐ๋ฒ(aBow)์ผ๋ก ์ ์ํ๋ฉด html ํ๊ทธ์์ ์ฌ์ฉํ ๋๋ ์ผ๋ฐฅ ๊ธฐ๋ฒ(-
)์ผ๋ก ์ ์ธํด์ผ ํ๋ค. ์๋๋ ๋ง์ฝ ํ๋กญ์ค ์์ฑ ๋ช
์ ์นด๋ฉ ๊ธฐ๋ฒ์ธ passedData๋ก ์ ์ธํ์ ๋์ ์ฃผ์ ๋ฉ์์ง
๊ฐ์ ๋ ๋ฒจ์ ์ปดํฌ๋ํธ ๊ฐ ํต์
๋์ผํ ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง ํ์ ์ปดํฌ๋ํธ๋ค ๊ฐ์ ํต์ ์ ์๋์ ๊ฐ์ด ํด์ผ ํ๋ค.
- Child(ํ์) -> Parent(์์) -> Children(ํ์ 2๊ฐ)
์ฐธ๊ณ : ์ปดํฌ๋ํธ ๊ฐ์ ์ง์ ์ ์ธ ํต์ ์ ๋ถ๊ฐ๋ฅํ๋๋ก ๋์ด ์๋๊ฒ Vue ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
Event Bus
์์ - ํ์ ๊ด๊ณ๊ฐ ์๋ ์ปดํฌ๋ํธ ๊ฐ์ ํต์ ์ ์ํด Event Bus๋ฅผ ํ์ฉํ ์ ์๋ค.
Event Bus๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์๋ก์ด ๋ทฐ ์ธ์คํด์ค๋ฅผ ์๋์ ๊ฐ์ด ์์ฑํ๋ค.
// ํ๋ฉด ๊ฐ๋ฐ์ ์ํ ์ธ์คํด์ค์ ๋ค๋ฅธ ๋ณ๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ํ์ฉ
var eventBus = new Vue();
new Vue({
// ...
});
์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํฌ ์ปดํฌ๋ํธ์์ $emit()
ํธ์ถ
eventBus.$emit("refresh", 10);
์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ปดํฌ๋ํธ์์ $on()
์ด๋ฒคํธ ์์
// ์ด๋ฒคํธ ๋ฒ์ค ์ด๋ฒคํธ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ผ์ดํ ์ฌ์ดํด ํจ์์์ ์์
new Vue({
created: function() {
eventBus.$on("refresh", function(data) {
console.log(data); // 10
});
}
});
๋ง์ฝ, eventBus
์ ์ฝ๋ฐฑ ํจ์ ์์์ ํด๋น ์ปดํฌ๋ํธ์ ๋ฉ์๋๋ฅผ ์ฐธ๊ณ ํ๋ ค๋ฉด vm
์ฌ์ฉ
new Vue({
methods: {
callAnyMethod() {
// ...
}
},
created() {
var vm = this;
eventBus.$on("refresh", function(data) {
console.log(this); // ์ฌ๊ธฐ์์ this๋ ์ด๋ฒคํธ ๋ฒ์ค์ฉ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํด
vm.callAnyMethod(); // vm์ ํ์ฌ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํด
});
}
});
Vue Routers
๋ทฐ๋ฅผ ์ด์ฉํ์ฌ ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ ๋ ์ ์ฉํ ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. ๋ทฐ ์ฝ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ง์๋๊ณ ์๋ค.
์ค์น๋ NPM๊ณผ CDN ๋ฐฉ์ ๋ชจ๋ ์ง์ํ๋ค.
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
npm install vue-router --save
๋ผ์ฐํฐ ํน์ฑ
Vue ๋ผ์ฐํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก '๋ฃจํธ URL'/#/'๋ผ์ฐํฐ ์ด๋ฆ'
์ ๊ตฌ์กฐ๋ก ๋์ด ์๋ค.
example.com/#/user
์ฌ๊ธฐ์ โ#โ ๊ฐ์ ์ ์ธํ๊ณ ์ถ์ผ๋ฉด ์๋์ ๊ฐ์ด mode
์์ฑ์ ์ถ๊ฐํ๋ค.
new VueRouter({
mode: "history"
});
Nested Routers
๋ผ์ฐํฐ๋ก ํ๋ฉด์ ์ด๋ํ ๋ ๋ค์คํฐ๋ ๋ผ์ฐํฐ๋ฅผ ์ด์ฉํ์ฌ ์ง์ ๋ ํ์ ์ปดํฌ๋ํธ๋ฅผ ํ์ํ ์ ์๋ค. ์ด ๋ ์ปดํฌ๋ํธ์ ๊ตฌ์กฐ๋ ๊ฐ์ฅ ํฐ ์์์ ์ปดํฌ๋ํธ๊ฐ ํ์์ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๋ Parent - Child
ํํ์ ๊ฐ๋ค.
<!-- localhost:5000 -->
<div id="app">
<router-view></router-view>
</div>
<!-- localhost:5000/home -->
<div>
<p>Main Component rendered</p>
<app-header></app-header>
</div>
// 'localhost:5000/home'์ ์ ๊ทผํ๋ฉด Main๊ณผ Header ์ปดํฌ๋ํธ ๋๋ค ํ์๋๋ค.
{
path : '/home',
component: Main,
children: [
{
path: '/',
component: AppHeader
},
{
path: '/list',
component: List
},
]
}
Named Views
ํน์ URL๋ก ์ด๋ํ์ ๋ ์ฌ๋ฌ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๋์์ ํ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
<div id="app">
<router-view name="appHeader"></router-view>
<router-view></router-view>
<router-view name="appFooter"></router-view>
</div>
{
path : '/home',
// Named Router
components: {
appHeader: AppHeader,
default: Body,
appFooter: AppFooter
}
},
Nested Router vs Named Views
- ํน์ URL์ ์ง์ ๋ 1๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฌ ๊ฐ์ ํ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ ๊ฒ์ Nested Router
- ํน์ URL์ ์ฌ๋ฌ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์์ญ ๋ณ๋ก ์ง์ ํ์ฌ ๋ ๋๋ง ํ๋ ๊ฒ์ Named View
Axios
Vue์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ HTTP ํต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. CDN๊ณผ NPM ์ค์น ๋ฐฉ์์ ๋ชจ๋ ์ง์ํ๋ฉฐ ์ฌ์ฉํ๊ธฐ ์ข์ ์์ฑ๊ณผ API๊ฐ ๋ง๋ค. ๋ฌด์๋ณด๋ค๋ Promise ๊ธฐ๋ฐ์ด๋ผ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ๊ธฐ ์ฉ์ดํ๋ค.
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
npm install axios
์ค์น ํ ์ปดํฌ๋ํธ์์ ์๋์ ๊ฐ์ ์ฝ๋๋ก ์ฌ์ฉํ๋ค.
methods: {
fetchData: function() {
axios.get('URL ์ฃผ์');
}
}
Vue Template
ํ ํ๋ฆฟ์ด๋ ๋ทฐ๋ก ํ๋ฉด์ ์กฐ์ํ๊ธฐ ์ํด ์ ๊ณต๋๋ ๋ฌธ๋ฒ์ด๋ค. ๋ทฐ ์ธ์คํด์ค์์ ๊ด๋ฆฌํ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ์ฐ๊ฒฐํ๋ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ๊ณผ ํ๋ฉด์ ์กฐ์์ ํธํ๊ฒ ํ ์ ์๋ ๋๋ ํฐ๋ธ๋ก ๋๋๋ค.
Data Binding
์ฝง์์ผ ๋ฌธ๋ฒ์ธ โ{{ }}โ๋ฅผ ํ์ฉํ์ฌ ์ธ์คํด์ค์ data, computed, props ์์ฑ์ ์ฐ๊ฒฐํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋จํ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์๋ ํ๋ฉด์ ํ์ํ ์ ์๋ค.
<div>{{ str }}</div>
<div>{{ number + 1 }}</div>
<div>{{ message.split('').reverse().join('') }}</div>
Directive
HTML ํ๊ทธ์ ์์ฑ์ v-
์ ๋์ฌ๊ฐ ๋ถ์ ํน๋ณํ ์์ฑ์ผ๋ก ํ๋ฉด์ DOM ์กฐ์์ ์ฝ๊ฒํ ์ ์๋ ๋ฌธ๋ฒ๋ค์ ์ ๊ณตํ๋ค.
<!-- seen์ ์ง์ ๊ฐ์ ๋ฐ๋ผ p ํ๊ทธ๊ฐ ํ๋ฉด์ ํ์ ๋๋ ๋ฏธํ์ -->
<p v-if="seen">Now you see me</p>
<!-- ํ๋ฉด์ a ํ๊ทธ๋ฅผ ํ์ํ๋ ์์ ์ ๋ทฐ ์ธ์คํด์ค์ url ๊ฐ์ href์ ๋์
-->
<a v-bind:href="url"></a>
<!-- ๋ฒํผ์ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ doSomething์ด๋ผ๋ ๋ฉ์๋๋ฅผ ์คํ -->
<button v-on:click="doSomething"></button>
Filters
ํ๋ฉด์ ํ์๋๋ ํ
์คํธ์ ํ์์ ํธํ๊ฒ ๋ฐ๊ฟ ์ ์๋๋ก ๊ณ ์๋ ๊ธฐ๋ฅ์ด๋ฉฐ |
์ ์ด์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ ํํฐ๋ฅผ ์ ์ฉํ ์ ์๋ค.
<!-- message ๊ฐ์ capitalize ํํฐ๋ฅผ ์ ์ฉํ์ฌ ์ฒซ ๊ธ์๋ฅผ ๋๋ฌธ์๋ก ๋ณ๊ฒฝ -->
{{ message | capitalize }}
new Vue({
filters: {
capitalize: function(value) {
if (!value) return "";
value = value.toString();
return value.charAt(0).toUpperCase() + value.slice(1);
}
}
});
Single File Component
ํน์ ํ๋ฉด ์์ญ์ HTML, CSS, JS ์ฝ๋๋ฅผ ํ ํ์ผ์์ ๊ด๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ. ํ์ผ ํ์ฅ์๋ vue
์ด๋ฉฐ HTML ํ์ผ์์ ๋ทฐ ๊ฐ๋ฐ์ ์งํํ์ ๋์ ํ๊ณ์ ์ ๊ทน๋ณตํ ์ ์๋ ๋ฐฉ๋ฒ์ด๊ธฐ๋ ํ๋ค. ํ๊ณ์ ์ ์๋์ ๊ฐ๋ค.
- ๋ชจ๋ ์ปดํฌ๋ํธ์ ๊ณ ์ ์ ์ด๋ฆ์ ๋ถ์ฌ์ผ ํจ
- js ํ์ผ์์ template ์์ html ์ ๋ฌธ๋ฒ ๊ฐ์กฐ๊ฐ ๋์ง ์์
- js ํ์ผ์์์ css ์คํ์ผ๋ง ์์ ์ด ๊ฑฐ์ ๋ถ๊ฐ
- ES5 ๋ฅผ ์ด์ฉํ์ฌ ๊ณ์ ์ฑ์ ์์ฑํ ๊ฒฝ์ฐ Babel ๋น๋๊ฐ ์ง์๋์ง ์์
์ฑ๊ธ ํ์ผ ์ปดํฌ๋ํธ๋ก ๊ฐ๋ฐํ๋ ค๋ฉด Webpack๊ณผ ๊ฐ์ ๋ฒ๋ค๋ง ๋๊ตฌ๊ฐ ํ์ํ๋ค. ์ฑ๊ธ ํ์ผ ์ปดํฌ๋ํธ์ ๊ธฐ๋ณธ ๊ณจ๊ฒฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
<template>
<!-- HTML -->
</template>
<script>
// Javascript
</script>
<style>
/* CSS */
</style>
Vue Loader
์ฑ๊ธ ํ์ผ ์ปดํฌ๋ํธ๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ์คํํ ์ ์๊ฒ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก ๋ณํํด์ฃผ๋ ์นํฉ ๋ก๋. ๋ทฐ ๋ก๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์๋ค.
- ES6 ์ง์
<style>
๊ณผ<template>
์ ๋ํ ๊ฐ๊ฐ์ ์นํฉ ๋ก๋ ์ง์. ex) sass, jade- ๊ฐ
.vue
์ปดํฌ๋ํธ์ ์ค์ฝํ๋ก ์ขํ css ์คํ์ผ๋ง ์ง์ - ์นํฉ์ ๋ชจ๋ ๋ฒ๋ค๋ง์ ๋ํ ์ง์๊ณผ ์์กด์ฑ ๊ด๋ฆฌ๊ฐ ์ ๊ณต
- ๊ฐ๋ฐ ์ Hot Module Replacement(HMR) ์ง์
Vue CLI
๋ทฐ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ธฐ ์ํ ๋ช ๋ น์ด ๋๊ตฌ์ด๋ค. ์๋์ ๋ช ๋ น์ด๋ก CLI๋ฅผ ์์คํ ๋ ๋ฒจ์ ์ค์นํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ CLI๋ฅผ ์ค์นํ๊ธฐ ์ํด์๋ Node.js LTS ๋ฒ์ ์ด ์ค์น๋์ด ์์ด์ผ ํ๋ค.
npm install -g @vue/cli
CLI๊ฐ ์ค์น๋๊ณ ๋๋ฉด ์๋์ ๋ช ๋ น์ด๋ก ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์ ์๋ค.
vue create ํ๋ก์ ํธ ์ด๋ฆ
๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๊ณ ๋๋ฉด Preset์ ์ ํํ๋ผ๊ณ ๋์ค๋๋ฐ Default๋ฅผ ์ ํํ๋ฉด ๋๋ค. ํ๋ก์ ํธ๊ฐ ์์ฑ๋๋ฉด ์ฝ์์ ์๋์ ๊ฐ์ ํ์์ผ๋ก ์๋ด๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ์ ์๋ค.
cd ํ๋ก์ ํธ ํด๋ ์ด๋ฆ
npm run serve
Virtual DOM in Vue.js
๋ฆฌ์กํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ทฐ๋ Virtual DOM์ ์ฌ์ฉํ๋ค. Virtual DOM์ ํ๋ฉด์ ์กฐ์ํ๊ธฐ ์ํ ๊ธฐ๋ฐ ๊ธฐ์ ์ด๋ค. ํ๋ฉด์ DOM์ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๋ ๋ฑ์ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋ ๋ง๋ค ํ๋ฉด์ ๋ค์ ๊ทธ๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ, ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก DOM์ ๋ชจ์์ ์ก์ ๋๊ณ ํ๋ฉด์ ๋ ๋๋ง ํ์๋ฅผ ์ต์ํํ์ฌ ๋ธ๋ผ์ฐ์ ์ ๋ถํ๋ฅผ ์ค์ธ๋ค.
์ฐธ๊ณ ์์
๊ฐ ์ฃผ์ ์ ๋ํ ๋ด์ฉ์ ๋ ์์ธํ ๋ณผ ์ ์๋ ์ฑ ์ ์๊ฐํฉ๋๋ค :)

๊ธ๋ณด๋ค ๋ ์ฝ๊ฒ ๋ฐฐ์ฐ๋ Vue.js ์จ๋ผ์ธ ๊ฐ์ข
์ข ๋ ์น์ ํ๊ณ ์์ธํ ์ค๋ช ์ ์ํ์ ๋ค๋ฉด ์๋ ๊ฐ์ข๋ฅผ ์ด์ฉํด๋ณด์๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ์์ ๐









์ดํด๊ฐ ์ ์๋์๋์? ๋ฐฉ์ก์์ ์ง์ ๋ฌผ์ด๋ณด์ธ์ :)
๋งค์ฃผ ํ ์์ผ ์คํ 3์ 30๋ถ์ ์ ํ๋ธ ๋ผ์ด๋ธ ๋ฐฉ์ก์ ์งํํฉ๋๋ค. ํ๋ฐํธ์๋ ๊ฐ๋ฐ ๊ด๋ จํด์ ์๋ฌด๊ฑฐ๋ ์ฌ์ญค๋ณด์ค ์ ์์ผ์ธ์ :)
ํ๋ฐํธ์๋ ๊ฐ๋ฐ ์๋ด์ ๋ฐ๋ก๊ฐ๊ธฐ