๐ Vue.js๋?
Vue.js(๋ทฐ.js)๋ "์ง์
์ฅ๋ฒฝ์ด ๋ฎ๊ณ , ์ ์ง์ ์ผ๋ก ์ ์ฉํ ์ ์๋ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ" ์
๋๋ค.
์ฃผ๋ก ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์
(SPA) ๊ฐ๋ฐ์ ์ฌ์ฉ๋๋ฉฐ, HTML, CSS, JavaScript๋ฅผ ์กฐํฉํ์ฌ ๋์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ฝ๊ฒ ๋ง๋ค ์ ์๋๋ก ๋์์ค๋๋ค.
๐น Vue.js์ ํน์ง
- ๋ฐ์ํ(Reactivity) ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ
- Vue์ ํต์ฌ ๊ธฐ๋ฅ ์ค ํ๋๋ ๋ฐ์ํ ์์คํ
์
๋๋ค.
- data ๊ฐ์ฒด์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด, ์ด๋ฅผ ์ฌ์ฉํ๋ DOM๋ ์๋์ผ๋ก ์
๋ฐ์ดํธ๋ฉ๋๋ค.
- Vue๊ฐ Proxy ๋๋ Object.defineProperty๋ฅผ ํ์ฉํ์ฌ ๋ณ๊ฒฝ์ ๊ฐ์งํฉ๋๋ค.
- ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ
์ฒ
- Vue๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
- ๊ฐ ์ปดํฌ๋ํธ๋ template, script, style๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ด๋ฅผ ์กฐํฉํด UI๋ฅผ ์ค๊ณํ ์ ์์ต๋๋ค.
- ์ง๊ด์ ์ธ ํ
ํ๋ฆฟ ๋ฌธ๋ฒ
- {{}} ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด ๊ฐ๋ฅํ๋ฉฐ, ๋๋ ํฐ๋ธ(v-if, v-for, v-bind ๋ฑ)๋ฅผ ํตํด ๋์ ๋ ๋๋ง์ ์ฝ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค.
- Virtual DOM
- Vue๋ React์ฒ๋ผ Virtual DOM์ ์ฌ์ฉํ์ฌ ํจ์จ์ ์ธ ๋ ๋๋ง์ ์ง์ํฉ๋๋ค.
- ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์ต์ํ์ผ๋ก ์
๋ฐ์ดํธํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
- Vue Router ๋ฐ Vuex ์ง์
- Vue Router: SPA์์ ํ์ด์ง ์ด๋์ ์ฒ๋ฆฌํ๋ ๋ผ์ฐํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Vuex(Pinia): ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๐น Vue.js์ ๊ธฐ๋ณธ ๋ฌธ๋ฒ ์์
1๏ธโฃ Vue ์ธ์คํด์ค ์์ฑ
<div id="app">
<p>{{ message }}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
message: '์๋
ํ์ธ์, Vue.js!'
}
});
</script>
2๏ธโฃ ๋๋ ํฐ๋ธ ์์ (v-bind, v-model, v-if, v-for)
<div id="app">
<input v-model="name" placeholder="์ด๋ฆ ์
๋ ฅ">
<p v-if="name">์๋
ํ์ธ์, {{ name }}๋!</p>
<ul>
<li v-for="item in items" :key="item.id">{{ item.text }}</li>
</ul>
</div>
<script>
new Vue({
el: '#app',
data: {
name: '',
items: [
{ id: 1, text: 'Vue.js ๋ฐฐ์ฐ๊ธฐ' },
{ id: 2, text: 'React.js์ ๋น๊ตํ๊ธฐ' },
{ id: 3, text: 'SPA ํ๋ก์ ํธ ๋ง๋ค์ด ๋ณด๊ธฐ' }
]
}
});
</script>
๐น Vue์ ์ฃผ์ ํ์ฉ ๋ถ์ผ
โ
SPA(Single Page Application) ๊ฐ๋ฐ
โ
๋์๋ณด๋, ๊ด๋ฆฌ ์์คํ
โ
๋ชจ๋ฐ์ผ ์น์ฑ(PWA) ๊ฐ๋ฐ
โ
์ ์์๊ฑฐ๋ ์น์ฌ์ดํธ
๐น Vue์ ๋ฒ์
- Vue 2: Options API ๋ฐฉ์์ผ๋ก ๋ง์ด ์ฌ์ฉ๋จ (data, methods, computed ๋ฑ)
- Vue 3: Composition API(setup ํจ์) ๋์
์ผ๋ก ๋ ์ ์ฐํ ๋ฐฉ์ ์ ๊ณต
// Vue 3 Composition API ์์
import { ref } from 'vue';
export default {
setup() {
const count = ref(0);
const increment = () => count.value++;
return { count, increment };
}
};
๐น Vue.js vs React.js vs Angular
ํน์ง |
Vue.js |
React.js |
Angular |
ํ์ต ๋์ด๋ |
์ฌ์ |
๋ณดํต |
์ด๋ ค์ |
๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ |
์๋ฐฉํฅ(v-model) |
๋จ๋ฐฉํฅ |
์๋ฐฉํฅ |
์ฑ๋ฅ |
๋น ๋ฆ |
๋น ๋ฆ |
์๋์ ์ผ๋ก ๋ฌด๊ฑฐ์ |
์ํ ๊ด๋ฆฌ |
Vuex, Pinia |
Redux, Recoil |
NgRx |
์ฌ์ฉ ์ฌ๋ก |
์ค์ํ ํ๋ก์ ํธ |
๋๊ท๋ชจ ์๋น์ค |
์ํฐํ๋ผ์ด์ฆ |
โ
์ ๋ฆฌ
Vue.js๋ ๊ฐ๋ณ๊ณ , ๋ฐฐ์ฐ๊ธฐ ์ฝ๊ณ , ์ง๊ด์ ์ธ ํ๋ ์์ํฌ๋ก, ๋น ๋ฅด๊ฒ ํ๋ก์ ํธ์ ์ ์ฉํ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค.
ํนํ ๊ตญ๋ด์์ ๋ง์ ์คํํธ์
๊ณผ ๊ธฐ์
๋ค์ด Vue.js๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, SPA ๊ฐ๋ฐ์ ๊ณ ๋ คํ๋ค๋ฉด Vue.js๋ ์ข์ ์ ํ์ด ๋ ์ ์์ต๋๋ค. ๐