Composition API RFC - ChoDragon9/posts GitHub Wiki
::: warning Composition API ํ์ต์ ์ํด Composition API RFC์ ๋ฒ์ญํ ํฌ์คํธ์ ๋๋ค. ๊ณต์ ๋ฌธ์๊ฐ ์๋์ ๋ฐํ๋๋ค. :::
::: tip RFC(Request for Comments) ๋ฌธ์๋ ๋นํ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ฌธ์๋ผ๋ ์๋ฏธ๋ก, ์ปดํจํฐ ๋คํธ์ํฌ ๊ณตํ ๋ฑ์์ ์ธํฐ๋ท ๊ธฐ์ ์ ์ ์ฉ ๊ฐ๋ฅํ ์๋ก์ด ์ฐ๊ตฌ, ํ์ , ๊ธฐ๋ฒ ๋ฑ์ ์์ฐ๋ฅด๋ ๋ฉ๋ชจ๋ฅผ ๋ํ๋ธ๋ค.
-
์ถ์ฒ: ์ํค๋ฐฑ๊ณผ:RFC :::
-
์ฐธ๊ณ ์ด์: #42
์ปดํฌ์ง์ API ์๊ฐ: ์ปดํฌ๋ํธ ๋ก์ง์ ์ ์ฐํ๊ฒ ๊ตฌ์ฑํ ์ ์๋ ๋ถ๊ฐ์ ์ธ ํจ์๊ธฐ๋ฐ API ์ธํธ์ ๋๋ค.
<template>
<button @click="increment">
Count is: {{ state.count }}, double is: {{ state.double }}
</button>
</template>
<script>
import { reactive, computed } from 'vue'
export default {
setup() {
const state = reactive({
count: 0,
double: computed(() => state.count * 2)
})
function increment() {
state.count++
}
return {
state,
increment
}
}
}
</script>
์ฐ๋ฆฌ ๋ชจ๋๊ฐ Vue๊ฐ ๋งค์ฐ ์ฝ๊ฒ ํฝ์ ํ๊ณ ์ค์ ๊ท๋ชจ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฝ๊ฒ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์ข์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค๋๋ Vue์ ์ฑํ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ง์ ์ฌ์ฉ์๊ฐ Vue๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ๋ฐ์ ํ์ด ์ค๋ ๊ธฐ๊ฐ ๋์ ๋ฐ๋ณตํ๊ณ ์ ์ง ๊ด๋ฆฌํ๋ ๋๊ท๋ชจ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ถํ๊ณ ์์ต๋๋ค. ์๋ ์ ๊ฑธ์ณ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ํ๋ก์ ํธ ์ค ์ผ๋ถ๊ฐ Vue์ ํ์ฌ API์ ์๋ฐ๋๋ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ํ๊ณ์ ๋ถ๋ชํ๋ ๊ฒ์ ๋ชฉ๊ฒฉํ์ต๋๋ค. ๋ฌธ์ ๋ ๋ ๊ฐ์ง ๋ฒ์ฃผ๋ก ์์ฝํ ์ ์์ต๋๋ค.
- ๋ณต์กํ ์ปดํฌ๋ํธ์ ์ฝ๋๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ธฐ๋ฅ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ถ๋ก ํ๊ธฐ ๋ ์ด๋ ค์์ง๋๋ค. ์ด๊ฒ์ ํนํ ๊ฐ๋ฐ์๊ฐ ์ค์ค๋ก ์์ฑํ์ง ์์ ์ฝ๋๋ฅผ ์ฝ์ ๋ ๊ฒฝ์ฐ์ ๋ฐ์ํฉ๋๋ค. ๊ทผ๋ณธ ์์ธ์ Vue์ ๊ธฐ์กด API๊ฐ ์ต์ ๋ณ๋ก ์ฝ๋ ๊ตฌ์ฑ์ ๊ฐ์ํ์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ ผ๋ฆฌ์ ๋ฌธ์ ๋ก ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์ ๋๋ค.
- ์ฌ๋ฌ ์ปดํฌ๋ํธ๊ฐ์ ๋ ผ๋ฆฌ๋ฅผ ์ถ์ถํ๊ณ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ ๊นจ๋ํ๊ณ ๋น์ฉ์ด ๋ค์ง ์๋ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค. (๋ ผ๋ฆฌ ์ถ์ถ ๋ฐ ์ฌ์ฌ์ฉ์ ๋ํ ์์ธํ ๋ด์ฉ)
์ด RFC์์ ์ ์๋ API๋ ์ปดํฌ๋ํธ ์ฝ๋๋ฅผ ๊ตฌ์ฑํ ๋ ์ฌ์ฉ์์๊ฒ ๋ ๋ง์ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. ์ฝ๋๋ ํญ์ ์ต์ ๋ณ๋ก ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๋ ๋์ ํน์ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๋ ํจ์๋ก ๊ตฌ์ฑ ํ ์ ์์ต๋๋ค. ๋ํ API๋ ์ปดํฌ๋ํธ ๊ฐ์ ๋๋ ์ฌ์ง์ด ์ธ๋ถ ์ปดํฌ๋ํธ ์ฌ์ด์ ๋ ผ๋ฆฌ๋ฅผ ์ถ์ถํ๊ณ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๊ฐ๋จํฉ๋๋ค. ์์ธ ์ค๊ณ ์น์ ์์ ์ด๋ฌํ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๋๊ท๋ชจ ํ๋ก์ ํธ๋ฅผ ์ํํ๋ ๊ฐ๋ฐ์์ ๋ ๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ๊ธฐ๋ฅ ์์ฒญ์ ๋ ๋์ TypeScript ์ง์์
๋๋ค. Vue์ ํ์ฌ API๋ TypeScript์์ ํตํฉ๊ณผ ๊ด๋ จํ์ฌ Vue์ ์์ฑ์ ๋
ธ์ถํ๊ธฐ ์ํด ๋จ์ผ this
์ปจํ
์คํธ์ ์์กดํ๊ณ Vue ์ปดํฌ๋ํธ์์ this
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฝ๊ฐ ๋ ๋ง๊ธฐ ๋๋ฌธ์ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ์ต๋๋ค. ์ผ๋ฐ JavaScript ๋ณด๋ค ๋ง์ ์ ์
๋๋ค. (์: methods
์๋์ ์ค์ฒฉ๋ ํจ์์ this
๋ methods
์ค๋ธ์ ํธ๊ฐ ์๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌ ํต๋๋ค). ์ฆ, Vue์ ๊ธฐ์กด API๋ ๋จ์ํ ํ์
์ถ๋ก ๋ฅผ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์ง ์์์ผ๋ฉฐ TypeScript์ ์ ์๋ํ๋๋ก ๋ง๋ค ๋ ๋ง์ ๋ณต์ก์ฑ์ ๋ง๋ญ๋๋ค.
์ค๋๋ Vue๋ฅผ TypeScript์ ํจ๊ป ์ฌ์ฉํ๋ ๋๋ถ๋ถ์ ์ฌ์ฉ์๋ ๋ฐ์ฝ๋ ์ดํฐ์ ๋์์ ๋ฐ์ ์ปดํฌ๋ํธ๋ฅผ TypeScript ํด๋์ค๋ก ์ ์ํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ vue-class-component
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. 3.0์ ์ค๊ณํ๋ ๋์ ์ด์ (๋๋กญ๋) RFC์์ ์
๋ ฅ ๋ฌธ์ ๋ฅผ ๋ณด๋ค ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํด ๋ด์ฅ ํด๋์ค API๋ฅผ ์ ๊ณตํ๋ ค๊ณ ์๋ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค๊ณ์ ๋ํด ๋
ผ์ํ๊ณ ๋ฐ๋ณตํ๋ฉด์ ํด๋์ค API๊ฐ ํ์ดํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ฐ์ฝ๋ ์ดํฐ์ ์์กดํด์ผ ํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ์ด๋ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๋ํด ๋ง์ ๋ถํ์ค์ฑ์ด ์๋ ๋งค์ฐ ๋ถ์์ ํ 2๋จ๊ณ ์ ์์
๋๋ค. ์ด๊ฒ์ ๊ธฐ๋ฐ์ ์ธ์ฐ๋ ๋ฐ ๋ค์ ์ํํ ํ ๋๊ฐ ๋ฉ๋๋ค. (ํด๋์ค API ํ์
๋ฌธ์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ)
์ด์ ๋นํด์, ์ด RFC์์ ์ ์ ๋ API๋ ๋๋ถ๋ถ ์์ฐ์ค๋ฝ๊ฒ ์น์ํ ์ผ๋ฐ ๋ณ์์ ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ ์ ๋ API๋ก ์์ฑ๋ ์ฝ๋๋ ๋ฉ๋ด์ผ ํ์ ํํธ๊ฐ ๊ฑฐ์ ํ์์๋ ์์ ํ ํ์ ์ถ๋ก ์ ์ฆ๊ธธ ์ ์์ต๋๋ค. ์ด๋ ์ ์ ๋ API๋ก ์์ฑ๋ ์ฝ๋๊ฐ TypeScript์ ์ผ๋ฐ JavaScript์์ ๊ฑฐ์ ๋์ผํ๊ฒ ๋ณด์ผ ๊ฒ์ด๋ฏ๋ก TypeScript๊ฐ ์๋ ์ฌ์ฉ์๋ ๋ ๋์ IDE ์ง์์ ์ํด ํ์ดํ์ ํ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ฌ๊ธฐ์์ ์ ์๋๋ API๋ ์๋ก์ด ๊ฐ๋ ์ ๋์ ํ๋ ๋์ ๋ฐ์ ์ํ ์์ฑ ๋ฐ ๊ด์ฐฐ๊ณผ ๊ฐ์ Vue์ ํต์ฌ ๊ธฐ๋ฅ์ ๋ ๋ฆฝํ ํจ์๋ก ๋ ธ์ถํ๋ ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ API๋ฅผ ์๊ฐํ๊ณ ์ปดํฌ๋ํธ ๋ก์ง์ ํํํ๊ธฐ ์ํด 2.x ์ต์ ๋์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค. ์ด ์น์ ์ ๊ธฐ๋ณธ ์์ด๋์ด๋ฅผ ์๊ฐํ๋ ๋ฐ ์ค์ ์ ๋๋ฏ๋ก ๊ฐ API์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค๋ฃจ์ง ์์ต๋๋ค. ์ ์ฒด API ์ฌ์ฉ์ API Reference ์น์ ์์ ํ์ธํ ์ ์์ต๋๋ค.
๊ฐ๋จํ ์์ ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค: ์ผ๋ถ ๋ฐ์ ์ํ ์ ์ธ.
import { reactive } from 'vue'
// reactive state
const state = reactive({
count: 0
})
reactive
๋ 2.x์ ํ์ฌ Vue.observable()
API์ ๋์ผํ๋ฉฐ RxJS Observables๊ณผ ํผ๋๋์ง ์๋๋ก ์ด๋ฆ์ ๋ณ๊ฒฝ๋์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฐํ๋ ์ํ๋ ๋ชจ๋ Vue ์ฌ์ฉ์์๊ฒ ์น์ํด์ผ ํ๋ ๋ฐ์ํ ๊ฐ์ฒด์
๋๋ค.
Vue์์ ๋ฐ์ํ ์ํ์ ํ์ ์ฌ์ฉ ์ฌ๋ก๋ ๋ ๋๋ง ์ค์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ข
์์ฑ ์ถ์ ๋๋ถ์ ๋ฐ์ํ ์ฌํ๊ฐ ๋ณ๊ฒฝ ๋ ๋ ๋ทฐ๊ฐ ์๋์ผ๋ก ์
๋ฐ์ดํธ๋ฉ๋๋ค. DOM์์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ ๋๋งํ๋ ๊ฒ์ "๋ถ์ํจ๊ณผ"๋ก ๊ฐ์ฃผ๋ฉ๋๋ค: ์ฐ๋ฆฌ์ ํ๋ก๊ทธ๋จ์ ํ๋ก๊ทธ๋จ ์์ฒด(DOM) ์ธ๋ถ์ ์ํ๋ฅผ ์์ ํ๊ณ ์์ต๋๋ค. ๋ฐ์ํ ์ํ์ ๋ฐ๋ผ ๋ถ์ํจ๊ณผ๋ฅผ ์ ์ฉํ๊ณ ์๋์ผ๋ก ๋ค์ ์ ์ฉํ๋ ค๋ฉด watchEffect
API๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import { reactive, watchEffect } from 'vue'
const state = reactive({
count: 0
})
watchEffect(() => {
document.body.innerHTML = `count is ${state.count}`
})
watchEffect
๋ ์ํ๋ ๋ถ์ํจ๊ณผ๋ฅผ ์ ์ฉํ๋ ํจ์๋ฅผ ๊ธฐ๋ํฉ๋๋ค (์ด ๊ฒฝ์ฐ innerHTML
์ค์ ). ํจ์๋ฅผ ์ฆ์ ์คํํ๊ณ ์คํ ์ค์ ์ฌ์ฉํ ๋ชจ๋ ๋ฐ์ ์ํ ์์ฑ์ ์ข
์์ฑ์ผ๋ก ์ถ์ ํฉ๋๋ค. ์ฌ๊ธฐ์ state.count
๋ ์ด๊ธฐ ์คํ ํ์ด ๊ฐ์์์ ๋ํ ์ข
์์ฑ์ผ๋ก ์ถ์ ๋ฉ๋๋ค. ์์ผ๋ก state.count
๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ด๋ถ ํจ์๊ฐ ๋ค์ ์คํ๋ฉ๋๋ค.
์ด๊ฒ์ด Vue์ ๋ฐ์ํ ์์คํ
์ ํต์ฌ์
๋๋ค. ์ปดํฌ๋ํธ์ data()
์์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉด ๋ด๋ถ์ ์ผ๋ก reactive()
์ ์ํด ๋ฐ์์ด ์ด๋ฃจ์ด์ง๋๋ค. ํ
ํ๋ฆฟ์ ์ด๋ฌํ ๋ฐ์ํ ์์ฑ์ ์ฌ์ฉํ๋ ๋ ๋๋ง ํจ์ (๋ณด๋ค ํจ์จ์ ์ธ innerHTML
๋ก ์๊ฐ)๋ก ์ปดํ์ผ ๋ฉ๋๋ค.
watchEffect
๋ 2.xwatch
์ต์ ๊ณผ ์ ์ฌํ์ง๋ง ๊ฐ์๋ ๋ฐ์ดํฐ ์์ค์ ๋ถ์ํจ๊ณผ ์ฝ๋ฐฑ์ ๋ถ๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค. Composition API๋ 2.x ์ต์ ๊ณผ ์ ํํ ๋์ผํ ๋์์ ํ๋watch
๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์์ ์์ ๋ฅผ ๊ณ์ํ๋ฉด ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
function increment() {
state.count++
}
document.body.addEventListener('click', increment)
๊ทธ๋ฌ๋ Vue์ ํ
ํ๋ฆฟ ์์คํ
์ ์ฌ์ฉํ๋ฉด innerHTML
์ด๋ ์๋์ผ๋ก ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฐ๊ฒฐํ ํ์๊ฐ ์์ต๋๋ค. ๊ฐ์์ renderTemplate
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋ฅผ ๋จ์ํํ์ฌ ๋ฐ์์ฑ ์ธก๋ฉด์ ์ง์คํ ์ ์์ต๋๋ค.
import { reactive, watchEffect } from 'vue'
const state = reactive({
count: 0
})
function increment() {
state.count++
}
const renderContext = {
state,
increment
}
watchEffect(() => {
// hypothetical internal code, NOT actual API
renderTemplate(
`<button @click="increment">{{ state.count }}</button>`,
renderContext
)
})
๋๋๋ก ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ์ํ์ ์์กดํ๋ ์ํ๊ฐ ํ์ํฉ๋๋ค. Vue์์๋ ๊ณ์ฐ๋ ์์ฑ ์ผ๋ก ์ฒ๋ฆฌ ๋ฉ๋๋ค. ๊ณ์ฐ๋ ๊ฐ์ ์ง์ ์์ฑํ๊ธฐ ์ํด computed
API๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค :
import { reactive, computed } from 'vue'
const state = reactive({
count: 0
})
const double = computed(() => state.count * 2)
computed
๋ ๋ฌด์์
๋๊น? ๋ด๋ถ์์ computed
์ด ์ด๋ป๊ฒ ๊ตฌํ๋๋ ์ง ์ถ์ธกํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์ต๋๋ค.
// ๋จ์ํ๋ ์์ฌ ์ฝ๋
function computed(getter) {
let value
watchEffect(() => {
value = getter()
})
return value
}
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ์๋๋ค: ๋ง์ฝ value
๊ฐ number
์ ๊ฐ์ ํ๋ฆฌ๋ฏธํฐ๋ธ ํ์
์ด๋ผ๋ฉด, computed
๋ด๋ถ์ ์
๋ฐ์ดํธ ๋ก์ง์ ๋ํ ์ฐ๊ฒฐ์ ๋ฐํ๋๋ฉด ์์ค ๋ ๊ฒ์
๋๋ค. ์ด๋ JavaScript ํ๋ฆฌ๋ฏธํฐ๋ธ ํ์
์ด ์ฐธ์กฐ๊ฐ ์๋ ๊ฐ์ผ๋ก ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ฐ์ด ๊ฐ์ฒด์ ์์ฑ์ผ๋ก ํ ๋น ๋ ๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฐ์ํ ๊ฐ์ ์์ฑ์ผ๋ก ํ ๋น๋๊ฑฐ๋ ํจ์์์ ๋ฐํ ๋ ๋ ๋ฐ์์ฑ์ ์ ์งํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๊ทธ๋ค์ง ์ ์ฉํ์ง ์์ต๋๋ค. ํญ์ ์ต์ ๊ณ์ฐ๊ฐ์ ์ฝ์ ์ ์๊ฒ ํ๋ ค๋ฉด ์ค์ ๊ฐ์ ๊ฐ์ฒด์ ๋ํํ๊ณ ๋์ ํด๋น ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
// ๋จ์ํ๋ ์์ฌ ์ฝ๋
function computed(getter) {
const ref = {
value: null
}
watchEffect(() => {
ref.value = getter()
})
return ref
}
๋ํ ์์กด์ฑ ์ถ์ ๋ฐ ๋ณ๊ฒฝ ์๋ฆผ์ ์ํํ๊ธฐ ์ํด ๊ฐ์ฒด์ .value
์์ฑ์ ๋ํ ์ฝ๊ธฐ/์ฐ๊ธฐ ์์
์ ๊ฐ๋ก ์ฑ ํ์๊ฐ ์์ต๋๋ค (๊ฐ๋จํ๊ฒ ํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์๋ต). ์ด์ ๋ฐ์์ฑ ์์ค์ ๋ํ ๊ฑฑ์ ์์ด ๊ณ์ฐ๋ ๊ฐ์ ์ฐธ์กฐ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค. ๋จ์ ์ ์ต์ ๊ฐ์ ๊ฒ์ํ๊ธฐ ์ํด ์ด์ .value
๋ฅผ ํตํด ๊ฐ์ ์ ๊ทผํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
const double = computed(() => state.count * 2)
watchEffect(() => {
console.log(double.value)
}) // -> 0
state.count++ // -> 2
์ฌ๊ธฐ์์ double์ ๋ณด์ ํ๊ณ ์๋ ๋ด๋ถ๊ฐ์ ๋ํ ๋ฐ์์ฑ ์ฐธ์กฐ๋ก ์ฌ์ฉ๋๋ฏ๋ก "ref"๋ผ๊ณ ํ๋ ๊ฐ์ฒด์ ๋๋ค.
Vue์๋ ์ด๋ฏธ "refs"๋ผ๋ ๊ฐ๋ ์ด ์์ง๋ง ํ ํ๋ฆฟ์์ DOM ์์ ๋๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ์๋ง ํด๋น๋ฉ๋๋ค ("template refs"). ์ฌ๊ธฐ์์ ์๋ก์ด refs ์์คํ ์ด ๋ ผ๋ฆฌ์ ์ธ ์ํ ๋ฐ ํ ํ๋ฆฟ refs์ ์ด๋ป๊ฒ ์ฌ์ฉ ๋ ์ ์๋ ์ง ํ์ธํ์ญ์์ค.
๊ณ์ฐ๋ refs์ธ์, ref
API๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ฐ ๊ฐ๋ณ ์ฐธ์กฐ๋ฅผ ์ง์ ๋ง๋ค ์๋ ์์ต๋๋ค.
const count = ref(0)
console.log(count.value) // 0
count.value++
console.log(count.value) // 1
๋ ๋ ์ปจํ
์คํธ์์ ref๋ฅผ ์์ฑ์ผ๋ก ๋
ธ์ถ ํ ์ ์์ต๋๋ค. ๋ด๋ถ์ ์ผ๋ก Vue๋ ๋ ๋ ์ปจํ
์คํธ์์ ref๊ฐ ๋ฐ์ํ ๋ ์ปจํ
์คํธ๊ฐ ๋ด๋ถ๊ฐ์ ์ง์ ๋
ธ์ถํ๋๋ก ref์ ๋ํด ํน๋ณํ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค. ์ด๋ ํ
ํ๋ฆฟ์์ count.value
๋์ count
๋ฅผ ์ง์ ์ธ ์ ์์์ ์๋ฏธํฉ๋๋ค.
๋ค์์ reactive
๋์ ref
๋ฅผ ์ฌ์ฉํ๋ ๋์ผํ ์นด์ดํฐ ์์ ์ ๋ฒ์ ์
๋๋ค.
import { ref, watch } from 'vue'
const count = ref(0)
function increment() {
count.value++
}
const renderContext = {
count,
increment
}
watchEffect(() => {
renderTemplate(
`<button @click="increment">{{ count }}</button>`,
renderContext
)
})
๋ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ ๊ฐ์ฒด ์๋์ ์์ฑ์ผ๋ก ์ค์ฒฉ๋๋ฉด ์ ๊ทผ ์ ์๋์ผ๋ก ๋ํ๋์ง ์์ต๋๋ค.
const state = reactive({
count: 0,
double: computed(() => state.count * 2)
})
// `state.double.value` ๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค.
console.log(state.double)
์ฐ๋ฆฌ ์ฝ๋๋ ์ด๋ฏธ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ผ ์ ๋ฐ์ดํธ ํ ์ ์๋ ์๋ํ๋ UI๋ฅผ ์ ๊ณตํ์ง๋ง ์ฝ๋๋ ํ๋ฒ๋ง ์คํ๋๋ฉฐ ์ฌ์ฌ์ฉ ํ ์ ์์ต๋๋ค. ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฌ์ฉํ๋ ค๋ฉด ํฉ๋ฆฌ์ ์ธ ๋ค์ ๋จ๊ณ๋ก ๋ ผ๋ฆฌ๋ฅผ ํจ์๋ก ๋ฆฌํฉํ ๋ง ํ๋ ๊ฒ์ ๋๋ค.
import { reactive, computed, watchEffect } from 'vue'
function setup() {
const state = reactive({
count: 0,
double: computed(() => state.count * 2)
})
function increment() {
state.count++
}
return {
state,
increment
}
}
const renderContext = setup()
watchEffect(() => {
renderTemplate(
`<button @click="increment">
Count is: {{ state.count }}, double is: {{ state.double }}
</button>`,
renderContext
)
})
์์ ์ฝ๋๊ฐ ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ์กด์ฌ์ ์์กดํ์ง ์๋ ๋ฐฉ๋ฒ์ ์ ์ํ์ญ์์ค. ์ค์ ๋ก ์ง๊ธ๊น์ง ์๊ฐ๋ API๋ ๋ชจ๋ ์ปดํฌ๋ํธ์ ์ปจํ ์คํธ ์ธ๋ถ์์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ณด๋ค ๋ค์ํ ์๋๋ฆฌ์ค์์ Vue์ ๋ฐ์์ฑ ์์คํ ์ ํ์ฉํ ์ ์์ต๋๋ค.
์ด์ setup()
ํธ์ถ, ๊ฐ์์ ์์ฑ ๋ฐ ํ
ํ๋ฆฟ์ ํ๋ ์์ํฌ๋ก ๋ ๋๋ง ํ๋ ์์
์ ๋ง์น๋ฉด setup()
ํจ์์ ํ
ํ๋ฆฟ๋ง์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ ์ ํ ์ ์์ต๋๋ค.
<template>
<button @click="increment">
Count is: {{ state.count }}, double is: {{ state.double }}
</button>
</template>
<script>
import { reactive, computed } from 'vue'
export default {
setup() {
const state = reactive({
count: 0,
double: computed(() => state.count * 2)
})
function increment() {
state.count++
}
return {
state,
increment
}
}
}
</script>
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ ์๊ณ ์๋ ๋จ์ผ ํ์ผ ์ปดํฌ๋ํธ ํ์์ด๋ฉฐ ๋
ผ๋ฆฌ ํ์(<script>
) ๋ง ๋ค๋ฅธ ํ์์ผ๋ก ํํ๋ฉ๋๋ค. ํ
ํ๋ฆฟ ๊ตฌ๋ฌธ์ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค. <script>
์ ์๋ต๋์์ง๋ง ์ ํํ ๋์ผํ๊ฒ ์๋ํฉ๋๋ค.
์ง๊ธ๊น์ง ์ปดํฌ๋ํธ์ ์์ํ ์ํ ์ธก๋ฉด์ธ ์ฌ์ฉ์ ์ํ์ ๋ฐ์ ์ํ, ๊ณ์ฐ๋ ์ํ ๋ฐ ๋ณ๊ฒฝ ์ํ์ ๋ํด ์ดํด ๋ณด์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ปดํฌ๋ํธ๋ ๋ถ์ํจ๊ณผ๋ฅผ ์ํํด์ผ ํ ์๋ ์์ต๋๋ค (์: ์ฝ์ ๋ก๊น
, ajax ์์ฒญ ์ ์ก ๋๋ window
์์ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ค์ ). ์ด๋ฌํ ๋ถ์ํจ๊ณผ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์ ํ์ด๋ฐ์ ์ํ๋ฉ๋๋ค.
- ์ํ๊ฐ ๋ณํ ๋
- ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ, ์ ๋ฐ์ดํธ ๋๋ ๋ง์ดํธ ํด์ ๋ ๋(๋ผ์ดํ์ฌ์ดํด ํ )
์ฐ๋ฆฌ๋ watchEffect
์ watch
API๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ๋ณํ์ ๋ฐ๋ผ ๋ถ์ํจ๊ณผ๋ฅผ ์ ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์๋ก ๋ค๋ฅธ ๋ผ์ด๋ธ์ฌ์ดํด ํ
์์ ๋ถ์ํจ๊ณผ๋ฅผ ์ํํ๊ธฐ ์ํด ์ ์ฉ onXXX
API(๊ธฐ์กด ๋ผ์ดํ์ฌ์ดํด ์ต์
์ ์ง์ ๋ฏธ๋ฌ๋ง)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import { onMounted } from 'vue'
export default {
setup() {
onMounted(() => {
console.log('component is mounted!')
})
}
}
์ด๋ฌํ ๋ผ์ดํ์ฌ์ดํด ๋ฑ๋ก ๋ฐฉ๋ฒ์ setup
ํ
์ ํธ์ถํ๋ ๋์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ด๋ถ ์ ์ญ ์ํ๋ฅผ ์ฌ์ฉํ์ฌ setup
ํ
์ ํธ์ถํ๋ ํ์ฌ ์ธ์คํด์ค๋ฅผ ์๋์ผ๋ก ์์๋
๋๋ค. ์ด ๊ธฐ๋ฅ์ ์๋์ ์ผ๋ก ๋
ผ๋ฆฌ๋ฅผ ์ธ๋ถ ๊ธฐ๋ฅ์ผ๋ก ์ถ์ถ ํ ๋ ๋ง์ฐฐ์ ์ค์ด๋๋ก ์ค๊ณ๋์์ต๋๋ค.
์ด๋ฌํ API์ ๋ํ ์์ธํ ๋ด์ฉ์ API Reference ์์ ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค๊ณ ์ธ๋ถ ์ฌํญ์ ํ๊ธฐ ์ ์ ๋ค์ ์น์ ์ ๋ง๋ฌด๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด ์์ ์์ ๊ฐ์ ธ์จ ํจ์๋ก ์ปดํฌ๋ํธ API๋ฅผ ๋ณต์ ํ์ต๋๋ค. ์ต์ ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ๋ ๊ฒ์ ํฐ ๊ธฐ๋ฅ์ผ๋ก ๋ชจ๋ ๊ฒ์ ํจ๊ป ํผํฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ์ฒด๊ณ์ ์ผ๋ก ๋ณด์ ๋๋ค!
์ดํดํ ์ ์๋ ์ฒซ์ธ์์ ๋๋ค. ๊ทธ๋ฌ๋ ๋๊ธฐ ๋ถ์ฌ ์น์ ์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ Composition API๋ ์ค์ ๋ก ๋ณต์กํ ์ปดํฌ๋ํธ์์ ๋ณด๋ค ์ฒด๊ณ์ ์ธ ์ฝ๋๋ฅผ ์์ฑ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ด์ ๋ฅผ ์ค๋ช ํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
ํ ๊ฑธ์ ๋ฌผ๋ฌ์์ "์กฐ์งํ๋ ์ฝ๋"์ ๋ํด ์ด์ผ๊ธฐ ํ ๋ ์ค์ ๋ก ๋ฌด์์ ์๋ฏธํ๋ ์ง ์๊ฐํด ๋ด ์๋ค. ์ฝ๋๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ ์งํ๋ ์ต์ข ๋ชฉํ๋ ์ฝ๋๋ฅผ ๋ณด๋ค ์ฝ๊ฒ ์ฝ๊ณ ์ดํดํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋๋ฅผ "์ดํด"ํ๋ค๋ ๊ฒ์ ๋ฌด์์ ์๋ฏธํฉ๋๊น? ์ปดํฌ๋ํธ์ ํฌํจ๋ ์ต์ ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ๋ฅผ "์ดํด"ํ๋ค๊ณ ์ค์ ๋ก ๋งํ ์ ์์ต๋๊น? ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ํฐ ์ปดํฌ๋ํธ๋ฅผ ๋ณธ ์ ์ด ์์ต๋๊น? (์๋ฅผ ๋ค์ด ์ด๊ฒ) ๊ทธ๋ฆฌ๊ณ ๋จธ๋ฆฌ๋ฅผ ๊ฐ์ธ๋งค๊ณ ํ๋ ์๊ฐ์ ๋ณด๋ด๊ณ ์์ต๋๊น?
์์ ๋งํฌ์ ๊ฐ์ ํฐ ์ปดํฌ๋ํธ๋ฅผ ํตํด ๋๋ฃ ๊ฐ๋ฐ์๋ฅผ ์ด๋ป๊ฒ ๋์ธ ์ ์์์ง ์๊ฐํด๋ณด์ญ์์ค. "์ด ์ปดํฌ๋ํธ๋ ์ด๋ฌํ ๋ฐ์ดํฐ ์์ฑ, ๊ณ์ฐ๋ ์์ฑ ๋ฐ ๋ฐฉ๋ฒ์ ๊ฐ์ง๊ณ ์์ต๋๋ค" ๋์ "์ด ์ปดํฌ๋ํธ๋ X, Y ๋ฐ Z๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค"๋ก ์์ํ ๊ฒ์ ๋๋ค. ์ปดํฌ๋ํธ๋ฅผ ์ดํดํ๋ ๋ฐ ์์ด "์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉํ๋ ์ต์ "๋ณด๋ค๋ "์ปดํฌ๋ํธ๊ฐ ์ํํ๋ ค๋ ์์ " (์ฆ, ์ฝ๋์ ์๋)์ ๋ ๊ด์ฌ์ด ์์ต๋๋ค. ์ต์ ๊ธฐ๋ฐ API๋ก ์์ฑ๋ ์ฝ๋๋ ํ์์ ์์ฐ์ค๋ฝ๊ฒ ์๋ตํ์ง๋ง ์ ์๋ฅผ ํํํ๋ ๋ฐ ๋ค์ ์ด์ ํ ์์ ์ ์ํํฉ๋๋ค.
์ปดํฌ๋ํธ๊ฐ ์ฒ๋ฆฌํ๋ "๋ ผ๋ฆฌ์ ๋ฌธ์ "๋ก "X, Y ๋ฐ Z"๋ฅผ ์ ์ํด ๋ด ์๋ค. ์ ์ฒด ์ปดํฌ๋ํธ๊ฐ ํ๋์ ๋ ผ๋ฆฌ์ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ ์ฑ ๋ฌธ์ ๋ ์ผ๋ฐ์ ์ผ๋ก ์์ ๋จ์ผ ๋ชฉ์ ์ปดํฌ๋ํธ์๋ ์กด์ฌํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก์์๋ ์ด ๋ฌธ์ ๊ฐ ํจ์ฌ ๋๋๋ฌ์ง๋๋ค. ์๋ก์ Vue CLI UI file explorer ๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ปดํฌ๋ํธ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ ผ๋ฆฌ์ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
- ํ์ฌ ํด๋ ์ํ ์ถ์ ๋ฐ ๋ด์ฉ ํ์
- ํด๋ ํ์ ์ฒ๋ฆฌ (์ด๊ธฐ, ๋ซ๊ธฐ, ์๋ก ๊ณ ์นจ)
- ์ ํด๋ ์์ฑ ์ฒ๋ฆฌ
- ์ฆ๊ฒจ ์ฐพ๊ธฐ ํด๋๋ง ํ์ ์ ํ
- ์จ๊น ํด๋ ํ์ ์ ํ
- ํ์ฌ ์์ ๋๋ ํ ๋ฆฌ ๋ณ๊ฒฝ ์ฒ๋ฆฌ
์ต์ ๊ธฐ๋ฐ ์ฝ๋๋ฅผ ์ฝ์์ผ๋ก์จ ์ด๋ฌํ ๋ ผ๋ฆฌ์ ๋ฌธ์ ๋ฅผ ์ฆ์ ์ธ์ํ๊ณ ๊ตฌ๋ถํ ์ ์์ต๋๊น? ํ์คํ ์ด๋ ต์ต๋๋ค. ํน์ ๋ ผ๋ฆฌ์ ๋ฌธ์ ์ ๊ด๋ จ๋ ์ฝ๋๊ฐ ์ข ์ข ์กฐ๊ฐ ๋๊ณ ํฉ์ด์ ธ ์์์ ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด "์ ํด๋ ๋ง๋ค๊ธฐ" ๊ธฐ๋ฅ์ ๋ ๋ฐ์ดํฐ ์์ฑ, ํ๋์ ๊ณ์ฐ๋ ์์ฑ ๋ฐ ๋ฉ์๋ - ๋ฉ์๋๋ ๋ฐ์ดํฐ ์์ฑ์์ 100 ์ค ์ด์ ๋จ์ด์ง ์์น์ ์ ์๋ฉ๋๋ค.
์ด๋ฌํ ๋ ผ๋ฆฌ์ ๋ฌธ์ ๋ฅผ ๊ฐ๊ฐ ์์์ผ๋ก ๊ตฌ๋ถํ๋ฉด ์ปดํฌ๋ํธ ์ต์ ์ผ๋ก ํํํ ๋ ์กฐ๊ฐํ๊ฐ ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง ์ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋จํธํ๋ ๋ณต์กํ ์ปดํฌ๋ํธ๋ฅผ ์ดํดํ๊ณ ์ ์งํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ์ต์ ์ ํตํด ๊ฐ์ ๋ถ๋ฆฌ๋ ๊ทผ๋ณธ์ ์ธ ๋ ผ๋ฆฌ์ ๋ฌธ์ ๋ฅผ ๋ชจํธํ๊ฒ ํฉ๋๋ค. ๋ํ ํ๋์ ๋ ผ๋ฆฌ์ ๋ฌธ์ ์ ๋ํด ์์ ํ ๋ ํด๋น ๋ฌธ์ ์ ๊ด๋ จ๋ ๋ถ๋ถ์ ์ฐพ๊ธฐ ์ํด ์ต์ ๋ธ๋ก ์ฃผ์๋ฅผ ์ง์์ ์ผ๋ก "์ ํ"ํด์ผ ํฉ๋๋ค.
์ฐธ๊ณ : ์๋ ์ฝ๋๋ ๋ช ๊ตฐ๋ฐ ๊ฐ์ ๋ ์ ์์ง๋ง ์ค์ ๋ก ์์ฑํ ์ค์ ์ฝ๋์ ์๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์์ ์์ด ์ต์ ์ปค๋ฐ์ ๋ณด์ฌ์ค๋๋ค(์ด ๊ธ์ ์ฐ๋ ์์ ์์).
๋์ผํ ๋ ผ๋ฆฌ์ ๋ฌธ์ ์ ๊ด๋ จ๋ ์ฝ๋๋ฅผ ํจ๊ป ๋ฐฐ์นํ ์ ์๋ค๋ฉด ํจ์ฌ ๋ ์ข์ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก Composition API๊ฐ ํ ์ ์๋ ์ผ์ ๋๋ค. "์ ํด๋ ๋ง๋ค๊ธฐ" ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
function useCreateFolder (openFolder) {
// ์๋ ๋ฐ์ดํฐ ์์ฑ
const showNewFolder = ref(false)
const newFolderName = ref('')
// ์๋ ๊ณ์ฐ๋ ์์ฑ
const newFolderValid = computed(() => isValidMultiName(newFolderName.value))
// ์๋ ๋ฉ์๋
async function createFolder () {
if (!newFolderValid.value) return
const result = await mutate({
mutation: FOLDER_CREATE,
variables: {
name: newFolderName.value
}
})
openFolder(result.data.folderCreate.path)
newFolderName.value = ''
showNewFolder.value = false
}
return {
showNewFolder,
newFolderName,
newFolderValid,
createFolder
}
}
์ ํด๋ ๋ง๋ค๊ธฐ ๊ธฐ๋ฅ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ๋
ผ๋ฆฌ๊ฐ ์ด์ ๋จ์ผ ๊ธฐ๋ฅ์ผ๋ก ๋ฐฐ์น๋๊ณ ์บก์ํ๋๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ชฉํ์ญ์์ค. ์ด ๊ธฐ๋ฅ์ ์ค๋ช
์ ์ธ ์ด๋ฆ์ผ๋ก ์ธํด ์์ฒด ๋ฌธ์ํ๋์ด ์์ต๋๋ค. ์ด๊ฒ์ ์ปดํฌ์ง์
ํจ์ ๋ผ๊ณ ํฉ๋๋ค. use
๋ก ํจ์ ์ด๋ฆ์ ์์ํ์ฌ ์ปดํฌ์ง์
ํจ์์์ ๋ํ๋ด๋ ๊ฒ์ด ๊ถ์ฅ๋๋ ๊ท์น์
๋๋ค. ์ด ํจํด์ ์ปดํฌ๋ํธ์ ๋ค๋ฅธ ๋ชจ๋ ๋
ผ๋ฆฌ์ ๋ฌธ์ ์ ์ ์ฉ๋ ์ ์์ผ๋ฉฐ ์ฌ๋ฌ ๊ฐ์ง ๊ธฐ๋ฅ์ด ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค.
์ด ๋น๊ต์๋ import ๋ฌธ๊ณผ
setup()
ํจ์๋ ์ ์ธ๋ฉ๋๋ค. Composition API๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๊ตฌํ ๋ ์ ์ฒด ์ปดํฌ๋ํธ๋ ์ฌ๊ธฐ์์ ์ฐพ์ ์ ์์ต๋๋ค.
๊ฐ ๋ ผ๋ฆฌ์ ๋ฌธ์ ์ ๋ํ ์ฝ๋๋ ์ด์ ์ปดํฌ์ง์ ํจ์๋ก ํจ๊ป ๋ฐฐ์น๋ฉ๋๋ค. ๋ฐ๋ผ์ ํฐ ์ปดํฌ๋ํธ๋ฅผ ๋ค๋ฃฐ ๋ ์ผ์ ํ "์ ํ"๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์ปดํฌ์ง์ ํจ์๋ฅผ ํธ์ง๊ธฐ์์ ์ ์ด ์ปดํฌ๋ํธ๋ฅผ ํจ์ฌ ์ฝ๊ฒ ์ค์บํ ์ ์์ต๋๋ค.
export default {
setup() { // ...
}
}
function useCurrentFolderData(networkState) { // ...
}
function useFolderNavigation({ networkState, currentFolderData }) { // ...
}
function useFavoriteFolder(currentFolderData) { // ...
}
function useHiddenFolders() { // ...
}
function useCreateFolder(openFolder) { // ...
}
setup()
ํจ์๋ ์ด์ ๋ชจ๋ ์ปดํฌ์ง์
ํจ์๊ฐ ํธ์ถ๋๋ ์ง์
์ ์ญํ ์ ํฉ๋๋ค.
export default {
setup () {
// Network
const { networkState } = useNetworkState()
// Folder
const { folders, currentFolderData } = useCurrentFolderData(networkState)
const folderNavigation = useFolderNavigation({ networkState, currentFolderData })
const { favoriteFolders, toggleFavorite } = useFavoriteFolders(currentFolderData)
const { showHiddenFolders } = useHiddenFolders()
const createFolder = useCreateFolder(folderNavigation.openFolder)
// Current working directory
resetCwdOnLeave()
const { updateOnCwdChanged } = useCwdUtils()
// Utils
const { slicePath } = usePathUtils()
return {
networkState,
folders,
currentFolderData,
folderNavigation,
favoriteFolders,
toggleFavorite,
showHiddenFolders,
createFolder,
updateOnCwdChanged,
slicePath
}
}
}
๋ฌผ๋ก , ์ด๊ฒ์ ์ต์
API๋ฅผ ์ฌ์ฉํ ๋ ์์ฑํ ํ์๊ฐ ์๋ ์ฝ๋์
๋๋ค. ๊ทธ๋ฌ๋ setup()
ํจ์๊ฐ ์ปดํฌ๋ํธ๊ฐ ๋ฌด์์ ํ๋ ค๊ณ ํ๋์ง์ ๋ํ ๊ตฌ๋ ์ค๋ช
๊ณผ ๊ฑฐ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฝ์ต๋๋ค. ์ด๊ฒ์ ์ต์
๊ธฐ๋ฐ ๋ฒ์ ์์ ์์ ํ ๋๋ฝ๋ ์ ๋ณด์
๋๋ค. ๋ํ ์ ๋ฌ๋๋ ์ธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปดํฌ์ง์
ํจ์๊ฐ์ ์ข
์์ฑ ํ๋ฆ์ ๋ช
ํํ๊ฒ ๋ณผ ์ ์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ๋ฐํ๋ฌธ์ ํ
ํ๋ฆฟ์ ๋
ธ์ถ๋ ๋ด์ฉ์ ํ์ธํ๋ ๋จ์ผ ์ฅ์ ์ญํ ์ ํฉ๋๋ค.
๋์ผํ ๊ธฐ๋ฅ์ด ์ฃผ์ด์ง๋ฉด ์ต์ ์ ํตํด ์ ์๋ ์ปดํฌ๋ํธ์ ์ปดํฌ์ง์ ํจ์๋ฅผ ํตํด ์ ์๋ ์ปดํฌ๋ํธ๋ ๋์ผํ ๊ธฐ๋ณธ ๋ ผ๋ฆฌ๋ฅผ ํํํ๋ ๋ ๊ฐ์ง ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ํ๋ ๋๋ค. ์ต์ ๊ธฐ๋ฐ API๋ฅผ ์ฌ์ฉํ๋ฉด ์ต์ ํ์ ์ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌ์ฑํด์ผํ์ง๋ง Composition API๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ผ๋ฆฌ์ ๋ฌธ์ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
Composition API๋ ์ปดํฌ๋ํธ์์ ๋ก์ง์ ์ถ์ถํ๊ณ ์ฌ์ฌ์ฉํ ๋ ๋งค์ฐ ์ ์ฐํฉ๋๋ค. ์ปดํฌ์ง์
ํจ์๋ ๋ง๋ฒ์ this
์ปจํ
์คํธ์ ์์กดํ๋ ๋์ ์ธ์์ ์ ์ธ๊ณ์ ์ผ๋ก ๊ฐ์ ธ์จ Vue API์๋ง ์์กดํฉ๋๋ค. ๋จ์ํ ์ปดํฌ๋ํธ ๋ก์ง์ ํจ์๋ก ๋ด๋ณด๋ด์ ์ปดํฌ๋ํธ ๋ก์ง์ ์ผ๋ถ๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ์ ์ ์ฒด setup
ํจ์๋ฅผ ๋ด๋ณด๋ด์ extends
์ ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ ์๋ ์์ต๋๋ค.
์๋ฅผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค: ๋ง์ฐ์ค ์์น ์ถ์ .
import { ref, onMounted, onUnmounted } from 'vue'
export function useMousePosition() {
const x = ref(0)
const y = ref(0)
function update(e) {
x.value = e.pageX
y.value = e.pageY
}
onMounted(() => {
window.addEventListener('mousemove', update)
})
onUnmounted(() => {
window.removeEventListener('mousemove', update)
})
return { x, y }
}
๋ค์์ ์ปดํฌ๋ํธ๊ฐ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
import { useMousePosition } from './mouse'
export default {
setup() {
const { x, y } = useMousePosition()
// other logic...
return { x, y }
}
}
ํ์ผ ํ์๊ธฐ ์์ ์ Composition API ๋ฒ์ ์์๋ ์ผ๋ถ ์ ํธ๋ฆฌํฐ ์ฝ๋(์: usePathUtils
๋ฐ useCwdUtils
)๋ฅผ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ์ธ๋ถ ํ์ผ๋ก ์ถ์ถํ์ต๋๋ค.
๋ฏน์ค์ธ, ๊ณ ์ฐจ ์ปดํฌ๋ํธ ๋๋ ๋ ๋๋ฆฌ์ค ์ปดํฌ๋ํธ(์ค์ฝํ ์ฌ๋กฏ์ ํตํ)์ ๊ฐ์ ๊ธฐ๋ณธ ํจํด์ ์ฌ์ฉํ์ฌ ์ ์ฌํ ๋ก์ง ์ฌ์ฌ์ฉ์ ๋ฌ์ฑ ํ ์๋ ์์ต๋๋ค. ์ธํฐ๋ท์๋ ์ด๋ฌํ ํจํด์ ์ค๋ช ํ๋ ๋ง์ ์ ๋ณด๊ฐ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์์ ์์ธํ ์ค๋ช ํ์ง๋ ์๊ฒ ์ต๋๋ค. ๋์ ์์ค์ ์์ด๋์ด๋ ์ด๋ฌํ ๊ฐ ํจํด์ด ์ปดํฌ์ง์ ํจ์์ ๋น๊ตํ ๋ ๊ฐ๊ฐ์ ๋จ์ ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
- ๋ ๋๋ง ์ปจํ ์คํธ์ ๋ ธ์ถ๋ ์์ฑ์ ์์ค๊ฐ ๋ช ํํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ๋ฌ ๋ฏน์ค์ธ์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ์ ํ ํ๋ฆฟ์ ์ฝ์ ๋ ํน์ ์์ฑ์ ์ฃผ์ ํ ๋ฏน์ค์ธ์ ๊ตฌ๋ถํ๊ธฐ๊ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ๋ค์ ์คํ์ด์ค ์ถฉ๋. ๋ฏน์ค์ธ์ ์์ฑ ๋ฐ ๋ฉ์๋ ์ด๋ฆ๊ณผ ์ถฉ๋ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฐ๋ฉด HOC๋ prop ์ด๋ฆ๊ณผ ์ถฉ๋ ํ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ. HOC ๋ฐ ๋ ๋๋ฆฌ์ค ์ปดํฌ๋ํธ์๋ ์ฑ๋ฅ ๋น์ฉ์ด ๋๋ ์ถ๊ฐ ์ํ ์ ์ฅ ์ปดํฌ๋ํธ ์ธ์คํด์ค๊ฐ ํ์ํฉ๋๋ค.
Composition API์ ๋น๊ตํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ ํ๋ฆฟ์ ๋ ธ์ถ๋ ์์ฑ์ ์ปดํฌ์ง์ ํจ์์์ ๋ฐํ๋ ๊ฐ์ด๋ฏ๋ก ๋ช ํํ ์์ค๋ฅผ ๊ฐ์ต๋๋ค.
- ์ปดํฌ์ง์ ํจ์์์ ๋ฐํ๋ ๊ฐ์ ์ด๋ฆ์ ์์๋ก ์ง์ ํ ์ ์์ผ๋ฏ๋ก ๋ค์ ์คํ์ด์ค ์ถฉ๋์ด ์์ต๋๋ค.
- ๋ก์ง ์ฌ์ฌ์ฉ์ ์ํด ์์ฑ๋ ๋ถํ์ํ ์ปดํฌ๋ํธ ์ธ์คํด์ค๊ฐ ์์ต๋๋ค.
Composition API๋ ๊ธฐ์กด ์ต์ ๊ธฐ๋ฐ API์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Composition API๋ 2.x ์ต์
(
data
,computed
&methods
) ์ด์ ์ ํด๊ฒฐ๋์์ผ๋ฉฐ ํด๋น ์ต์ ์ผ๋ก ์ ์๋ ์์ฑ์ ์ ๊ทผํ ์ ์์ต๋๋ค. -
setup()
์์ ๋ฐํ๋ ์์ฑ์this
์ ๋ ธ์ถ๋๋ฉฐ 2.x ์ต์ ๋ด์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ค๋๋ ๋ง์ Vue ํ๋ฌ๊ทธ์ธ์ this
์ ์์ฑ์ ์ฃผ์
ํฉ๋๋ค. ์๋ฅผ ๋ค์ด Vue Router๋ this.$route
์ this.$router
๋ฅผ ์ฃผ์
ํ๊ณ Vuex๋ this.$store
๋ฅผ ์ฃผ์
ํฉ๋๋ค. ๊ฐ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉ์๊ฐ ์ฃผ์
๋ ์์ฑ์ ๋ํ Vue ํ์ดํ์ ๊ฐํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํ์
์ถ๋ก ์ด ๊น๋ค๋ก์์ก์ต๋๋ค.
Composition API๋ฅผ ์ฌ์ฉํ ๋๋ this
๊ฐ ์์ต๋๋ค. ๋์ ํ๋ฌ๊ทธ์ธ ๋ด๋ถ์ ์ผ๋ก provide
์ inject
๋ฅผ ํ์ฉํ๊ณ ์ปดํฌ์ง์
ํจ์๋ฅผ ๋
ธ์ถํฉ๋๋ค. ๋ค์์ ํ๋ฌ๊ทธ์ธ์ ๋ํ ๊ฐ์ ์ฝ๋์
๋๋ค.
const StoreSymbol = Symbol()
export function provideStore(store) {
provide(StoreSymbol, store)
}
export function useStore() {
const store = inject(StoreSymbol)
if (!store) {
// throw error, no store provided
}
return store
}
๊ทธ๋ฆฌ๊ณ ์ฝ๋๋ฅผ ์๋น ํ ๋:
// provide store at component root
//
const App = {
setup() {
provideStore(store)
}
}
const Child = {
setup() {
const store = useStore()
// use the store
}
}
Global API change RFC์ ์ ์๋ ์ฑ ๋ ๋ฒจ ์ ๊ณต์ ํตํด ์คํ ์ด๋ฅผ ์ ๊ณตํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ฉ์ธก ์ปดํฌ๋ํธ์ useStore
์คํ์ผ API๋ ๋์ผํฉ๋๋ค.
Ref๋ ๊ธฐ์ ์ ์ผ๋ก ์ด ์ ์์์ ์๊ฐ๋ ์ ์ผํ ์๋ก์ด ๊ฐ๋
์
๋๋ค. this
์ ๋ํ ์์ธ์ค์ ์์กดํ์ง ์๊ณ ๋ฐ์๊ฐ์ ๋ณ์๋ก ์ ๋ฌํ๊ธฐ ์ํด ๋์
๋์์ต๋๋ค. ๋จ์ ์:
- ์ปดํฌ์ง์
API๋ฅผ ์ฌ์ฉํ ๋, API์ ์์
ํ ๋ ์ ์ ์ ๋ถ๋ด์ ์ฆ๊ฐ ์์ผ์ ์ฐธ์กฐ๊ฐ๊ณผ ์ผ๋ฐ๊ฐ ๋ฐ ๊ฐ์ฒด๋ฅผ ์ง์์ ์ผ๋ก ๊ตฌ๋ถํด์ผ ํฉ๋๋ค.
๋ช ๋ช ๊ท์น(์: ๋ชจ๋ ์ฐธ์กฐ ๋ณ์์ ์ ๋ฏธ์ฌ๋ฅผxxxRef
๋ก ์ฌ์ฉ)์ ์ฌ์ฉํ๊ฑฐ๋ ํ์ ์์คํ ์ ์ฌ์ฉํ๋ฉด ์ ์ ์ ๋ถ๋ด์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค. ๋ฐ๋ฉด์, ์ฝ๋ ๊ตฌ์ฑ์ ์ ์ฐ์ฑ์ด ํฅ์๋๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ ๋ก์ง์ด ๋ก์ปฌ ์ปจํ ์คํธ๊ฐ ๋จ์ํ๊ณrefs
์ ์ค๋ฒํค๋๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌ ํ ์ ์๋ ์์ ๊ธฐ๋ฅ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ๋ ๋ง์ต๋๋ค. -
refs
๋ฅผ ์ฝ๊ณ ๋ณ๊ฒฝํ๋ ๊ฒ์.value
๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ๊ฐ์ผ๋ก ์์ ํ๋ ๊ฒ๋ณด๋ค ๋ ์ฅํฉํฉ๋๋ค.
์ผ๋ถ๋ ์ด๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ปดํ์ผ ํ์ ์ ํ ์ค ์๊ฑฐ(Svelte 3์ ์ ์ฌ)์ ์ ์ํ์ต๋๋ค. ๊ธฐ์ ์ ์ผ๋ก ์คํ ๊ฐ๋ฅํ์ง๋ง Vue์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค(Svelte์ ๋น๊ต์์ ๋ ผ์ ๋จ). ์ฆ, ์ด๊ฒ์ Userland์์ Babel ํ๋ฌ๊ทธ์ธ์ผ๋ก ๊ธฐ์ ์ ์ผ๋ก ๊ฐ๋ฅํฉ๋๋ค.
์ฐ๋ฆฌ๋ Ref ๊ฐ๋ ์ ์์ ํ ํผํ๊ณ ๋ฐ์์ฑ ๊ฐ์ฒด๋ง ์ฌ์ฉํ ์ ์๋์ง ์ฌ๋ถ์ ๋ํด ๋ ผ์ํ์ต๋๋ค. ๊ทธ๋ฌ๋:
- ๊ณ์ฐ๋ ๊ฒํฐ๋ ํ๋ฆฌ๋ฏธํฐ๋ธ ํ์ ์ ๋ฐํ ํ ์ ์์ผ๋ฏ๋ก Ref์ ์ ์ฌํ ์ปจํ ์ด๋๋ ํผํ ์ ์์ต๋๋ค.
- ํ๋ฆฌ๋ฏธํฐ๋ธ ํ์ ๋ง ์์ํ๊ฑฐ๋ ๋ฐํํ๋ ์ปดํฌ์ง์ ํจ์๋ ๋ฐ์์ฑ์ ์ํด ๊ฐ์ฒด์ ๊ฐ์ ๋ฉํํด์ผ ํฉ๋๋ค. ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ํ์ค ๊ตฌํ์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ์์ ๋ง์ Ref์ ์ ์ฌํ ํจํด(๊ทธ๋ฆฌ๊ณ ์์ฝ์์คํ ํํธํ)์ ๊ฐ๋ฐํ๊ฒ ๋ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
๋น์ฐํ, ์ฌ์ฉ์๋ refs
๊ณผ reactive
์ฌ์ด์์ ์ด๋ ๊ฒ์ ์ฌ์ฉํด์ผ ํ ์ง ํผ๋ ๋ ์ ์์ต๋๋ค. ์์์ผ ํ ์ฒซ ๋ฒ์งธ ์ฌํญ์ Composition API๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ดํดํด์ผํ๋ค๋ ๊ฒ์
๋๋ค. ํ๋๋ฅผ ๋
์ ์ ์ผ๋ก ์ฌ์ฉํ๋ฉด ๋ํดํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ ๋ฐํด์ ์ฌ๋ฐ๋ช
๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
refs
์ reactive
์ ์ฐจ์ด์ ์ ํ์ค JavaScript ๋ก์ง์ ์์ฑํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ค์ ๋น๊ต ๋ ์ ์์ต๋๋ค.
// ์ฒซ๋ฒ์งธ ์คํ์ผ: ๋ณ๋์ ๋ณ์
let x = 0
let y = 0
function updatePosition(e) {
x = e.pageX
y = e.pageY
}
// --- ๋น๊ตํด์ ---
// ๋๋ฒ์งธ ์คํ์ผ: ๋จ์ผ ๊ฐ์ฒด
const pos = {
x: 0,
y: 0
}
function updatePosition(e) {
pos.x = e.pageX
pos.y = e.pageY
}
-
ref
๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ์ฒซ๋ฒ์งธ ์คํ์ผ์refs
๋ฅผ ์ฌ์ฉํ์ฌ ๋ณด๋ค ๊ธฐ๋ณธ์ ์ผ๋ก ๋๋ฑํ ํํ์ผ๋ก ๋ณํํ๊ณ ์์ต๋๋ค(์์๊ฐ์ ๋ฐ์์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด). - ๋ฐ์์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ฒ์งธ ์คํ์ผ๊ณผ ๊ฑฐ์ ๋์ผํฉ๋๋ค. ์ฐ๋ฆฌ๋
reactive
๋ก๋ง ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋๋ค.
ํ์ง๋ง reactive
๋ง ์ฌ์ฉํ๋ ๋ฌธ์ ๋ ์ปดํฌ์ง์
ํจ์์ ์ฌ์ฉ์ธก์์ ๋ฐ์์ฑ์ ์ ์งํ๊ธฐ ์ํด ํญ์ ๋ฐํ๋ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. ๊ฐ์ฒด๋ฅผ ํด์ฒดํ๊ฑฐ๋ ํผ์น ์ ์์ต๋๋ค.
// ์ปดํฌ์ง์
ํจ์
function useMousePosition() {
const pos = reactive({
x: 0,
y: 0
})
// ...
return pos
}
// ์ฌ์ฉ์ธก ์ปดํฌ๋ํธ
export default {
setup() {
// ๋ฐ์์ฑ ์์ค๋จ!
const { x, y } = useMousePosition()
return {
x,
y
}
// ๋ฐ์์ฑ ์์ค๋จ!
return {
...useMousePosition()
}
// ์ด๊ฒ์ด ๋ฐ์์ฑ์ ์ ์งํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์
๋๋ค.
// pos๋ฅผ ์๋ ๊ทธ๋๋ก ๋ฐํํ๊ณ x์ y๋ฅผ pos.x์ pos.y๋ก ํฌํ๋ฆฟ์์ ์ฐธ์กฐํด์ผ ํฉ๋๋ค.
return {
pos: useMousePosition()
}
}
}
์ด ์ ์ฝ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๊ธฐ ์ํด toRefs
API๊ฐ ์ ๊ณต๋ฉ๋๋ค. ๋ฐ์ํ ๊ฐ์ฒด์ ๊ฐ ์์ฑ์ ํด๋น ์ฐธ์กฐ๋ก ๋ฐํํฉ๋๋ค.
function useMousePosition() {
const pos = reactive({
x: 0,
y: 0
})
// ...
return toRefs(pos)
}
// x & y are now refs!
const { x, y } = useMousePosition()
์์ฝํ๋ฉด ๋ ๊ฐ์ง ์คํ ๊ฐ๋ฅํ ์คํ์ผ์ด ์์ต๋๋ค.
- ์ผ๋ฐ์ ์ธ JavaScript์์ ํ๋ฆฌ๋ฏธํฐ๋ธ ํ์
๋ณ์์ ๊ฐ์ฒด ๋ณ์๋ฅผ ์ ์ธํ๋ ๋ฐฉ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก
ref
์reactive
๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ด ์คํ์ผ์ ์ฌ์ฉํ ๋๋ IDE๋ฅผ ์ง์ํ๋ ํ์ ์์คํ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. - ๊ฐ๋ฅํ๋ฉด
reactive
๋ฅผ ์ฌ์ฉํ๊ณ ์ปดํฌ์ง์ ํจ์์์ ๋ฐ์ํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ๋toRefs
๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉดrefs
์ ์ ์ ์ ์ธ ์ค๋ฒํค๋๊ฐ ์ค์ด๋ค์ง๋ง ๊ฐ๋ ์ ์ต์ํด์ง ํ์๋ ์์ต๋๋ค.
์ด ๋จ๊ณ์์๋ refs
์ reactive
์ ๋ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์๊ตฌํ๊ธฐ์๋ ๋๋ฌด ์ด๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์ ๋ ๊ฐ์ง ์ต์
์ค์์ ๋ฉํ ๋ชจ๋ธ์ ๋ ์ ๋ง๋ ์คํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ค์ ์ฌ์ฉ์ ํผ๋๋ฐฑ์ ์์งํ๊ณ ๊ฒฐ๊ตญ์ด ์ฃผ์ ์ ๋ํ ๋ณด๋ค ๋ช
ํํ ์ง์นจ์ ์ ๊ณต ํ ๊ฒ์
๋๋ค.
์ผ๋ถ ์ฌ์ฉ์๋ค์ setup()
์ ๋ฐํ๋ฌธ์ด ์ฅํฉํ๊ณ ๋ณด์ผ๋ฟ ํ๋ ์ดํธ์ ๊ฐ์ ๋๋์ ์ฃผ๋ ๊ฒ ์๋๋๋ ์ฐ๋ ค๋ฅผ ์ ๊ธฐํ๊ณ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ช ์์ ์ธ ๋ฐํ๋ฌธ์ด ์ ์ง๋ณด์์ ๋์์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ ํ๋ฆฟ์ ๋ ธ์ถ๋๋ ๋์์ ๋ช ์์ ์ผ๋ก ์ ์ดํ ์ ์์ผ๋ฉฐ ์ปดํฌ๋ํธ์์ ํ ํ๋ฆฟ ์์ฑ์ด ์ ์๋ ์์น๋ฅผ ์ถ์ ํ ๋ ์์ ์์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
setup()
์ ์ ์ธ๋ ๋ณ์๋ฅผ ์๋์ผ๋ก ๋
ธ์ถํ์ฌ ๋ฐํ๋ฌธ์ ์ ํ์ ์ผ๋ก ๋ง๋ค์๋ ์ ์์ด ์์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง, ์ด๊ฒ์ด ํ์ค JavaScript์ ์ง๊ด์ ์ด๊ธ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๊ธฐ๋ณธ๊ฐ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ฉ์ ์์ญ์์ ๋ ๋ฒ๊ฑฐ๋กญ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
-
setup()
์ ์ ์ธ๋ ๋ณ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐํ๋ฌธ์ ์๋์ผ๋ก ์์ฑํ๋ IDE ์ต์คํ ์ - ์์์ ์ผ๋ก ๋ฐํ๋ฌธ์ ์์ฑํ๊ณ ์ฝ์ ํ๋ Babel ํ๋ฌ๊ทธ์ธ
๋ง์ ์ฌ์ฉ์๋ค์ Composition API๊ฐ ์ฝ๋ ๊ตฌ์ฑ์ ๋ ๋ง์ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ง๋ง ๊ฐ๋ฐ์๊ฐ "์ฌ๋ฐ๋ก" ์ํํ๋ ๋ฐ ๋ ๋ง์ ํ๋ จ์ด ํ์ํ๋ค๊ณ ์ง์ ํ์ต๋๋ค. ์ผ๋ถ๋ API๊ฐ ๋ฏธ์ํ ์์ ์คํ๊ฒํฐ ์ฝ๋๋ก ์ด์ด์ง๊น ๊ฑฑ์ ํฉ๋๋ค. ์ฆ, Composition API๋ ์ฝ๋ ํ์ง์ ์ํ์ ์ ๋์ด๋ ๋์์ ํํ์ ์ ๋ฎ์ถ๊ธฐ๋ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ ์ ๋ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๋ค์์ ๋ฏฟ์ต๋๋ค:
- ์ํ์ ์ ์ด๋์ด ํํ์ ์ ์์ค๋ณด๋ค ํฝ๋๋ค.
- ์ ์ ํ ๋ฌธ์ ๋ฐ ์ปค๋ฎค๋ํฐ ์ง์นจ์ ํตํด ์ฝ๋ ๊ตฌ์ฑ ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ผ๋ถ ์ฌ์ฉ์๋ Angular 1 ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๊ณ์์ ์ฝ๋ ์์ฑ์ด ์๋ชป๋๋ ๋ฐฉ๋ฒ์ ์๋ก ๋ค์์ต๋๋ค. Composition API์ Angular 1 ์ปจํธ๋กค๋ฌ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๊ณต์ ๋ฒ์ ์ปจํ ์คํธ์ ์์กดํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ JavaScript ์ฝ๋ ๊ตฌ์ฑ์ ํต์ฌ ๋งค์ปค๋์ฆ์ธ ๋ ผ๋ฆฌ๋ฅผ ๋ณ๋์ ํจ์๋ก ํจ์ฌ ์ฝ๊ฒ ๋ถ๋ฆฌ ํ ์ ์์ต๋๋ค.
๋ชจ๋ JavaScript ํ๋ก๊ทธ๋จ์ ์ํธ๋ฆฌ ํ์ผ๋ก ์์ํฉ๋๋ค(ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ setup()
์ด๋ผ๊ณ ์๊ฐํ์ญ์์ค). ๋
ผ๋ฆฌ์ ์ธ ๊ด์ฌ์ฌ์ ๋ฐ๋ผ ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ฅ๊ณผ ๋ชจ๋๋ก ๋ถํ ํ์ฌ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํฉ๋๋ค. Composition API๋ฅผ ์ฌ์ฉํ๋ฉด Vue ์ปดํฌ๋ํธ ์ฝ๋์ ๋ํด์๋ ๋์ผํ ์์
์ ์ํ ํ ์ ์์ต๋๋ค. ๋ค์ ๋งํด, ์ ๊ตฌ์ฑ๋ JavaScript ์ฝ๋ ์์ฑ ๊ธฐ์ ์ Composition API๋ฅผ ์ฌ์ฉํ ๋ ์ ๊ตฌ์ฑ๋ Vue ์ฝ๋ ์์ฑ ๊ธฐ์ ๋ก ์ง์ ๋ณํ๋ฉ๋๋ค.
Composition API๋ ์์ ํ ๋ถ๊ฐ์ ์ด๋ฉฐ ๊ธฐ์กด 2.x API์ ์ํฅ์ ๋ฏธ์น๊ฑฐ๋ ์ด๋์๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค. @vue/composition
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด 2.x ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ ๊ณต๋์์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฃผ์ ๋ชฉํ๋ API๋ฅผ ์คํํ๊ณ ํผ๋๋ฐฑ์ ์์งํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์
๋๋ค. ํ์ฌ ๊ตฌํ์ ์ด ์ ์์ผ๋ก ์ต์ ์ํ์ด์ง๋ง ํ๋ฌ๊ทธ์ธ์ด๋ผ๋ ๊ธฐ์ ์ ์ ์ฝ์ผ๋ก ์ธํด ์ฝ๊ฐ์ ๋ถ์ผ์น๊ฐ ์์ ์ ์์ต๋๋ค. ์ด ์ ์์ด ์
๋ฐ์ดํธ ๋ ๋ ๋ธ๋ ์ดํฌ ์ฒด์ธ์ง๊ฐ ๋ ์ ์์ผ๋ฏ๋ก ์ด ๋จ๊ณ์์๋ ํ๋ก๋์
์์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฐ๋ฆฌ๋ API๋ฅผ 3.0์ ๋ด์ฅํ์ฌ ์ ๊ณตํ๋ ค๊ณ ํฉ๋๋ค. ๊ธฐ์กด 2.x ์ต์ ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฑ์์ Composition API๋ฅผ ๋ ์ ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ 2.x ์ต์ ์๋ง ์ฌ์ฉ๋๋ ์ฝ๋๋ฅผ ์ญ์ ํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ปดํ์ผ ํ์ ํ๋๊ทธ๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์์ ํ ์ ํ์ฌํญ์ ๋๋ค.
API๋ ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ๊ฐ ์ฃผ๋ก ๋๊ท๋ชจ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํ๋๊ธฐ ๋๋ฌธ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ผ๋ก ์๋ฆฌ๋ฅผ ์ก์ ๊ฒ์ ๋๋ค. ์ค๋ช ์๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ์ค๋ช ์๋ฅผ ์ ๋ฐ ๊ฒ์ฌํ์ง๋ ์์ต๋๋ค. ๋์ ๋ฌธ์์ ์ ์ฉ ์น์ ์ด ์์ต๋๋ค.
ํด๋์ค API๋ฅผ ๋์
ํ๋ ์ฃผ์ ๋ชฉํ๋ ๋ณด๋ค ๋์ TypeScript ์ถ๋ก ์ง์๊ณผ ํจ๊ป ์ ๊ณต๋๋ ๋์ฒด API๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ Vue ๊ตฌ์ฑ ์์๊ฐ ์ฌ๋ฌ ์์ค์์ ์ ์ธ๋ ์์ฑ์ ๋จ์ผ this
์ปจํ
์คํธ๋ก ๋ณํฉํด์ผํ๋ค๋ ์ฌ์ค์ ํด๋์ค ๊ธฐ๋ฐ API์์๋ ์ฝ๊ฐ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํต๋๋ค.
props ์
๋ ฅ์ด ๊ทธ ์์
๋๋ค. props์ this
์ ๋ณํฉํ๋ ค๋ฉด ์ปดํฌ๋ํธ ํด๋์ค์ ์ ๋ค๋ฆญ ์ธ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
๋ค์์ ์ ๋ค๋ฆญ ์ธ์๋ฅผ ์ฌ์ฉํ๋ ์์ ๋๋ค.
interface Props {
message: string
}
class App extends Component<Props> {
static props = {
message: String
}
}
์ ๋ค๋ฆญ ์ธ์์ ์ ๋ฌ๋ ์ธํฐํ์ด์ค๋ type-land์๋ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๋ ์ฌ์ ํ this
์ ๋ํ props ํ๋ก์ฑ ๋์์ ๋ํ ๋ฐํ์ props ์ ์ธ์ ์ ๊ณตํด์ผํฉ๋๋ค. ์ด ์ด์ค ์ ์ธ์ ์ค๋ณต๋๊ณ ์ด์ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋์์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ต๋๋ค.
class App extends Component<Props> {
@prop message: string
}
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํนํ TypeScript์ ํ์ฌ ๊ตฌํ์ด TC39 ์ ์๊ณผ ์์ ํ ์ผ์นํ์ง ์์ ๋ ๋ง์ ๋ถํ์ค์ฑ๊ณผ ํจ๊ป 2๋จ๊ณ ์ฌ์์ ์์กดํฉ๋๋ค. ๋ํ this.$props
์์ ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ ์ธ๋ props ํ์
์ ๋
ธ์ถ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฏ๋ก TSX ์ง์์ด ์ค๋ต๋ฉ๋๋ค. ์ฌ์ฉ์๋ ๊ธฐ์ ์ ์ผ๋ก ์์๋๋ก ์๋ํ์ง ์์ ๋ @prop message: string = 'foo'
๋ก prop์ ๊ธฐ๋ณธ๊ฐ์ ์ ์ธํ ์ ์๋ค๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค.
๋ํ ํ์ฌ ํด๋์ค ๋ฉ์๋์ ์ธ์์ ์ปจํ
์คํธ ํ์ดํ์ ํ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ฆ, ํด๋์ค render
ํจ์์ ์ ๋ฌ๋ ์ธ์๋ ํด๋์ค์ ๋ค๋ฅธ ํน์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ถ๋ก ๋ ํ์
์ ๊ฐ์ง ์ ์์ต๋๋ค.
ํจ์ ๊ธฐ๋ฐ API๋ React Hooks์ ๋์ผํ ์์ค์ ๋
ผ๋ฆฌ ๊ตฌ์ฑ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง ๋ช ๊ฐ์ง ์ค์ํ ์ฐจ์ด์ ์ด ์์ต๋๋ค. React Hooks์ ๋ฌ๋ฆฌ setup()
ํจ์๋ ํ๋ฒ๋ง ํธ์ถ๋ฉ๋๋ค. ์ด๋ Vue์ Composition API๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๊ด์ฉ์ JavaScript ์ฝ๋์ ์ง๊ด๊ณผ ๋ ์ ๋ง์ต๋๋ค.
- ํธ์ถ ์์์ ๋ฏผ๊ฐํ์ง ์์ผ๋ฉฐ ์กฐ๊ฑด๋ถ ์ผ ์ ์์ต๋๋ค.
- ๊ฐ ๋ ๋์์ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถ๋์ง ์์ผ๋ฉฐ GC ์๋ ฅ์ด ์ ์ต๋๋ค.
- ์ธ๋ผ์ธ ํธ๋ค๋ฌ๊ฐ ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ณผ๋ํ๊ฒ ๋ค์ ๋ ๋๋งํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด
useCallback
์ด ๊ฑฐ์ ํญ์ ํ์ํ ๋ฌธ์ ๋ ์๋๋๋ค. - ์ฌ์ฉ์๊ฐ ์ฌ๋ฐ๋ฅธ ์์กด์ฑ ๋ฐฐ์ด์ ์ ๋ฌํ๋ ๊ฒ์ ์์ด ๋ฒ๋ฆฐ ๊ฒฝ์ฐ
useEffect
๋ฐuseMemo
๊ฐ ์ค๋๋ ๋ณ์๋ฅผ ์บก์ฒ ํ ์ ์๋ ๋ฌธ์ ๋ ์๋๋๋ค. Vue์ ์๋ ์ข ์์ฑ ์ถ์ ๊ธฐ๋ฅ์ ๊ฐ์์์ ๊ณ์ฐ๋ ๊ฐ์ด ํญ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฌดํจํ๋๋๋ก ํฉ๋๋ค.
์ฐ๋ฆฌ๋ React Hooks์ ์ฐฝ์์ฑ์ ์ธ์ ํ๋ฉฐ, ์ด ์ ์์ ์ฃผ์ ์๊ฐ์์ ๋๋ค. ๊ทธ๋ฌ๋ ์์์ ์ธ๊ธํ ๋ฌธ์ ๋ ์ค๊ณ์ ์กด์ฌํ๋ฉฐ Vue์ ๋ฐ์์ฑ ๋ชจ๋ธ์ด ๊ทธ ์ฃผ์์ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
๋น๋ก ๋งค์ฐ ๋ค๋ฅธ ๋ ธ์ ์ ์ ํํ์ง๋ง, Composition API์ Svelte 3์ ์ปดํ์ผ๋ฌ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ์ค์ ๋ก ๊ฐ๋ ์ ์ผ๋ก ์๋นํ ๊ณตํต์ ์ ๋๋ค. ๋จ๊ณ๋ณ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<script>
import { ref, watchEffect, onMounted } from 'vue'
export default {
setup() {
const count = ref(0)
function increment() {
count.value++
}
watchEffect(() => console.log(count.value))
onMounted(() => console.log('mounted!'))
return {
count,
increment
}
}
}
</script>
<script>
import { onMount } from 'svelte'
let count = 0
function increment() {
count++
}
$: console.log(count)
onMount(() => console.log('mounted!'))
</script>
Svelte ์ฝ๋๋ ์ปดํ์ผ ํ์์ ๋ค์์ ์ํํ๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ๊ฒฐํด ๋ณด์ ๋๋ค.
- ์ ์ฒด
<script>
๋ธ๋ก (import ๋ฌธ ์ ์ธ)์ ํ๋ฒ๋ง ์คํํ๋ ๋์ ๊ฐ ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ๋ํด ํธ์ถ๋๋ ํจ์๋ก ์์์ ์ผ๋ก ๋ํํฉ๋๋ค. - ๊ฐ๋ณ ๋ฎคํ ์ด์ ์ ๋ํ ๋ฐ์์ฑ์ ์์์ ์ผ๋ก ๋ฑ๋ก
- ๋ชจ๋ ๋ฒ์ ๋ด ๋ณ์๋ฅผ ๋ ๋ ์ปจํ ์คํธ์ ์์์ ์ผ๋ก ๋ ธ์ถ
-
$
๋ฌธ์ ์ฌ์คํ๋ ์ฝ๋๋ก ์ปดํ์ผ
๊ธฐ์ ์ ์ผ๋ก Vue์์ ๋์ผํ ์์
์ ์ํํ ์ ์์ต๋๋ค (userland Babel ํ๋ฌ๊ทธ์ธ์ ํตํด ๊ฐ๋ฅ). ์ฐ๋ฆฌ๊ฐ ํ์ง ์๋ ์ฃผ๋ ์ด์ ๋ ํ์ค JavaScript์ ๋ํ ์ง์ง ์
๋๋ค. Vue ํ์ผ์ <script>
๋ธ๋ก์์ ์ฝ๋๋ฅผ ์ถ์ถํ๋ฉด ํ์ค ES ๋ชจ๋๊ณผ ๋์ผํ๊ฒ ์๋ํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๋ฐ๋ฉด Svelte <script>
๋ธ๋ก ์์ ์ฝ๋๋ ๊ธฐ์ ์ ์ผ๋ก ๋ ์ด์ ํ์ค JavaScript๊ฐ ์๋๋๋ค. ์ด ์ปดํ์ผ๋ฌ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ ์ ์ด ์์ต๋๋ค.
- ์ฝ๋๋ ์ปดํ์ผ๊ณผ ํจ๊ป / ์ปดํ์ผ ์์ด ๋ค๋ฅด๊ฒ ์๋ํฉ๋๋ค. ํ๋ก๊ทธ๋ ์๋ธ ํ๋ ์์ํฌ๋ก์, ๋ง์ Vue ์ฌ์ฉ์๋ ๋น๋ ์ค์ ์์ด ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ๊ฑฐ๋ ํ์๋ก ํ ์ ์์ผ๋ฏ๋ก ์ปดํ์ผ๋ ๋ฒ์ ์ด ๊ธฐ๋ณธ๊ฐ์ด ๋ ์ ์์ต๋๋ค. ๋ฐ๋ฉด Svelte๋ ์์ ์ ์ปดํ์ผ๋ฌ๋ก ์ง์ ํ๊ณ ๋น๋ ๋จ๊ณ์ ํจ๊ป๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ ํ๋ ์์ํฌ๊ฐ ์์์ ์ผ๋ก ๋ง๋ค๋ ์๋ ํธ๋ ์ด๋ ์คํ์ ๋๋ค.
- ์ฝ๋๋ ์ปดํฌ๋ํธ ๋ด๋ถ / ์ธ๋ถ์์ ๋ค๋ฅด๊ฒ ์๋ํฉ๋๋ค. Svelte ์ปดํฌ๋ํธ์์ ํ์ค JavaScript ํ์ผ๋ก ์กฐ์์ ์ถ์ถํ๋ ค๊ณ ํ ๋, ์ฐ๋ฆฌ๋ ๋ง๋ฒ์ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ์ ์ฝ๊ณ ๋ ์์ธํ ์ ์์ค API ๋ก ๋์ ๊ฐ์ผํฉ๋๋ค.
- Svelte์ ๋ฐ์ํ ์ปดํ์ผ์ ์ต์์ ๋ณ์์ ๋ํด์๋ง ์๋ํฉ๋๋ค. ํจ์ ๋ด์ ์ ์ธ๋ ๋ณ์๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์ผ๋ฏ๋ก ์ปดํฌ๋ํธ ๋ด์ ์ ์ธ๋ ํจ์์์ ๋ฐ์ ์ํ๋ฅผ ์บก์ํ ํ ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฝ๋ ๊ตฌ์ฑ์ ์ฌ์ํ ์ ์ฝ ์กฐ๊ฑด์ ๋ถ์ฌํฉ๋๋ค. ์ด RFC์์ ์ค๋ช ํ๋ฏ์ด ํฐ ์ปดํฌ๋ํธ๋ฅผ ์ ์ง ๊ด๋ฆฌํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ๋นํ์ค ๋ฌธ๋ฒ์ TypeScript์์ ํตํฉ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด๊ฒ์ Svelte 3๊ฐ ๋์ ์๊ฐ์ด๋ผ๊ณ ๊ฒฐ์ฝ ๋งํ์ง ์์ต๋๋ค. ์ฌ์ค ์ด๊ฒ์ ๋งค์ฐ ํ์ ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด๋ฉฐ Rich์ ์์ ์ ๋งค์ฐ ์กด์คํฉ๋๋ค. ๊ทธ๋ฌ๋ Vue์ ์ค๊ณ ์ ์ฝ๊ณผ ๋ชฉํ์ ๋ฐ๋ผ ๋ค๋ฅธ ํธ๋ ์ด๋ ์คํ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.