๐ค VUE.JS?
๐ ๊ถ๊ธํ ๋ชจ๋ ๊ฒ์ ๊ธฐ๋กํฉ๋๋ค.
๐ ๊ธฐ๋ก์์ ๋ฉ์ถ์ง ์๊ณ ๋์ ๊ฒ์ผ๋ก ๋ง๋ญ๋๋ค.
๐ ์๋ชป๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ์ธ์ ๋ ์ง ๋๊ธ์ ๋จ๊ฒจ์ฃผ์ธ์ :D์ ๋ ์ธ์ ๋ ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด์ฉ๋ค Vue๋ฅผ ๊ณต๋ถํ ๊ธฐํ๊ฐ ์์ด์ ๊ณต๋ถํ ๊ธฐ๋ก์ ๋จ๊น๋๋ค.
๐ค VUE.JS?
๊ณต์ ๋ฌธ์์์ ๊ฒํ ๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI)๋ฅผ ๋ง๋ค๊ธฐ ์ํ ํ๋ก๊ทธ๋ ์๋ธ ํ๋ ์ ์ํฌ๋ผ๊ณ ์๊ฐํ๊ณ ์์ต๋๋ค.
๐ง ํน์ง
1. ์ ์ฐํ๊ณ ์ปดํฉํธํ๋ค.
2. ๊ธฐ์กด์ ์น์ฑ์ ์ผ๋ถ UI๋ง ์ ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
3. SPA๋ฅผ ์ํด ํ์ํ ๋ผ์ฐํฐ ๊ธฐ๋ฅ๋ ์ง์ํ๋ค.
4. ๋ฆฌ์กํธ์ฒ๋ผ ๊ฐ์ DOM์ ์ง์ํด์ ๋น ๋ฅธ UI ๋๋ฐ์ด ๊ฐ๋ฅํ๋ค.
5. ๊ตฌ์ฑ์์ ๊ธฐ๋ฐ์ ํ๋ ์์ํฌ์ด๋ค.
6. ์ต๊ทค๋ฌ์ฒ๋ผ ์๋ฐฉํฅ ๋ฐ์ดํฐ๊ฐ ๊ฐ๋ฅํ๋ค.
ํ๋ฉด์ ํ์๋๋ ๊ฐ๊ณผ ๋ชจ๋ธ ๋ฐ์ดํฐ ๊ฐ์ด ๋ก๊ทธ์ธ๋์ด ํญ์ ๋ณ๊ฒฝ๋๊ฑฐ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์๋์ผ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
7. ๋ฆฌ์กํธ์ฒํ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๊ฐ๋ค.
์ปดํฌ๋ํธ๋ผ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ํต์ ํ ๋ ํญ์ ์์์ปดํฌ์์น์์ ํ์์ปดํฌ์์น ๋ฐฉํฅ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋๋ค.
8. MVVMํจํด์ด๋ค.
Model - View - ViewModel ๊ตฌ์กฐ๋ก ๊ฐ๋ฐํ๋ ๋ฐฉ์์ด๋ค. ํ๋ฉด์ ์์๋ฅผ ์ ์ดํ๋ โโ์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ฝ๋์ ์ดํด๋๋ฅผ ์ถฉ๋ถํ ์ ์งํ๊ณ ๋ณด์๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๋ณด๊ธฐ๋ ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ ํ๋ฉด์ด๋ค.
ViewModel์ View์ Model์ ์ค๊ฐ ์์ญ์ด๊ณ , DOM ๋ฆฌ์ค๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๊ณณ์
๋๋ค.
๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ์์น๋ก, ๋ณดํต ์๋ฒ์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ JS ๊ฐ์ฒด ํํ๋ก ์ ์ฅํ๋ค.
DOM Listener๋ DOM์ ๋ณ๊ฒฝ ์ํฉ์ ์ฆ, ๊ฐ ๋ฐ์ํ์ฌ ํน์ ๋ก์ง์ ์ํํ๋ ์ฅ์น์ด๋ค.
Data Binding์ View์ ๋ด์ฉ๊ณผ Model์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ๋ ์ฅ์น์ด๋ค.
๐ง ์ค์น๋ฐฉ๋ฒ
ํ์ด์ง์ CDN package ๋ก ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, npm์ ๊ฑด์คํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
// vue ์ค์นํ๊ธฐ
$ npm install vue@next
// vue cli ์ค์นํ๊ธฐ
yarn global add @vue/cli
// ์๋๋ฉด
npm install -g @vue/cli
// vue cli๋ฅผ ํตํ ํ๋ก์ ํธ ์์ฑ ๋ฐฉ๋ฒ
vue create my-project
// ํน์ ์๋ ๋ช
๋ น์ด๋ฅผ ํตํด ui๋ก ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์ ๋ ์๋ค.
vue ui
Vue ํ์ผ ๊ตฌ์กฐ
Vue์ ๊ตฌ์กฐ์ ๊ฐ ๊ฐ๋
์ ์ฝ๋๋ก ์์ฑํ๋ฉด์ ๋ณด์์ต๋๋ค.
// Home.vue
<template>
<!-- Vue ํ์ผ์ ์ปดํฌ๋ํธ ํ
ํ๋ฆฟ์ ์ ์ํ๋ template ํํธ, ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ script ํํธ, ๊ทธ๋ฆฌ๊ณ ์คํ์ผ๋ง ์ ๋ณด๋ฅผ ์์ฑํ๋ style ํํธ๋ก ๋๋์ด์ ธ ์๋ค. -->
<div>
<!-- ์ค๊ดํธ๋ฅผ ๋๋ฒ ์ฌ์ฉํด์ JS ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค ์ ์๋ค. Mustache bracket-->
<h1>Welcome to {{title2}}!</h1>
<!-- v-model ๋ฅผ ์ฌ์ฉํด์ input ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค. ๋ํ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด๊ธฐ์ data()์ ์ ์๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค. -->
<input type="text" v-model="input1" />
<!-- @click ์ ์ด์ฉํด์ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ํจ๋ค๋ง ํ ์ ์๋ค. -->
<!-- v-on์ ์ฝ์ด => v-on:click์ @click์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. -->
<button type="button" @click="getData">Get</button>
<button type="button" @click="setData">Set</button>
<!-- @change ๋ฅผ ์ด์ฉํด์ ๊ฐ์ ๋ณํ๋ฅผ ํ์ธํ๊ณ ์ค์ ํ ์ ์๋ค. -->
<select class="form-control" v-model="region" @change="changeRegion">
<!-- v-for ๋ฅผ ์ด์ฉํด์ ๋ฐ๋ณต๋ฌธ์ ๋๋ฆด ์ ์๋ค. ๋ฐ์ดํฐ ํ์์ด ๋ฐฐ์ด๋ก ์ฃผ์ด์ก์ ๋ -->
<!-- :key๋ v-bind:key์ ์ฝ์ด์ด๋ค -->
<option :key="i" :value="d.v" v-for="(d,i) in options">{{d.t}}</option>
</select>
<div>
<!-- v-if ๋ฅผ ์ด์ฉํด ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ผ ํ ์ ์๋ค. -->
<h3 v-if="awesome"> Vue is awesome! </h3>
<h1 v-else>Oh no ๐ข</h1>
</div>
<!-- v-show ๋ฅผ ์ด์ฉํด display css ์์ฑ์ none ์ฒ๋ผ ํ ์ ์๋ค. <์๋ฆฌ๋จผํธ๋ ๋ ๋๋ง์ด ๋๋ค.> -->
<table class="table table-bordered" v-show="tableShow">
<tr :key="index" v-for="(data,index) in options">
<td>{{data.v}}</td>
<td>{{data.t}}</td>
</tr>
</table>
</div>
</template>
<script>
export default {
// data ๋ฉ์๋๋ฅผ ํตํด ๋ค๋ฃจ๊ณ ์ถ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ณ , ๋ค๋ฃฐ ์ ์๊ฒ ๋๋ค.
// ์ด๊ณณ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ณ , template์ mustache bracket์ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉ ํ ์ ์๋ค.
// ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ค๊ณ ์ถ๋ค๋ฉด(ex. input, select, etc), v-model๋ฅผ ์ฌ์ฉํด์ ์๋์ ๋ณ์์ ํ ๋นํ ์ ์๋ค.
// ์์ฒ๋ผ ์๋ฐฉํฅ์ผ๋ก ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด ๊ฐ๋ฅํ๊ฒ ๋๋ค.
data() {
return {
title: "๋ทฐ ์ฐ์ต",
title2: "Seoul",
input1: "abcd",
options: [
{ v: "S", t: "Seoul" },
{ v: "J", t: "Jeju" },
{ v: "B", t: "Busan" },
],
region: "B",
tableShow: false,
awesome: false,
};
},
// ๋ง์ผ ๋ฐ์ดํฐ์ ์กฐ๊ธ์ด๋ผ๋ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ฉด ์์น ์์ ์ ์๋ ํด๋น ํจ์๊ฐ ์์ฉ๋๋ค.
// ์์น๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์์์ ์บ์นํด์ค๋ค. (๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ) ํน์ ๋ฐ์ดํฐ๋ฅผ ํญ์ ์ฃผ์ํ๊ณ ์๋ค๊ฐ, ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์บ์นํด์ ์ฌ์ฉํ ์ ์๋ค.
// ์ฃผ๋ก ์ฌ์ฉ์๋ก๋ถํฐ์ ์ด๋ฒคํธ๊ฐ ์๋ ํ๋ก๊ทธ๋จ ์์์ ์ด๋ ํ ํน์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝํ๋ ๊ฒ์ ํ์ธํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ฉด ์ข๋ค.
watch: {
// ์์น์์ ๋ฐ์ดํฐ ๋ช
์ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์์ ํจ์ํํ๋ก ์์ฑํด์ ์ฌ์ฉํ๋ค.
input1() {
console.log(this.input1);
},
title() {},
},
// Vue์์๋ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์ด๊ณณ์ ์ ์๋ฅผ ํ๋ค.
// ๋ฐ์ดํฐ ์ปจํธ๋กค์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ ์ด๊ณณ์์ ์ ์ํ๋ค.
methods: {
getData() {
alert(this.input1);
},
setData() {
this.input1 = "12345";
},
changeRegion() {
alert(this.region);
},
},
// Vue ์ธ์คํด์ค์ ๋ผ์ดํ ์ฌ์ดํด
// ๋ง์ผ ์ฒ์ ํ๋ฉด ๋ ๋๋ง์ด ๋๊ธฐ ์ ์ DB์ ๊ฐ์ ๊ณณ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ฟ๋ ค์ผ ํ๋ค๊ณ ํ๋ค๋ฉด ์ด๊ณณ์์ ์ ์ฉํ๋ฉด ๋๋ค.
beforeCreate() {
console.log("beforeCreate");
},
created() {
console.log("created");
},
beforeMount() {
console.log("beforeMount");
},
// ํ๋ฉด์ ์ค์ ๋ก html์ด ๋ก๋ฉ์ด ๋์์ ๋
mounted() {
console.log("mounted");
},
// ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋, ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ๋ฌด์ธ๊ฐ๋ฅผ, ํจ์๋ฅผ ์ ์ฉํ๊ณ ์ถ์ ๋ ์ด๊ณณ์ ์ ์ํ๋ฉด ๋๋ค.
beforeUpdate() {
console.log("beforeUpdate");
},
updated() {
console.log("updated");
},
beforeDestroy() {
console.log("beforeDestroy");
},
destroyed() {
console.log("beforeDestroy");
},
};
</script>
๐ Vue ๊ฐ๋ฐ์ ๋์์ด ๋๋ Tool &Live
// vue ์ค์นํ๊ธฐ
$ npm install vue@next
// vue cli ์ค์นํ๊ธฐ
yarn global add @vue/cli
// ์๋๋ฉด
npm install -g @vue/cli
// vue cli๋ฅผ ํตํ ํ๋ก์ ํธ ์์ฑ ๋ฐฉ๋ฒ
vue create my-project
// ํน์ ์๋ ๋ช
๋ น์ด๋ฅผ ํตํด ui๋ก ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์ ๋ ์๋ค.
vue ui
Vue์ ๊ตฌ์กฐ์ ๊ฐ ๊ฐ๋
์ ์ฝ๋๋ก ์์ฑํ๋ฉด์ ๋ณด์์ต๋๋ค.
// Home.vue
<template>
<!-- Vue ํ์ผ์ ์ปดํฌ๋ํธ ํ
ํ๋ฆฟ์ ์ ์ํ๋ template ํํธ, ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ script ํํธ, ๊ทธ๋ฆฌ๊ณ ์คํ์ผ๋ง ์ ๋ณด๋ฅผ ์์ฑํ๋ style ํํธ๋ก ๋๋์ด์ ธ ์๋ค. -->
<div>
<!-- ์ค๊ดํธ๋ฅผ ๋๋ฒ ์ฌ์ฉํด์ JS ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค ์ ์๋ค. Mustache bracket-->
<h1>Welcome to {{title2}}!</h1>
<!-- v-model ๋ฅผ ์ฌ์ฉํด์ input ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค. ๋ํ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด๊ธฐ์ data()์ ์ ์๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค. -->
<input type="text" v-model="input1" />
<!-- @click ์ ์ด์ฉํด์ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ํจ๋ค๋ง ํ ์ ์๋ค. -->
<!-- v-on์ ์ฝ์ด => v-on:click์ @click์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. -->
<button type="button" @click="getData">Get</button>
<button type="button" @click="setData">Set</button>
<!-- @change ๋ฅผ ์ด์ฉํด์ ๊ฐ์ ๋ณํ๋ฅผ ํ์ธํ๊ณ ์ค์ ํ ์ ์๋ค. -->
<select class="form-control" v-model="region" @change="changeRegion">
<!-- v-for ๋ฅผ ์ด์ฉํด์ ๋ฐ๋ณต๋ฌธ์ ๋๋ฆด ์ ์๋ค. ๋ฐ์ดํฐ ํ์์ด ๋ฐฐ์ด๋ก ์ฃผ์ด์ก์ ๋ -->
<!-- :key๋ v-bind:key์ ์ฝ์ด์ด๋ค -->
<option :key="i" :value="d.v" v-for="(d,i) in options">{{d.t}}</option>
</select>
<div>
<!-- v-if ๋ฅผ ์ด์ฉํด ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ผ ํ ์ ์๋ค. -->
<h3 v-if="awesome"> Vue is awesome! </h3>
<h1 v-else>Oh no ๐ข</h1>
</div>
<!-- v-show ๋ฅผ ์ด์ฉํด display css ์์ฑ์ none ์ฒ๋ผ ํ ์ ์๋ค. <์๋ฆฌ๋จผํธ๋ ๋ ๋๋ง์ด ๋๋ค.> -->
<table class="table table-bordered" v-show="tableShow">
<tr :key="index" v-for="(data,index) in options">
<td>{{data.v}}</td>
<td>{{data.t}}</td>
</tr>
</table>
</div>
</template>
<script>
export default {
// data ๋ฉ์๋๋ฅผ ํตํด ๋ค๋ฃจ๊ณ ์ถ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ณ , ๋ค๋ฃฐ ์ ์๊ฒ ๋๋ค.
// ์ด๊ณณ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ณ , template์ mustache bracket์ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉ ํ ์ ์๋ค.
// ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ค๊ณ ์ถ๋ค๋ฉด(ex. input, select, etc), v-model๋ฅผ ์ฌ์ฉํด์ ์๋์ ๋ณ์์ ํ ๋นํ ์ ์๋ค.
// ์์ฒ๋ผ ์๋ฐฉํฅ์ผ๋ก ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด ๊ฐ๋ฅํ๊ฒ ๋๋ค.
data() {
return {
title: "๋ทฐ ์ฐ์ต",
title2: "Seoul",
input1: "abcd",
options: [
{ v: "S", t: "Seoul" },
{ v: "J", t: "Jeju" },
{ v: "B", t: "Busan" },
],
region: "B",
tableShow: false,
awesome: false,
};
},
// ๋ง์ผ ๋ฐ์ดํฐ์ ์กฐ๊ธ์ด๋ผ๋ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ฉด ์์น ์์ ์ ์๋ ํด๋น ํจ์๊ฐ ์์ฉ๋๋ค.
// ์์น๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์์์ ์บ์นํด์ค๋ค. (๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ) ํน์ ๋ฐ์ดํฐ๋ฅผ ํญ์ ์ฃผ์ํ๊ณ ์๋ค๊ฐ, ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์บ์นํด์ ์ฌ์ฉํ ์ ์๋ค.
// ์ฃผ๋ก ์ฌ์ฉ์๋ก๋ถํฐ์ ์ด๋ฒคํธ๊ฐ ์๋ ํ๋ก๊ทธ๋จ ์์์ ์ด๋ ํ ํน์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝํ๋ ๊ฒ์ ํ์ธํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ฉด ์ข๋ค.
watch: {
// ์์น์์ ๋ฐ์ดํฐ ๋ช
์ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์์ ํจ์ํํ๋ก ์์ฑํด์ ์ฌ์ฉํ๋ค.
input1() {
console.log(this.input1);
},
title() {},
},
// Vue์์๋ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์ด๊ณณ์ ์ ์๋ฅผ ํ๋ค.
// ๋ฐ์ดํฐ ์ปจํธ๋กค์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ ์ด๊ณณ์์ ์ ์ํ๋ค.
methods: {
getData() {
alert(this.input1);
},
setData() {
this.input1 = "12345";
},
changeRegion() {
alert(this.region);
},
},
// Vue ์ธ์คํด์ค์ ๋ผ์ดํ ์ฌ์ดํด
// ๋ง์ผ ์ฒ์ ํ๋ฉด ๋ ๋๋ง์ด ๋๊ธฐ ์ ์ DB์ ๊ฐ์ ๊ณณ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ฟ๋ ค์ผ ํ๋ค๊ณ ํ๋ค๋ฉด ์ด๊ณณ์์ ์ ์ฉํ๋ฉด ๋๋ค.
beforeCreate() {
console.log("beforeCreate");
},
created() {
console.log("created");
},
beforeMount() {
console.log("beforeMount");
},
// ํ๋ฉด์ ์ค์ ๋ก html์ด ๋ก๋ฉ์ด ๋์์ ๋
mounted() {
console.log("mounted");
},
// ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋, ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ๋ฌด์ธ๊ฐ๋ฅผ, ํจ์๋ฅผ ์ ์ฉํ๊ณ ์ถ์ ๋ ์ด๊ณณ์ ์ ์ํ๋ฉด ๋๋ค.
beforeUpdate() {
console.log("beforeUpdate");
},
updated() {
console.log("updated");
},
beforeDestroy() {
console.log("beforeDestroy");
},
destroyed() {
console.log("beforeDestroy");
},
};
</script>
Vue Devtools
Vue ์ฑ์ ๋ณด๋ค ์ฌ์ฉ์๊ฐ ๊ฐ๊น๊ฒ๋
๋ทฐํด๋ฆฌ
์ ์ํ๊ฒ ์ ์ฉํ ์ ์๋๋ก ๋์์ค๋๋ค.
๋ทฐ ๋ผ์ฐํฐ
SPA๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ ๋ ์ต๋ํ ํ์ฉํ ์ ์์ต๋๋ค. npm์ผ๋ก ์ค์นํ๊ฑฐ๋ CDN ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ ์ฐธ๊ณ ๋ฌธํ
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ค VUE.JS?), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/gunwooko/vue-js-50f9ํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค