์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ด๊ณ , ์ปดํฌ๋ํธ์ ๋ก์ง์ ์ ์ฐํ๊ฒ ๊ตฌ์ฑํ ์ ์๋๋ก ํ๋ ํจ์ ๊ธฐ๋ฐ์ API. Vue3 ๊ณต์๋ฌธ์์์ Composition API๋ฅผ ์ธ ๊ฒ์ ๊ถ์ฅํ๊ณ ์๋ค.
Composition API๋ Vue3์์ ์๋ก ์ถ๊ฐ๋ ํจ์ ๊ธฐ๋ฐ์ API๋ก, ์ปดํฌ๋ํธ ๋ก์ง์ ์ ์ฐํ๊ฒ ๊ตฌ์ฑํ ์ ์๋๋ก ํ์ฌ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ๋์ฌ์ค๋ค.
๊ธฐ์กด์ Vue๋ ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ์ปดํฌ๋ํธ์ ๊ณ์ธต ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ง๋ฉฐ, ์ด๋ก์ธํด ์ถ์ ๋ฐ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์ ๋ค๊ณ ํ๋ค. ์ด๋ฌํ Vue์ ๋จ์ ์ ์ปค๋ฒํ๊ธฐ ์ํด Vue3๋ถํฐ ์ปดํฌ์ง์ API๊ฐ ์ถ๊ฐ๋์๋ค.
Composition API๋ ์ต์ ์ ์ ์ธํ๋ ๋์ importํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ vue ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ์ ์๋ API ์ธํธ์ด๋ค.
๋ฐ์ํ(Reactivity) API
: ref() ๋ฐ reactive()๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ํ ์ํ, ๊ณ์ฐ๋ ์ํ ๋ฐ ๊ฐ์์๋ฅผ ์ง์ ์์ฑํ ์ ์๋ค.
์๋ช
์ฃผ๊ธฐ ํ
: onMounted() ๋ฐ onUnmounted()๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ์๋ช
์ฃผ๊ธฐ์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐํ ์ ์๋ค.
์์กด์ฑ ์ฃผ์
(Dependency Injection)
: provide() ๋ฐ inject()๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ํ API๋ฅผ ์ฌ์ฉํ๋ ๋์ Vue์ ์์กด์ฑ ์ฃผ์
์์คํ
์ ํ์ฉํ ์ ์๋ค.
<template>
<button @click="plus()">์ซ์: {{ cnt }}</button>
</template>
<script setup>
import { ref, onMounted } from 'vue'
// ๋ฐ์ํ
const cnt = ref(0)
const plus = () => { cnt.value++ }
// ์๋ช
์ฃผ๊ธฐ ํ
onMounted(() => { console.log(`OnMounted`) })
</script>
Options API ๊ธฐ์กด์๋ data, methods, computed์ ๊ฐ๊ฐ ๋ก์ง์ด ํฉ์ด์ ธ ์์๋๋ฐ Composition API๋ฅผ ํ์ฉํ๋ฉด ๋ก์ง์ด ๋ชจ์์ง๋ ๊ฒ์ ์ ์ ์๋ค.
์ด ๋ถ๋ถ์ ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์กด์ฌํ๋ค. ๊ธฐ์กด์ Options API๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ ์ฌ๋์ ํด๋น ๊ตฌ์กฐ์ ์ต์ํด์ ธ ์๊ธฐ ๋๋ฌธ์ ๋ก์ง์ด ๋๋์ด์ ธ ์๋ ๊ฒ์ด ํธํ ๊ฒ์ด๊ณ , ๋ก์ง์ ๋ชจ์์ ์ฌ์ฉํ๋ ์ฌ๋์ Composition API๊ฐ ํธํ ์ ์๋ค.
1. ๋ ๋์ ๋ก์ง ์ฌ์ฌ์ฉ์ฑ
์ปดํฌ์ง์ API์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ *์ปดํฌ์ ๋ธ ํจ์์ ํํ๋ก ๊น๋ํ๊ณ ํจ์จ์ ์ธ ๋ก์ง ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋๋ค. ์ต์ API์ ๊ธฐ๋ณธ ๋ก์ง ์ฌ์ฌ์ฉ ๋ฉ์ปค๋์ฆ์ธ **๋ฏน์ค์ธ์ ๋ชจ๋ ๋จ์ ์ ํด๊ฒฐํ๋ค.
์ปดํฌ์ง์ API์ ๋ก์ง ์ฌ์ฌ์ฉ ๊ธฐ๋ฅ์ ์ปดํฌ์ ๋ธ ์ ํธ๋ฆฌํฐ์ ๊ณ์ ์ฑ์ฅํ๋ ์ปฌ๋ ์ ์ธ VueUse์ ๊ฐ์ ์ธ์์ ์ธ ์ปค๋ฎค๋ํฐ ํ๋ก์ ํธ๋ฅผ ํ์์์ผฐ๋ค. ์ด๋ ๋ฏน์ค์ธ์ ๋ถ๋ถ๋ช ํ ์ถ์ฒ์ ์์ฑ, ๋ค์์คํ์ด์ค ์ถฉ๋ ๋ฑ์ ๋จ์ ์ ํด๊ฒฐํ๋ค.
๐ก *์ปดํฌ์ ๋ธ์ด๋?
Vue ์ฑ์ ์ปจํ
์คํธ์์ ์ปดํฌ์ ๋ธ์ Vue ์ปดํฌ์ง์
API๋ฅผ ํ์ฉํ์ฌ ์ํ ์ ์ฅ ๋ก์ง๋ฅผ ์บก์ํํ๊ณ ์ฌ์ฌ์ฉํ๋ ํจ์์ด๋ค. ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๋์ผํ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ์ปดํฌ์ ๋ธ ํจ์๋ก ์ฌ๊ตฌ์ฑ ํ ์ธ๋ถ ํ์ผ๋ก ์ถ์ถํ ์ ์๋ค.
๐ก *๋ฏน์ค์ธ์ด๋?
Vue2์์ ์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ์ ๋ฐฐํฌํ๋ ์ ์ฐํ ๋ฐฉ๋ฒ. mixins ์ต์
์ ๋ฏน์ค์ธ ๊ฐ์ฒด๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ด๋ค. Vue3์์ ๋ฏน์ค์ธ์ ๊ณ์ ์ง์๋์ง๋ง, ๋ ์ด์ ๊ถ์ฅ๋์ง ์๋ ๋ฐฉ๋ฒ์ด๋ค.
var HelloMixins = {
// ์ปดํฌ๋ํธ ์ต์
(data, methods, created ๋ฑ)
};
new Vue({
mixins: [HelloMixins]
})
2. ๋ณด๋ค ์ ์ฐํ ์ฝ๋ ๊ตฌ์ฑ
Options API๋ data, methods, computed๋ก ๋ก์ง์ด ํฉ์ด์ง๊ฒ ๋๋ค. ์ด๋ ๊ฐ๋จํ ์ฝ๋์์๋ ๊ตฌ์กฐ์ ์ผ๋ก ๋๋์ด์ง๋ค๋ ์ฅ์ ์ด ์๊ฒ ์ง๋ง, ์ฝ๋๊ฐ ๋ณต์กํด์ง์๋ก ๊ฐ๋ ์ฑ์ ๋จ์ด๋จ๋ฆฐ๋ค.
<์ถ์ฒ: https://ko.vuejs.org/ >
์ข์ธก์ Options API์ด๋ฉฐ, ์ฐ์ธก์ Composition API๋ก ๋ฆฌํฉํ ๋ง ํ๋ค.
์ด ํ, ๋์ผํ ๋
ผ๋ฆฌ์ ๋ฌธ์ ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ์ ์์์ ์น ํด๋ณด์๋ค.
๊ฐ์ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ค์ด ์ฌ๋ฌ ๋ถ๋ถ์ ๋ถํ ๋์ด ์๋ ๊ฒ์ ์ ์ ์๋ค.
์ด๋ ์ฝ๋๊ฐ ๊ธธ์ด์ง์๋ก, ๋จ์ผ ๋
ผ๋ฆฌ๋ฅผ ์ดํดํ๊ณ ํ์ํ๊ธฐ ์ํด ์ง์์ ์ผ๋ก ์์๋๋ก ์คํฌ๋กคํ๋ ๋ถํธํจ์ ์ผ๊ธฐํ๋ค. ๋ํ, ์ด๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ ํธ๋ฆฌํฐ๋ก ์ถ์ถํ๋ ค๋ ๊ฒฝ์ฐ ์ฝ๋์ ์กฐ๊ฐ์ ์ฐพ๋๋ฐ ์๋นํ ๋
ธ๋ ฅ์ด ํ์ํ๋ค.
๋ฐ๋๋ก, ์ฐ์ธก์ Composition API๋ ์ฝ๋๋ค์ด ํฉ์ด์ ธ์์ง ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ธ๋ก๋ค๋ก ์ด๋ํ๋ฉฐ ์ฝ๋ ์กฐ๊ฐ์ ์ฐพ์ ํ์๊ฐ ์๋ค. ์ต์ํ์ ๋
ธ๋ ฅ์ผ๋ก ์ฌ์ฌ์ฉ์ ์ํ ์ถ์ถ๋ ๊ฐ๋ฅํ๋ค.
๋ฆฌํฉํ ๋ง์ ์ํ ์๋ชจ ์๊ฐ ๊ฐ์๋ ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค์ ์ฅ๊ธฐ์ ์ธ ์ ์ง ๊ด๋ฆฌ์ ํต์ฌ์ด๋ค.
3. ๋ ๋์ ํ์
์ถ๋ก
ํ์ฌ ๋ง์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ค์ด TypeScript๋ฅผ ์ฑํํ๊ณ ์๋ค. Composition API๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํ ์นํ์ ์ธ ์ผ๋ฐ ๋ณ์์ ํจ์๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ, Composition API ์ฝ๋๋ TypeScript์ ์ผ๋ฐ JavaScript์์ ๊ฑฐ์ ๋์ผํ๊ฒ ๋ณด์ธ๋ค. ์ด๊ฒ์ JavaScript ์ฌ์ฉ์๊ฐ ์ ํ ์ถ๋ก ์ ์ด์ ์ ๋๋ฆด ์ ์๋๋ก ํ๋ค.
4. ๋ ์์ ํ๋ก๋์
๋ฒ๋ค ๋ฐ ๋ ์ ์ ์ค๋ฒํค๋
์ปดํฌ์ง์
API์ <script setup>
์ผ๋ก ์์ฑ๋ ์ฝ๋๋ ์ต์
API์ ๋นํด ๋ ํจ์จ์ ์ด๊ณ ์ถ์ํ๊ธฐ ์ฝ๋ค. ์ด๋ <script setup>
์ปดํฌ๋ํธ์ ํ
ํ๋ฆฟ์ด <script setup>
์ฝ๋์ ๋์ผํ ๋ฒ์์ ์ธ๋ผ์ธ๋ ํจ์๋ก ์ปดํ์ผ๋๊ธฐ ๋๋ฌธ์ด๋ค. this์ ์์ฑ ์ ๊ทผ๊ณผ ๋ฌ๋ฆฌ ์ปดํ์ผ๋ ํ
ํ๋ฆฟ ์ฝ๋๋ ์ธ์คํด์ค ํ๋ก์ ์์ด <script setup>
๋ด๋ถ์ ์ ์ธ๋ ๋ณ์์ ์ง์ ์ ๊ทผํ ์ ์๋ค. ์ด๊ฒ์ ๋ชจ๋ ๋ณ์ ์ด๋ฆ์ ์์ ํ๊ฒ ๋จ์ถํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ๋์ ์ถ์๋ก ์ด์ด์ง๋ค.
์๊น์ Composion API๋ก ์์ฑ๋ ์ฝ๋๋ฅผ Options API๋ก ์์ฑํด๋ณด์.
<template>
<button @click="plus()">์ซ์: {{ cnt }}</button>
</template>
<script setup>
import { ref, onMounted } from 'vue'
const cnt = ref(0)
const plus = () => { cnt.value++ }
const double = computed(() => cnt.value * 2);
</script>
<template>
<button @click="plus()">{{ cnt }}</button>
</template>
<script>
export default {
data () {
return {
cnt: 0,
}
},
methods: {
plus () {
++this.cnt;
},
},
computed: {
double () {
return this.cnt * 2;
}
}
}
</script>
Composition API์ Options API์ ๊ตฌ์กฐ์ ์ฐจ์ด๊ฐ ๋๊ปด์ง๋๊ฐ?
Composition API๋ data, methods, computed๋ก ๋ก์ง์ ๊ตฌ์ฑํ์ง ์๋๋ค. ๋ํ, export default {}๋ฅผ ์ ๊ณตํ์ง ์๋๋ค. ๋ฐ๋ผ์, ์ผ๋ฐ์ ์ธ JavaScript๋ฅผ ์์ฑํ๋ ๊ฒ์ฒ๋ผ ์ปดํฌ๋ํธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
Options API๋ ์ ํด์ง ๊ตฌ์กฐ๋ก, ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์๊ฐ์ '๋' ํ ์ ์๊ฒ ํด์ค ์ ์๋ค. ํ์ง๋ง, ๋ค์์ฑ ์์ด ๊ท์ ๋ ์ฝ๋ ๊ตฌ์ฑ ํจํด์ ๊ฐํ๊ฒ ๋๋ฏ๋ก ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ์ฝ๋ ํ์ง์ ๋ฆฌํฉํ ๋งํ๊ฑฐ๋ ๊ฐ์ ํ๊ธฐ ์ด๋ ค์ธ ์ ์๋ค. ์ด์ ๊ด๋ จํ์ฌ ์ปดํฌ์ง์ API๋ ๊ฑฐ์์ ์ผ๋ก(ํน์ ์ฅ๊ธฐ์ ์ผ๋ก) ๋ ํฌ๊ณ ๋ ๋์ ํ์ฅ์ฑ์ ์ ๊ณตํ๋ค.
ํ์ค์ฐ๊ธฐ
ํ์ฌ ํ์ฌ์์ ๋ฅ์ฌํฌ๋ก ํ๋ ์์ํฌ๋ฅผ Vue๋ก ์ ํํ๋ ์์ ์ ๋งก๊ณ ์๋ค.
๋ฒ์ ๊ณผ API ์ ํ์ ๋ฐ๋ฅธ ๊ณ ๋ฏผ์ ํ์ ๋, Vue2๋ ์ง์ ์ข ๋ฃ ์์ ์ด๋ฉฐ ๋ ์ด์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ Vue3๋ฅผ ์ฑํํ๋ค. Vue3์ ๋ํ ์๋ฃ๋ ๋ง์ง ์์ง๋ง, ์ฅ๊ธฐ์ ์ผ๋ก ์ข์ ์ ํ์ด์๋ค๊ณ ์๊ฐํ๋ค.
๋ํ, ํ์ฌ ํ์ ๊ฐ๋ฐ์๋ค์ด ๋ฅ์ฌํฌ๋ก์ JavaScript ๊ฐ๋ฐ์ ์ต์ํ๊ธฐ ๋๋ฌธ์ ๋ณด์์ ๋ Options API๋ณด๋ค Composition API๊ฐ ๋ ์ข์ ๊ฐ๋
์ฑ๊ณผ ์ดํด๋๋ฅผ ๊ฐ์ง ๊ฒ์ด๋ผ ํ๋จํ๋ค.
Vue๊ณต์ ๋ฌธ์์๋, Vue3๋ฅผ ์ฌ์ฉ์์ Composition API๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํ์ผ๋ ๋ง์ด๋ค.
์ด๋ฒ์ ํ๋ ฅ์ ์ฒด์ Composition APi, Options API ์ฑํ ๊ด๋ จ์ผ๋ก ํ์๋ฅผ ์งํํด์, ์ ๋ฆฌํ ๊ฒธ Composition API์ ๋ํด ํฌ์คํ ํด๋ณด์๋ค.
๋ค์์๋ <script setup>
๊ณผ arrow function์ ๋ํด์๋ ๋ค๋ค๋ณด๊ฒ ๋ค.
์ฐธ๊ณ ๋ฌธํ
https://ko.vuejs.org/