์ฌ์ฉ์๊ฐ ๋น๋๊ธฐ ์์ ์ ์์กดํ๋ ์๋ช ์ฃผ๊ธฐ ํํฌ๋ฅผ ๊ตฌํํด์ผ ํ๋ ๊ฒฝ์ฐ vue๋ ๊ตฌํ๋ ํํฌ์ ๋น๋๊ธฐ ํน์ฑ์ ์กด์คํ๊ณ vue ๋๋์์ ๋๊ธฐํด์ผ ํฉ๋๋ค.
API๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๋น๋๊ธฐ ํํฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ ๋ฐฉ์๋ฟ์ ๋๋ค.
๊ทธ๋์ ๋น์ ์ ์ํ๋
created () {
return new Promise(resolve => {
setTimeout(() => {
console.log('created')
resolve()
})
})
},
mounted () {
console.log('mounted')
}
ํ์ํ๋ค
mounted
?
๊ธฐ๋ฅ ์์ฒญ์ ์์ฑํ ๋ ์ค์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ์ฌ ์์ฒญ์ ๊ตฌํํ ๊ฐ์น๊ฐ ์๋๋ก ๋ง๋์ญ์์ค.
์ด๊ฒ์ ์ด๋ก ์ ์ผ๋ก ๋ฉ์ง ์์ด๋์ด์ด์ง๋ง ๋ฌ์ฑํ๋ ค๋ฉด ์ํคํ ์ฒ์ ๋ํ ๊ทผ๋ณธ์ ์ธ ์ฌ๊ฒํ /์ฌ์์ฑ์ด ํ์ํ๋ฉฐ ์ ์ฌ์ ์ผ๋ก ์๋ช ์ฃผ๊ธฐ ํํฌ์ ๋๊ธฐ์ ํน์ฑ์ ์์กดํ๋ ๋ง์ ๋ ผ๋ฆฌ๋ฅผ ๊นจ๋จ๋ฆด ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํด๋น ๋ณ๊ฒฝ์ ์ ๋นํํ๋ ค๋ฉด ์ด์ ์ด ์๋นํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด๋ ๊ณง ๋ฐ์ํ์ง ์์ ์์ ํ ์ ๊ทธ๋ ์ด๋๋ฅผ ์ํํ ๊ณํ์ธ ๊ฒฝ์ฐ์๋ง ๊ณ ๋ คํ ์ ์์ต๋๋ค.
์ง๊ธ์ ์ข ๋ฃ๋์ง๋ง ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ์ถ๋ก /์ฌ์ฉ ์ฌ๋ก/์ํฅ์ ์์ ๋กญ๊ฒ ํ์ ์กฐ์น๋ฅผ ์ทจํ์ญ์์ค.
@posva ์ดํด -- ์ฃ์กํฉ๋๋ค. ์ค์ ์ฌ์ฉ ์ฌ๋ก๋ UserPage
ํ์ด์ง ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์์์ user_id
๋ฅผ ์์ ํ ๋ค์( this.$route.params
๋ฅผ ํตํด) ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ค์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ UserPage
๊ตฌ์ฑ ์์๊ฐ ์๋ ๊ฒฝ์ฐ์
๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์๋ฒ์์
this.user = await client.get({type: 'user', id: this.$route.params.id})
์ฌ๊ธฐ์ this.user
๋ UserPage
๊ตฌ์ฑ ์์์ data
๋ถ๋ถ์ ์๋ user
ํ๋๋ฅผ ๋ํ๋
๋๋ค.
์ด์์ ์ผ๋ก๋ ๊ตฌ์ฑ ์์๊ฐ ์์ฑ๋ ํ( this.$route.params
๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก) ํด๋น ์ฝ๋ ํ์ด ์คํ๋๊ธฐ๋ฅผ ์ํ์ง๋ง ๊ตฌ์ฑ ์์๊ฐ ์ค์ ๋ก ๋ง์ดํธ ๋๊ธฐ ์ ์ ํ
ํ๋ฆฟ์์ user
์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค
@yyx990803
๋๋ ์ฌ๊ธฐ์์ ๋ฉ์ฒญํ ์ฌ๋์ผ ์ ์์ง๋ง Vue ๋๋์์ mounted
๋ฑ๊ณผ ๊ฐ์ ์๋ช
์ฃผ๊ธฐ ํํฌ๋ฅผ ํธ์ถํ๊ธฐ ์ ์ await
ํค์๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ง์ด ๋ณ๊ฒฝ๋์ด์ผ ํ์ง ์์ต๋๊น?
์ด๊ฒ์ ๋ด๊ฐ ๊ธฐ๋ค๋ฆฌ๊ณ ์ถ์ ์ค์ ์ฝ๋์ ๋๋ค.
beforeMount: async function() {
this.user = await client.get({type: 'user', id: this.$route.params.id});
}
UserPage
๊ตฌ์ฑ ์์์ ์ผ๋ถ๊ฐ ๋ฉ๋๋ค.
๊ฑฑ์ ๋ง! ๋๋ ๊ทธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์์ํ๊ณ ์์๋ค. ๋ก๋ ์ํ๋ฅผ ํ์ํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ด๋ฏ๋ก vue-router ๋ฌธ์์ ์ค๋ช ๋ ๋๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ตฌ์ฑ ์์ btw๋ฅผ ๋ ๋๋งํ๊ธฐ ์ ์ ์ด๋ฏธ ๋ฐ์ดํฐ๊ฐ ์์ ๋๊น์ง ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค.
์๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด์ ์ฌ์ฉ์ ํ์ด์ง์ ์ ๊ฑฐ๋ ๋ฒ์ ์ธ ์ฌ์ฉ์ ๊ตฌ์ฑ ์์๊ฐ ์๋ ๊ฒฝ์ฐ(์: Facebook์์ ์ฌ์ฉ์ ์ด๋ฆ ์๋ก ๋ง์ฐ์ค๋ฅผ ๊ฐ์ ธ๊ฐ ๋ค์ ํด๋น ํ๋กํ์ "ํผํน"ํ ๋ ๋ํ๋๋ ๊ตฌ์ฑ ์์) ๋ผ์ฐํฐ ์ฌ๊ธฐ์ ํฌํจ๋์ง ์์ผ๋ฉฐ id
๋ ๊ตฌ์ฑ ์์์ ์์ฑ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.
์ฌ๊ธฐ์์ ํฐ ๊ทธ๋ฆผ์ ๋ณด๋ฉด JavaScript์ ํจ์๋ ์ด์ ๋๊ธฐ์ ๋๋ ๋น๋๊ธฐ์์ผ ์ ์์ผ๋ฉฐ ์๋ช ์ฃผ๊ธฐ ํํฌ๋ ํจ์์ด๊ณ ์ฐ๋ฆฌ๊ฐ ์ด๋ฅผ ํจ์๋ก ์๊ฐํ๋ ๋ฐฉ์์ ๋น๋๊ธฐ์ฑ์ ์ง์ํด์ผ ํฉ๋๋ค(๋ด ์ฌ์ฉ ์ฌ๋ก์ ์ง๊ด์ ์ธ "๋๋ฌ"์์ ์ค๋ช ํ ๋๋ก). ๋ด๊ฐ ์ฌ๊ธฐ์์ ์ฌ์ฉํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋ํด).
๋ง์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ null๋ก ์์ํ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ค์ ํ์ฌ ์ค์ ๊ตฌ์ฑ ์์๋ฅผ ํ ๊ธํ๋ ๊ฒ์
๋๋ค(v-if ๋๋ฌธ์). ์ข ๋ ์ด๊ตญ์ ์ธ ๋ฒ์ ์ ๊ตฌ์ฑ ์์๋ฅผ ํด๊ฒฐํ๊ณ <component :is="myDynamicComp"/>
๐๋ฅผ ์ฌ์ฉํ๋ ํจ์์
๋๋ค.
ํ์ง๋ง ๋ฌธ์ ๋ฅผ ์ง๋ฌธ์ผ๋ก ๋์ฉํ์ง ๋ง์ธ์ ๐ ์ด์ ๋ํด ํฌ๋ผ์ด๋ ๋์ค์ฝ๋๋ฅผ ์ฌ์ฉํ์ธ์
์๋์, ์ฝ๋์ ๋ํ ๋์์ ๋ฐ๊ณ ์ถ์ง ์์ต๋๋ค! ์ค์ ๋ก ๊ทํ์ ์ ์๊ณผ ๋งค์ฐ ์ ์ฌํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ด๋ฏธ ๊ตฌํํ์ต๋๋ค. ๋ด๊ฐ ๋งํ๋ ค๋ ๊ฒ์ JS ๋น๋๊ธฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ง๊ด์ ์ด๋ผ๋ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ๊นจ๋ซ์ง ๋ชปํ ๋ถ๋ถ์ ๋น๋๊ธฐ ์ฝ๋์ ๋๊ธฐ ์ฝ๋๊ฐ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๊ธฐ ์ฝ๋๊ฐ ๊ทผ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ ์ฝ๋๋ก ๋ณ๊ฒฝ๋์ง ์๊ณ ์๋ ๊ฐ์ ๋ก ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๊ณ ์ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. yyx990803์ ์ฆ์ ๊ทธ๊ฒ์ ๋ณด์์ง๋ง ๊ทธ์ ์๊ฒฌ์ ์์ ํ ์ดํดํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค. ์๊ฐ ๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ค๊ฐ์ ์ ๋ถ๋ถ์์ ์๋ชป๋ ์์ฌ ์ํต์ด ์์๋ค๋ฉด ์ฃ์กํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ผ๋ฉฐ ๋ช ๊ฐ์ง ์ ์ ๋ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ป๊ณ ์ถ์ต๋๋ค.
MainPage.vue
๋ ๋ด ์ฃผ์ ์ปจํ
์ด๋์
๋๋ค. beforeCreate
์์ ajax "/init"๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ป์ ๋ค์ Vuex.store์ ์ปค๋ฐํฉ๋๋ค.
Content.vue
๋ MainPage.vue
๋ด๋ถ์ ์์์
๋๋ค. Vuex.store์์ ์ค๋ ์ฌ์ฉ์์ ์ญํ ์ ๋ฐ๋ผ mounted
๋จ๊ณ์์ ๋ค๋ฅธ api ํธ์ถ์ ํธ์ถํ๊ณ ์ถ์ต๋๋ค.
async/await ํ๋ฆ์ ์๋ช
์ฃผ๊ธฐ ํธ์ถ์ ์์๋ฅผ ๋ฐ๋ฆ
๋๋ค.
๋ถ๋ชจ beforeCreate -> ๋ถ๋ชจ ๋ง๋ค๊ธฐ -> ์์ beforeCreate -> ์์ ๋ง๋ค๊ธฐ -> ์์ ํ์ฌ .... (๊ตฌ์ฑ ์์ ์๋ช
์ฃผ๊ธฐ์ ๋ํด ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ ๊ฒฝ์ฐ).
ํ์ง๋ง ํ์ฌ Content.vue
์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์ง๊ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ป์ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
๋ง์ ํ์ด์ง(Vue-Router์ ์ปจํ
์ด๋)์์ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ "/init" API๋ฅผ MainPage.vue
๋ด๋ถ์ ์ ์งํ๊ณ ์ถ์ต๋๋ค.
stackoverflow์ ๊ฒ์ ๋ ์ง๋ฌธ
๊ฐ์ฌ ํด์
๊ฐ์น๊ฐ ์๋ ๊ฒ์ ๋ํ hackish ํด๊ฒฐ ๋ฐฉ๋ฒ:
{
created: function(){
this.waitData = asyncCall();
},
mounted: function(){
this.waitData.then(function(data) { ... })
}
}
๊ฐ๋ฅํ ๋ "ํํํ" ์๋ฃจ์ :
{
async created () {
let createdResolve = null
let createdReject = null
this.createdPromise = new Promise(function(resolve, reject){
createdResolve = resolve
createdReject = reject
})
await asyncCall1()
await asyncCall2()
...
createdResolve(someResult)
}
async mounted () {
let result = await this.createdPromise
...
}
data () {
return {
createdPromise: null
}
}
}
์ด๊ฑด ์์ง ์๋๊ฑด๊ฐ์?
data() {
...
},
async created() {
const something = await exampleMethod();
console.log(something);
}
@fifman์ด ์ธ๊ธ
@breadadams ๋ค, ๋ฌผ๋ก ์
๋๋ค. ํจ์ _inside_ created
๋ฉ์๋๊ฐ ๋๊ธฐ๋์ง๋ง created
๋๋ mounted
ํจ์ ์์ฒด๋ ๋๊ธฐํ์ง ์์ต๋๋ค.
๋ทฐ ์ธ์คํด์ค๊ฐ ํธ์ถ ๊ทธ๋์ created
์ฆ๊ฐ์ ๋ฅผ mounted
์ ๊ธด ์คํ์ค์ธ ํ๋ก์ธ์ค์ ์์ created
์์ฑ๋ฉ๋๋ค
์ , ๋ด ๋์ @darren-dev - ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ง๋ง ์ง๊ธ ๋ฌธ์ ๊ฐ ๋ณด์ ๋๋ค. ๋ช ํํ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
@breadadams ์ ํ ๋ฌธ์ ์์ต๋๋ค - ์ฐ๋ฆฌ ๋ชจ๋๋ ์ฐ๋ฆฌ ์์ ์ ๊ฒฝ์ฐ๋ฅผ ์ํด ์ฌ๊ธฐ์ ์์ต๋๋ค. ๋ช ํํ ํ ์ ์์ด์ ๊ธฐ์ฉ๋๋ค!
๋น๋๊ธฐ ์๋ช ์ฃผ๊ธฐ ํํฌ๋ ๋ค์ ์ฃผ ๋ฒ์ ์์ ์ข์ ๊ตฌํ์ด ๋ ์ ์์ต๋๋ค.
์๋ช ์ฃผ๊ธฐ ๋ฐฉ๋ฒ์ ๋ํ ๋น๋๊ธฐ ์ง์์ ํ์ฉํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ UX ๊ดํ์ ์กฐ์ฅํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ป๊ฒ? ๋น๋๊ธฐ ํจ์๋ ์ฆ์ ์๋ฃํ ์ ์๋ ์์ฒญ(์: ์ฅ๊ธฐ ์คํ ๋๋ ๋คํธ์ํฌ ์์ฒญ)์ ์ฌ์ฉ๋ฉ๋๋ค. Vue๊ฐ ์์ฑ ๋๋ ํ์ฌ๋ฅผ ์ง์ฐ์ํค๊ฑฐ๋ ๋คํธ์ํฌ ์์ฒญ์ด๋ ์ฅ๊ธฐ ์คํ ๋น๋๊ธฐ ํ๋ก์ธ์ค๋ฅผ ๊ธฐ๋ค๋ฆฌ๋๋ก ๋ค๋ฅธ ์๋ช ์ฃผ๊ธฐ ๋ฐฉ๋ฒ์ ๊ฐ์ ํ๋ฉด ์ฌ์ฉ์์๊ฒ ๋์ ๋๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ์ ์์ ๋น ํ๋ฉด์ผ๋ก 4์ด ๋์ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๋์ ๊ตฌ์ฑ ์์๊ฐ ์ฌ์ฉ์์ spotty cell ์ฐ๊ฒฐ์ด ๋คํธ์ํฌ ์์ฒญ์ ์๋ฃํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์์ ์์ํด ๋ณด์ญ์์ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ฌ์ฉ์์๊ฒ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ๋ฟ๋ง ์๋๋ผ ์ํฉ์ ๋ํ ํต์ ๋ ฅ์ ํฌ์ํ๊ณ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ก๋ ์๊ฐ์ ๋ ๋นจ๋ฆฌ ์ธ์ํ๋๋ก ํ๊ฑฐ๋ ํ์ ๋๋ ํ์ ๋์ง ์์ ์งํ๋ฅ ํ์๊ธฐ๋ฅผ ํ์ํ๊ธฐ ์ํด ๊ฐ๋ฐ์๋ก์ ํ ์ ์๋ ์ผ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๊ธฐ๋ฅ์ Vue์ ๊ตฌ์ถํ๋ค๊ณ ํด์ ์น์ ๋ ๋์ ๊ณณ์ผ๋ก ๋ง๋๋ ๊ฒ์ ์๋๋๋ค. ๋น์ ์ ๋์ ๊ดํ์ ํ์ฑํํ๊ณ ์์ต๋๋ค.
์ฒ์๋ถํฐ ๋น๋๊ธฐ์ ์ฌ๋ก๋ฅผ ๊ณํํ๊ณ ์ค๊ณํ๋ ๊ฒ์ด ํจ์ฌ ๋ซ์ต๋๋ค. created
๋๋ mounted
๋๋ ์ด๋์์๋ ๋น๋๊ธฐ์ ํ๋ก์ธ์ค๋ฅผ ์์ํ ๋ค์ ๊ตฌ์ฑ ์์์ ๊ณจ๊ฒฉ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ก ํ๊ฑฐ๋ ์ต์
์ ๊ฒฝ์ฐ API๊ฐ ์ฌ์ฉ์์ ๊ถํ์ ๋ฐํํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์คํผ๋. ํจ์ฌ ๋ ๋์ UX์ ์ ์ด๋ฅผ ํฌ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Vue๋ ๋ฒ๋ค์ ๋ ์๊ฒ ์ ์งํ๋ฉด์ ๋น๋๊ธฐ ์๋ช
์ฃผ๊ธฐ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ์น๋ฆฌ ์น๋ฆฌ.
@seanfisher ์ ํจํ ์ง์ ์
๋ฉด์ฑ ์กฐํญ : ๋ค์์ ํ์ด์ง ์์ฑ์ ์ผ๋์ ๋๊ณ ์์ฑ๋์์ต๋๋ค. ๋ด ์ฃผ์ฅ์ด ์ ํจํ์ง ์์ ์ ํจํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๋ถ๋ช ํ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ๋ฐ์์ ๋์์ธ ํจํด์ ์ง์ํ๋ ๊ฒ์ ์ฌ์ฉ ์ค์ธ ํ๋ ์์ํฌ์ ๋งก๊ฒจ์๋ ์ ๋ฉ๋๋ค. ๋ด ์ฃผ์ฅ์ ๋จ๊ณ๊ฐ ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ง ์๋ค๋ฉด ์ ๋ค๋ฅธ ๋จ๊ณ๊ฐ ์์ต๋๊น? ์คํ ์ด์ง๋ฅผ ์์ฑํ ๋ค์ ํ์ฌํ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๊ฒ์ด ํ ๋ฒ์ ์งํ๋๋ค๋ฉด ์์ฑ๋ ๋จ๊ณ๋ ์์ ํ ๋ฌด์ํด๋ ๋ฉ๋๋ค.
๋ง ๊ทธ๋๋ก, ๋ด๊ฐ (์ด๊ธฐ Vue ์ดํ) ์์ฑ๋ ์ ์ผํ ์๊ฐ์ vue์ ์์กดํด์ผ ํ๋ ๋ฌด์ธ๊ฐ๋ฅผ ์ฃผ์ ํด์ผ ํ ๋์์ต๋๋ค. ์ด๋ ๋ด ํ์ด์ง์ ์ค์ ์ด๋ ๋ ์ด์์๊ณผ ์๋ฌด ๊ด๋ จ์ด ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ด์ง๊ฐ ๋ ๋๋ง๋๊ธฐ _์ ์_ ํจ์ฌ ๋ ๋์ (์งง์) ๋น๋๊ธฐ ์์ ์ด ์คํ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ์ต๋๋ค(์: Firebase์ ์ธ์ฆ ๋ฐฉ๋ฒ์ ์ฐ๊ฒฐ). ์ด๋ฅผ ์์ฑํ ๋ค์ ๋ง์ดํธํ๊ธฐ ์ ์ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ฉด ํดํน๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํ์์ฑ์ด ์์ ํ ์ค์ด๋ญ๋๋ค.
๋ด ์ฃผ์ฅ์ Vue๊ฐ ๋ด๊ฐ ์๋ชป ๋ฐ์ ํ๊ณ ์๋ค๊ณ ๋งํด์ ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ํ๋ ๊ธฐ๋ฅ๋ง ์ ๊ณตํ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ๋ฐ์์ ๋์์ธ ํจํด์ ์ง์ํ๋ ๊ฒ์ ์ฌ์ฉ ์ค์ธ ํ๋ ์์ํฌ์ ๋งก๊ฒจ์๋ ์ ๋ฉ๋๋ค.
์....ํ๋ ์์ํฌ๋ ๊ฐ๋ฐ์๋ฅผ ํน์ ๋์์ธ ํจํด ๋ฐ ๊ดํ์ผ๋ก ํน๋ณํ ์ ํํ๊ฑฐ๋ ์๋ดํ๊ฑฐ๋ "ํ๋ ์"ํ๋๋ก ๊ตฌ์ถ๋์์ต๋๋ค. ๊ทธ๊ฒ์ด ๊ทธ๋ค์ ์ฃผ์ ๋ชฉ์ ์ ๋๋ค. ๋ชจ๋ ์ข์ ํ๋ ์์ํฌ๋ ์ค๋งํธ API๋ฅผ ์ ๊ณตํ ๊ฒ์ ๋๋ค. ์ค๋งํธ API๋ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๋ช ํํ๊ณ ๋ถ๋ช ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง ๋์์ ์ ํ์ ์ด๊ธฐ๋ ํฉ๋๋ค.
์, ํ๋ ์์ํฌ๊ฐ ํน์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง ๋์์ ๊ฐ๋ฐ์๋ฅผ ํน์ ๋์์ธ ๋ฐฉ์์ผ๋ก ์ ํํ๋ค๋ ๊ฒ์ ์ญ์ค์ ์ ๋๋ค. ๋ฐ๋ก ์ด๊ฒ์ด ํ๋ ์์ํฌ ๋ด์์ ์๊ฒฌ์ด ๋์์ด ๋ ์๋ ์๊ณ ์์ฒ๋ฅผ ์ค ์๋ ์๋ ๋ถ๋ถ์ ๋๋ค. ์ ์ ํ ๊ท ํ์ ์ฐพ๋ ๊ฒ์ด ์ด๋ ต์ต๋๋ค. Vue ๋๋ Evan๊ณผ Vue ๊ฐ๋ฐ ํ์ด ์ด๋ฌํ ํ๋จ์ ๋ด๋ฆฌ๋ ๋ฐ ํฐ ์ญํ ์ ํ๊ณ ํ๋ฅญํ๊ฒ ์ํํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ค์ฝง
๋๋ ์ ์ค๊ณ๋ ํ๋ ์์ํฌ๊ฐ ๋์ผํ ๋์์ธ ํจํด์ผ๋ก ํ์ฅ๋์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ์ง๋ ์๊ฒ ์ง๋ง, ๋ด ์ฃผ์ฅ์ ํ๋ ์์ํฌ๊ฐ ๊ทธ๊ฒ์ ์ง์ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋น์ ๋ง์ด ๋ง์์. ํ์ง๋ง ํ๋ ์์ํฌ๊ฐ ์๋ฌด๋ฆฌ ์ข์๋ ์ต์ข ๊ฐ๋ฐ์๋ ๊ทธ๋ค์ด ์ํ๋ ๊ฒ์ ๋ฌด์์ด๋ ํ ์ ์๋๋ก ์ด๋ ค ์์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์์ฑ ๋ฐ ํ์ฌ๋ ์ด๋ฒคํธ๋ฅผ ๋น๋๊ธฐ์์ผ๋ก ๋ง๋๋ _actual_ ์ธ์์ ๋ํด์๋ ๋ค๋ฃจ์ง ์์์ต๋๋ค. ๋ฐฉ๊ธ ๋ด ์๊ฒฌ์ (ํ๋ฆฌ์ง ์์) ์๊ฒฌ์ ์ถ๊ฐํ๋๋ฐ, ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ํฐ ํ์ ์ผ๋ก ์ด์ด์ง๋๋ค.
๋๋ ์ ์ค๊ณ๋ ํ๋ ์์ํฌ๊ฐ ๋์ผํ ๋์์ธ ํจํด์ผ๋ก ํ์ฅ๋์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ์ง๋ ์๊ฒ ์ง๋ง, ๋ด ์ฃผ์ฅ์ ํ๋ ์์ํฌ๊ฐ ๊ทธ๊ฒ์ ์ง์ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ฃ์กํฉ๋๋ค. ํ์ง๋ง ์ด๊ฒ์ ๋์๊ฒ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ด๋ป๊ฒ ํ์ฅํด์ผ ํ๋์ง ์ง์ํ์ง ์๋ ํ๋์ ํ๋ ์์ํฌ๋ฅผ ๋ณด์ฌ์ฃผ์ธ์.
'์๋ฐ์ค์ฝ๊ฐ ํ๋จ์ ์ํ๋ค'๋ ์ ๋ง์ด ์ ์๊ฒฌ์ด ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ํ์ง๋ง, ๋ ๋ช ํํ๊ฒ. ๋ง์ดํธ ๋ฐ ์์ฑ๋ ์๋ช ์ฃผ๊ธฐ ํํฌ๋ ๋น๋๊ธฐ์์ผ๋ก ์๋ํ ํ์๊ฐ ์์ผ๋ฉฐ ๋๊ธฐ์์ผ๋ก ์๋ํ๋ค๋ ์ฌ์ค์ด ์ ํ๋ฆฌ์ผ์ด์ ๋ ผ๋ฆฌ์ ๋ํ ์ถ๋ก ์ ๋์์ด ๋ฉ๋๋ค. ์ด์จ๋ ๋ชจ๋ "๋๊ธฐ"๋ UI์์ ์ค๋ช ๋์ด์ผ ํ๋ฉฐ ๋น๋๊ธฐ ์ฝ๋๋ ์ฌ์ ํ ๊ฐ ํํฌ์์ ์คํ๋ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด์ beforeMount์ ๋ง์ดํธ ํํฌ๊ฐ ํ์ํ์ง์ ๋ํด ๋ ผ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ฅผ ๋ค์ด ์ปดํ์ผ๋ ๋ ๋ ํจ์์ ๊ฐ์ด ์์ฑ๋ ์ํ์์ ์์ง ์ก์ธ์คํ ์ ์๋ ๋ง์ดํธ์ ํ์ํ ๊ฒ์ด ํ๋ ๊ฐ์ง๊ฐ ์์ ์ ์์ต๋๋ค.
์ค์ฝง
Vue๊ฐ ๋น๋๊ธฐ ์๋ช ์ฃผ๊ธฐ ํํฌ์ ๋ํด ์ด๋ค ์์ผ๋ก๋ ์๊ฒฌ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ์ถ์ธก์ ๋ฌธ์ ๊ฐ ๋์ด์๋ ์ ๋ฉ๋๋ค. Vue๊ฐ ์ฑํ, ์ ๊ณต ๋๋ ๊ถ์ฅํ๋ ํ์ค, API, ๊ฐ์ด๋ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๊ฐ ์ธ์ ๋ชจ๋ ์ฌ๋์ด ์ฝ์ ์ ์๋์ง ์ถ์ธกํ ํ์๊ฐ ์์ต๋๋ค.
Evan์ ์๋ ๋ต๋ณ์์ ๋น๋๊ธฐ ์๋ช ์ฃผ๊ธฐ ํํฌ๋ ํ์ค API์ ํฌํจ๋์ด ์์ง ์์๋ฐ, ์ด๋ ๋ฐ๋์ ๋์ ์๊ฐ์ด๊ธฐ ๋๋ฌธ์ด ์๋๋ผ ๊ตฌํ ๋น์ฉ์ ์ ๋นํํ ๋งํผ ์ด์ ์ด ํฌ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฌ์ฉ์๊ฐ ๋ฌด์ธ๊ฐ๊ฐ ์ผ์ด๋๊ณ ์๋ค๋ ํ์ ์์ด ๋น๋๊ธฐ created
๋๋ ๊ธฐํ ์๋ช
์ฃผ๊ธฐ ํํฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๋ ๊ฒ์ ๋์ ์ต๊ด์ด๋ผ๋ ์๊ฒฌ์ ๋ํด Vue๊ฐ ๋น๋๊ธฐ ํํฌ๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ์ด์ ์๋ง๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๊ตฌํํ๊ธฐ ์ฌ์ธ ์ ์๋ "๋จ๊ณ ํ
ํ๋ฆฟ"์ด๋ผ๊ณ ๋ถ๋ฅผ ์ ์๋ ๊ฒ์ ์ ๊ณตํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ๋ฌด์ธ๊ฐ๊ฐ ์ผ์ด๋๊ณ ์๋ค๋ ํ์ ์์ด ์์ฑ๋ ๋น๋๊ธฐ์ ๋๋ ๊ธฐํ ์๋ช ์ฃผ๊ธฐ ํํฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๋ ๊ฒ์ ๋์ ์ต๊ด์ด๋ผ๋ ์๊ฒฌ์ ๋ํด,
์ด๊ฒ๋ ์ ๋ง ๋ฌธ์ ์ผ๊น์?
์ค์ฝง
์ฌ๊ธฐ์ ๋ด๊ฐ ๊ฒช๊ณ ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋๊ตฐ๊ฐ๊ฐ ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ์ Vue ์ ํ๋ฆฌ์ผ์ด์ (๋ค์ ํฐ)์ Vuex๋ฅผ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํฉ๋๋ค. create() ๋ผ์ดํ์ฌ์ดํด์ Vue ๊ตฌ์ฑ ์์ ์ค ์๋น์์์ store.dispatch()๋ฅผ ํตํด ์์ ์ ์ผ๋ถ ํญ๋ชฉ์ ์ค์ ํ์ต๋๋ค(๋ถ๋ช ํ). ๊ทธ๋ฌ๋ ๋ด ๊ด์ฌ์ ๋๊ฒ ๋ ๊ฒ์ฒ๋ผ store.dispatch()๋ ๊ธฐ๋ณธ ๋ ผ๋ฆฌ์ ํจ์๊ฐ ๋น๋๊ธฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ํญ์ ์ฝ์์ ๋ฐํํฉ๋๋ค. ๊ทธ๋์ async created() { await store.dispatch('foo/action') } ๋ฃ์์ง๋ง ์ค์ ๋ก๋ ์คํจํ์ต๋๋ค.
๋๋ ๋ํ Typescript๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๊ธฐ๋ค๋ฆฌ์ง ์์ ๋ ๋ค์ ์ฌํ๊ฒ ๋ถํํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋น๋๊ธฐํํ ์ ์์ ๋ ์๋ช ์ฃผ๊ธฐ์์ Vuex store.dispatch()๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
๊ฑด๋ฐฐ!!
vue์ ํน์ ์๊ฒฌ์ ๋ํ ๋ค๋ฅธ ๋ชจ๋ ํ ๋ก ๊ณผ ํ๋ ์์ํฌ๊ฐ ์๊ฒฌ์ ์ ์ณ๋๊ณ ์ด ๋์์ ๋ ๋ช ํํ๊ฒ ๋ฌธ์ํํ๋ ๊ฒ์ด ๋์์ด ๋ ์ ์์ต๋๋ค.
์์ @fifman ์ "๋ ํ๋ซํ" ์๋ฃจ์
์ ๋ณด๊ณ ์๋๋ฐ ์ด๊ฒ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์ง ํ์ ํ ์ ์์ต๋๋ค. mounted()
๋ฐํ๋ ๋๊น์ง ๋ด XHR์ ๋ก๋ํ๋์ง ํ์ธํฉ๋๋ค. ํด๋น ์๋ฃจ์
์์ created()
๋ฐ mounted()
๋ ๋ชจ๋ ๋น๋๊ธฐ์ด๋ฏ๋ก Vue๋ ๊ฐ๊ฐ์ ํธ์ถํ๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋น๋๊ธฐ ์์
์ด ์งํ๋๋ ๋์ ๊ฑฐ์ ์ฆ์ ๋ฐํ๋ฉ๋๋ค. ์ฌ์ค createdPromise
์์ ๊ณ created()
๋๋ mounted()
์์ ๋ชจ๋ ๋น๋๊ธฐ ์์
์ ์ํํ๋ ๊ฒ๋ณด๋ค ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ด ๋ ๋์์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
async mounted() {
let response = await fetch(my_url)
let data = await response.text()
my_data_member = data
}
์ด์จ๋ mounted()
๊ฐ Promise๋ฅผ ๋ฐํํ ํ ์ค๋ ์๊ฐ์ด ์ง๋ ํ XHR์ด ์๋ฃ๋๋ฉด my_data_member
๊ฐ "๋์ค์" ์ฑ์์ง๋๋ค.
๋ฃจํธ ๊ตฌ์ฑ ์์ <div id="app"/>
v-if
๋ฅผ ์ฌ์ฉํ๊ณ ๋ฐ์ดํฐ ๋ก๋๊ฐ ์๋ฃ๋๋ฉด ํธ๋ฆฌ๊ฑฐํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์๋ก ๊ณ ์นจ ํ ํฐ์ ์ฌ์ฉํฉ๋๋ค.
์ด๊ฒ์ ๋ง์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ฐ๊ณ ์๋ ๋ฉ์ง ๊ธฐ๋ฅ์ ๋๋ค. ๋ด ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ ๊ตฌ์ฑ ์์์ ์ค์ ๋ ๋๋ง ์ ์ ํน์ API ์์ฑ์ ๋ก๋ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ผ์ดํ ์ฌ์ดํด ํํฌ์ ๋น๋๊ธฐ๊ฐ ์ด์์ ์ธ ์๋ฃจ์ ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
ํ์ฌ ๋ชจ๋ ์ฌ๋๋ค์ด ์ฌ๊ธฐ์์ ๋น๋๊ธฐ ๊ธฐ๋ฅ์ด ์ํํ๊ฒ ์คํ๋๋ ์๋ฒฝํ ์๋๋ฆฌ์ค๋ฅผ ์ธ๊ธํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ฅผ ๋ค์ด ์ฌ์ฉ์ ์ฐ๊ฒฐ์ด ๋๋ฆฌ๊ฑฐ๋ ์ง์ฐ๋๊ณ API ์๋ต ํ ๊ตฌ์ฑ ์์๊ฐ ๋ง์ดํธ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒฝ์ฐ ์ ์ฒด ๊ตฌ์ฑ ์์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋ถ์ฐ๋ฉ๋๋ค. ์ฌ์ฉ์์๊ฒ ๋ก๋ฉ ์ ๋ณด๋ฅผ ํ์ํ ์ ์์ต๋๋ค. ๋๋ ํจ์ฌ ๋ ๋์ ๊ฒ์ API๊ฐ ์๊ฐ ์ด๊ณผ๋๊ฑฐ๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ฉด ์์ฉ ํ๋ก๊ทธ๋จ์ด ํ์ฌ๋์ง ์๊ณ ์ค๋จ๋๋ค๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๋ฉ์ง ๊ธฐ๋ฅ์ด์ง๋ง ํ๋ ์์ํฌ๋ณด๋ค ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๋ฉ์ธ ๋ก์ง ๊ตฌํ์ ํ๋ ์์ํฌ๋ณด๋ค ๊ธฐ๋ณธ ๋ก์ง์ ๋ํ ํต์ฐฐ๋ ฅ์ด ๋ ๋ง๊ธฐ ๋๋ฌธ์ ๋ถ์์ฉ์ด ์ ์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ๋ํด +1์
๋๋ค.
๋ค์ํ ๊ตฌ์ฑ ์์์์ ์ฌ์ฉํ๋ ๋ฏน์ค์ธ์ด ์์ต๋๋ค. ๋ฏน์ค์ธ์ ๋ง์ดํธ๋ ํํฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๊ตฌ์ฑ ์์๋ ๋ง์ดํธ๋ ํํฌ์์๋ ๋ฏน์ค์ธ์ด ๊ฐ์ ธ์จ ๋ฐ์ดํฐ์ ํจ๊ป ์๋ํด์ผ ํฉ๋๋ค.
์ง๊ธ๊ณผ ๊ฐ์ด ๋ฏน์ค์ธ์ด ๋ฐ์ดํฐ ๋ก๋๋ฅผ ์๋ฃํ๊ณ ๊ตฌ์ฑ ์์์์ ๋ง์ดํธ๋ ํํฌ๋ฅผ ๋ฒ๋ฆด ๋ ํธ์ถ๋ ์ฝ๋ฐฑ์ ๊ตฌํํด์ผ ํ์ต๋๋ค.
์๋ํ์ง๋ง ๋ง์ดํธ๋ ํํฌ๊ฐ ์ฝ์์ ์ฒ๋ฆฌํ๋ฉด ๋ ์ด์ ๊ฒ์
๋๋ค.
@cederron ์์ ํ ๊ด์ฌ์ด ์๋๋ฐ ์ ๋ถ๋ชจ ๊ตฌ์ฑ ์์์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ํ์ฌ ์ํ์ผ๋ก ์ ๋ฌํ ์ ์์ต๋๊น? v-if
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋๋ ๋์ ๋ก๋ ํ์๊ธฐ๋ฅผ ํ์ํ๊ณ ๋ฐ์ดํฐ๊ฐ ํ์๋๋ฉด ๊ตฌ์ฑ ์์๋ฅผ ํ์ํ ์ ์์ผ๋ฉฐ ๊ตฌ์ฑ ์์๊ฐ ์์ฑ๋๋ฉด ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
๊ตฌ์ฑ ์์๊ฐ ๋ ๊ฐ์ง ๋ณ๊ฐ์ ๊ด๋ จ ์๋ ์ํ๋ฅผ ๋ํ๋ด์ง ์๋๋ก ํฉ๋๋ค('๋ฐ์ดํฐ๊ฐ ๋ก๋๋์ง ์์, ๋๊ธฐ ์ค' ๋ฐ '๋ฐ์ดํฐ๊ฐ ๋ก๋๋์์ต๋๋ค. ์กฐ์ํ ์ ์์').
์ฌ๋ฌ ์์น์์ ๋ก์ง์ ์ฌ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ค์ด๋ก๋ ๋ก์ง์ Vuex๋ก ์ด๋ํ ์๋ ์์ต๋๋ค.
@ReinisV ์ ๊ฒฝ์ฐ๋ฅผ ๋๋ฌด ๋จ์ํํ ๊ฒ
๋ฐ๋ผ์ mixin์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. > ๊ตฌ์ฑ ์์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค. > ์ด์ ๊ตฌ์ฑ ์์๊ฐ ํ์๋ฉ๋๋ค.
AFAIK์ด ์๋ํ์ง ์์ต๋๋ค.
export const MyMixin = {
data: function () {
return {
dbData: null
}
},
mounted: async function () {
this.dbData = await asyncFetchDataFromDB()
}
}
export const MyComponent = {
mixins: [MyMixin],
data: function () {
return {
newData: null
}
},
mounted: function () {
this.newData = handleDBData(this.dbData)
}
}
dbData๋ ๊ตฌ์ฑ ์์ ๋ง์ดํธ ํํฌ์์ null์ด ๋ฉ๋๋ค.
ํ์ฌ mixin์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์ฝ๋ฐฑ์ ์คํํ์ง๋ง ๋ง์ดํธ ๊ธฐ๋ฅ์ ๋น๋๊ธฐ์์ผ๋ก ๋ง๋๋ ๊ฒ์ด ๋ ๋์ ๊ฒ์ ๋๋ค.
vuex๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ vuex์ ๋ํด ๋ง์ด ๋งํ ์ ์์ต๋๋ค.
@seanfisher๊ฐ ์ฌ๊ธฐ์ ์ธ๊ธํ ๊ฒ์ ์ถ์ต๋๋ค . ๋น๋๊ธฐ๋ก ํ์๋ ๊ตฌ์ฑ ์์์ ๋ํ vue ๋๊ธฐ๋ ์ฌ์ฉ์์๊ฒ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ๋ฟ๋ง ์๋๋ผ ๋ฐ์ดํฐ ์กฐํ๋ฅผ ์์ํ๊ธฐ ์ํด async/await๋ฅผ ์ฌ์ฉํ๋ ํจํด์ด ์ด๋์๋ ์กด์ฌํฉ๋๋ค. vue๋ฅผ ์ฐจ๋จํ๋ ๊ฒ์ ๋ช ์์ ์ผ๋ก ํผํ๊ธฐ ์ํด ์ด๋ฌํ ์๋ช ์ฃผ๊ธฐ ํํฌ์ ์ฝ๋๋ฅผ ๋๊ธฐ๋์ง ์์ ์ฝ์์ผ๋ก ๋ช ์์ ์ผ๋ก ๋ณํํฉ๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ์ข์ ์๋ ์๊ณ ๊ธฐ๋ฅ์ด ๋์ ๋๋ค๋ฉด ๊ตฌ์ฑ ์์ ํํฌ ์คํ์ ์ฒ๋ฆฌํ๋ ํ์ฌ ์๋ช ์ฃผ๊ธฐ์ ์ ์ญ ์ฝ๋ฐฑ์ ๋ํ ์คํ์ ๊ธฐ๋ค๋ฆฌ๋ ์๋ช ์ฃผ๊ธฐ์ ๋ ๊ฐ์ง ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋์์ ์คํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ์ง๋ง vue ์ฐจ๋จ์ ํผํ๊ธฐ ์ํด ๋ชจ๋ ๋ผ์ดํ์ฌ์ดํด ํํฌ๋ฅผ ๋ฌธ์ ๊ทธ๋๋ก ๋ค์ ์์ฑํ๋ ๊ฒ์ ์ ๋ง ์ค๋ง์ค๋ฌ์ธ ๊ฒ์
๋๋ค. async/await
๋ ํจ์ฌ ๊นจ๋ํ๋ฏ๋ก ์ฝ์์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์๋ ๋ฐฉ์์ผ๋ก ์ด๊ฒ์ ๋ณ๊ฒฝํ๋ฉด ์คํจ์ ๊ตฌ๋ฉ์ด์ ๋ํ ์ฑ๊ณต์ ๊ตฌ๋ฉ์ด(๋๊ธฐํ์ง ์๋ ๊ตฌ์ฑ ์์ ์๋ช
์ฃผ๊ธฐ)๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค.
์ฒ์๋ถํฐ ๋น๋๊ธฐ์ ์ฌ๋ก๋ฅผ ๊ณํํ๊ณ ์ค๊ณํ๋ ๊ฒ์ด ํจ์ฌ ๋ซ์ต๋๋ค.
created
๋๋mounted
๋๋ ์ด๋์์๋ ๋น๋๊ธฐ์ ํ๋ก์ธ์ค๋ฅผ ์์ํ ๋ค์ ๊ตฌ์ฑ ์์์ ๊ณจ๊ฒฉ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ก ํ๊ฑฐ๋ ์ต์ ์ ๊ฒฝ์ฐ API๊ฐ ์ฌ์ฉ์์ ๊ถํ์ ๋ฐํํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์คํผ๋. ํจ์ฌ ๋ ๋์ UX์ ์ ์ด๋ฅผ ํฌ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Vue๋ ๋ฒ๋ค์ ๋ ์๊ฒ ์ ์งํ๋ฉด์ ๋น๋๊ธฐ ์๋ช ์ฃผ๊ธฐ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ์น๋ฆฌ ์น๋ฆฌ.
@seanfisher ๊ฐ์ฌํฉ๋๋ค. ๋งค์ฐ ์ ์ฉํฉ๋๋ค!
๋น๋๊ธฐ ํธ์ถ์ด ๋ฐํ๋ ๊ฒฝ์ฐ์๋ง ๋ ๋๋ง๋๋ ๋น๋๊ธฐ ๊ตฌ์ฑ ์์๋ฅผ ๋์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
API์ ๋ํ ์์ธํ ์ ๋ณด๋ ์ฌ๊ธฐ
https://vuejs.org/v2/guide/components-dynamic-async.html#Async -๊ตฌ์ฑ ์์
new Vue({
components: {
root: () => ({ // Aync component
// The component to load (should be a Promise)
component: new Promise(async function (resolve) {
await FetchMyVariables()
resolve(MyComponent) // MyComponent will be rendered only when FetchMyVariables has returned
}),
// A component to use while the async component is loading
loading: { render: (h) => h('div', 'loading') },
})
},
render: h => h('root')
})
์ด๋ฌํ ์๋ฃจ์ ์ ๋๋ถ๋ถ์ ๊ด์ฐฎ์ ๋ณด์ด์ง๋ง ์ด๊ฒ์ด Vue๋ฅผ ๋งค์ฐ ์ง๊ด์ ์ผ๋ก ๋ง๋๋ ์ฃผ์ ๋๋ฝ ๋ถ๋ถ ์ค ํ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. async await๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ด์ ์ผ์์ ์ธ ์ผ์ด ๋์๊ธฐ ๋๋ฌธ์ Vue 3์์ ์ด๊ฒ์ ๊ตฌํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. SO PLEASE @yyx990803 Vue 3์์ ํฉ์๋ค. PLEEEEEEEASE. ์ ์ฒด VUE ์ํคํ ์ฒ๋ ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํ์ง ์๊ณ ๋ง๋ค์ด์ก์ผ๋ฉฐ ์ฌ๋๋ค์ด ์ฌ๊ธฐ์ ๊ฒ์ํ๋ ๋๋ถ๋ถ์ ๋ด์ฉ์ ํด๊ฒฐ ๋ฐฉ๋ฒ ๋ฐ ํดํน์ ๋๋ค. ํํฌ๋ ์ค์ ๋ก ๋น๋๊ธฐ ํจ์๋ฅผ ์กด์คํด์ผ ํ๊ณ ๋ค์ ํํฌ ํจ์๋ก ์ ๋ฌ๋๋ ๋ฐํ ๊ฐ๋ ๊ธฐ๋ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ค๊ณ ํ๋๋ฐ ์ด๊ฒ์ด ์ธ์ ๋ฐ์ง ๋ชปํ๊ณ ์์ง๋ง ํดํน์ด ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ชป์๊ธด ์ฝ๋๊ฐ ๋์ฌ ๊ฒ์ ๋๋ค.
์๋ช ์ฃผ๊ธฐ ๋ฐฉ๋ฒ์ ๋ํ ๋น๋๊ธฐ ์ง์์ ํ์ฉํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ UX ๊ดํ์ ์กฐ์ฅํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ป๊ฒ? ๋น๋๊ธฐ ํจ์๋ ์ฆ์ ์๋ฃํ ์ ์๋ ์์ฒญ(์: ์ฅ๊ธฐ ์คํ ๋๋ ๋คํธ์ํฌ ์์ฒญ)์ ์ฌ์ฉ๋ฉ๋๋ค. Vue๊ฐ ์์ฑ ๋๋ ํ์ฌ๋ฅผ ์ง์ฐ์ํค๊ฑฐ๋ ๋คํธ์ํฌ ์์ฒญ์ด๋ ์ฅ๊ธฐ ์คํ ๋น๋๊ธฐ ํ๋ก์ธ์ค๋ฅผ ๊ธฐ๋ค๋ฆฌ๋๋ก ๋ค๋ฅธ ์๋ช ์ฃผ๊ธฐ ๋ฐฉ๋ฒ์ ๊ฐ์ ํ๋ฉด ์ฌ์ฉ์์๊ฒ ๋์ ๋๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ์ ์์ ๋น ํ๋ฉด์ผ๋ก 4์ด ๋์ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๋์ ๊ตฌ์ฑ ์์๊ฐ ์ฌ์ฉ์์ spotty cell ์ฐ๊ฒฐ์ด ๋คํธ์ํฌ ์์ฒญ์ ์๋ฃํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์์ ์์ํด ๋ณด์ญ์์ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ฌ์ฉ์์๊ฒ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ๋ฟ๋ง ์๋๋ผ ์ํฉ์ ๋ํ ํต์ ๋ ฅ์ ํฌ์ํ๊ณ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ก๋ ์๊ฐ์ ๋ ๋นจ๋ฆฌ ์ธ์ํ๋๋ก ํ๊ฑฐ๋ ํ์ ๋๋ ํ์ ๋์ง ์์ ์งํ๋ฅ ํ์๊ธฐ๋ฅผ ํ์ํ๊ธฐ ์ํด ๊ฐ๋ฐ์๋ก์ ํ ์ ์๋ ์ผ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๊ธฐ๋ฅ์ Vue์ ๊ตฌ์ถํ๋ค๊ณ ํด์ ์น์ ๋ ๋์ ๊ณณ์ผ๋ก ๋ง๋๋ ๊ฒ์ ์๋๋๋ค. ๋น์ ์ ๋์ ๊ดํ์ ํ์ฑํํ๊ณ ์์ต๋๋ค.
์ฒ์๋ถํฐ ๋น๋๊ธฐ์ ์ฌ๋ก๋ฅผ ๊ณํํ๊ณ ์ค๊ณํ๋ ๊ฒ์ด ํจ์ฌ ๋ซ์ต๋๋ค.
created
๋๋mounted
๋๋ ์ด๋์์๋ ๋น๋๊ธฐ์ ํ๋ก์ธ์ค๋ฅผ ์์ํ ๋ค์ ๊ตฌ์ฑ ์์์ ๊ณจ๊ฒฉ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ก ํ๊ฑฐ๋ ์ต์ ์ ๊ฒฝ์ฐ API๊ฐ ์ฌ์ฉ์์ ๊ถํ์ ๋ฐํํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์คํผ๋. ํจ์ฌ ๋ ๋์ UX์ ์ ์ด๋ฅผ ํฌ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Vue๋ ๋ฒ๋ค์ ๋ ์๊ฒ ์ ์งํ๋ฉด์ ๋น๋๊ธฐ ์๋ช ์ฃผ๊ธฐ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ์น๋ฆฌ ์น๋ฆฌ.
์์ฒ์ ํ๋์ ์๊ฒฌ. ์ง์ฐ๋๋ ๊ตฌ์ฑ ์์ ๋ ๋๋ง์ด ๊ธ์ ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ๊ณผ ํจ๊ป ์ด ์ ์๋ ์๋๋ฆฌ์ค๋ฅผ ์์ํ ์ ์๋ค๊ณ ํด์ ๊ทธ๊ฒ์ด ์กด์ฌํ์ง ์๋๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
ํ๋ ์์ํฌ๊ฐ ๊ฐ๋ฐ์์ ์ธ์ฐ๋ฉด ๊ฐ๋ฐ์๋ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ฅผ ์ฐพ์ ๊ฒ์ ๋๋ค.
@robob4him
์์ฒ์ ํ๋์ ์๊ฒฌ. ์ง์ฐ๋๋ ๊ตฌ์ฑ ์์ ๋ ๋๋ง์ด ๊ธ์ ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ๊ณผ ํจ๊ป ์ด ์ ์๋ ์๋๋ฆฌ์ค๋ฅผ ์์ํ ์ ์๋ค๊ณ ํด์ ๊ทธ๊ฒ์ด ์กด์ฌํ์ง ์๋๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
ํ๋ ์์ํฌ๊ฐ ๊ฐ๋ฐ์์ ์ธ์ฐ๋ฉด ๊ฐ๋ฐ์๋ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ฅผ ์ฐพ์ ๊ฒ์ ๋๋ค.
๋น์ ์ ์ ๋์ ์ผ๋ก ์ณ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๊ณต์ ํ ์ด๋ค ๊ฒ๋ ๋ฌธ์ ๋ฅผ ์ด๋ค ์์ผ๋ก๋ ํด๊ฒฐํ ์ ์๋ ์ ํจํ ์ฃผ์ฅ์ด ์๋๋๋ค. ์ปค๋ฎค๋ํฐ๊ฐ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋๋ก ๊ฐ์ํ๊ธฐ ์ํด ๊ฒ์ ์ฃผ๋ ์ ์ ์ ๋์ ํ์ต๋๋ค. ๋ํ์ ๊ฑด์ค์ ์ธ ์ฐ์์ด ์๋๋๋ค.
@wparad , ๊ทธ๊ฒ์ ์ ๋์ ์ผ๋ก ๊ฒ์ ์ฃผ๋ ์ ์ ์ด์ง๋ง ๋๊ตฐ๊ฐ์๊ฒ ๋ฌด์์ ํ๋๋ก ๊ฐ์ํ์ง๋ ์์ ๊ฒ์ ๋๋ค. ๊ธฐ๋ฅ์ด ๋์ ์ต๊ด์ด๋ ๋ฐํจํด์ ์ง์ํ๊ฑฐ๋ ๋ ํฐ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ๋ฅผ ์ฉ๊ฒ ํ ๊ฒ์ด๋ผ๋ ์ฃผ์ฅ์ ํ๋ ๊ฒ์ ๊ฒ์ ์ฃผ๋ ์ ์ ์ ๋๋ค.
๋ง ๊ทธ๋๋ก ๋ชจ๋ ํ๋ ์์ํฌ/์ธ์ด์ ๊ธฐ๋ฅ ์ค ์ ๋ฐ์ ๊ฐ๋ฐ์์๊ฒ ์ํํฉ๋๋ค. public ๋ฉ์๋๋ฅผ ํ์ฅํ ์ ์๊ณ Vue๋ ์์($el)์ ๋ํ ์ก์ธ์ค๋ฅผ ๊ถ์ฅํฉ๋๋ค. ํ๋ฃจ๊ฐ ๋๋๋ฉด ๊ฐ๋ฐ์๊ฐ ์์ ์ ์๋ฃํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํ๋ ์์ํฌ๋ ์ด๋ฌํ ๊ฒ๋ค์ ์ ๊ณตํฉ๋๋ค.
์ด ๊ธฐ๋ฅ ์์ฒญ์ 1๋ ๋ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ ๊ทธ ์ด์ ๊ฐ ์ค์ ๋ก ๋์ ์ต๊ด์ ์ผ์ผํค๊ธฐ ๋๋ฌธ์ด ์๋๋ฉฐ ์ง์ฐ๋ ๋ ๋๋ง์ ๋์ ์ต๊ด์ผ๋ก ์ธ์ํด์๋ ์๋๋ค๋ ๊ฒ์ ์ดํดํด์ผ ํฉ๋๋ค.
vue์ ํจ๊ป requirejs๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ด๊ฐ requirejs๋ฅผ ์ข์ํ๋ ๊ฒ์ด ์๋๋ผ ๋ชจ๋ ๋ชจ๋์ AMD ๋ชจ๋๋ก ํฌํจํ๋ ์คํ ์์ค LMS์ ํจ๊ป vue๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ๋๋ค. beforeCreate ํํฌ์์ ํ์ํ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๋ํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ํ์ฌ ๋๋ฅผ ์ํ ๋์์ vue ์ธ๋ถ์์ ๋ก๋ํ ๋ค์ ๋ ์ง์ ๋ถํ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
์๋ช ์ฃผ๊ธฐ ๋ฐฉ๋ฒ์ ๋ํ ๋น๋๊ธฐ ์ง์์ ํ์ฉํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ UX ๊ดํ์ ์กฐ์ฅํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ป๊ฒ? ๋น๋๊ธฐ ํจ์๋ ์ฆ์ ์๋ฃํ ์ ์๋ ์์ฒญ(์: ์ฅ๊ธฐ ์คํ ๋๋ ๋คํธ์ํฌ ์์ฒญ)์ ์ฌ์ฉ๋ฉ๋๋ค. Vue๊ฐ ์์ฑ ๋๋ ํ์ฌ๋ฅผ ์ง์ฐ์ํค๊ฑฐ๋ ๋คํธ์ํฌ ์์ฒญ์ด๋ ์ฅ๊ธฐ ์คํ ๋น๋๊ธฐ ํ๋ก์ธ์ค๋ฅผ ๊ธฐ๋ค๋ฆฌ๋๋ก ๋ค๋ฅธ ์๋ช ์ฃผ๊ธฐ ๋ฐฉ๋ฒ์ ๊ฐ์ ํ๋ฉด ์ฌ์ฉ์์๊ฒ ๋์ ๋๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ์ ์์ ๋น ํ๋ฉด์ผ๋ก 4์ด ๋์ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๋์ ๊ตฌ์ฑ ์์๊ฐ ์ฌ์ฉ์์ spotty cell ์ฐ๊ฒฐ์ด ๋คํธ์ํฌ ์์ฒญ์ ์๋ฃํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์์ ์์ํด ๋ณด์ญ์์ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ฌ์ฉ์์๊ฒ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ๋ฟ๋ง ์๋๋ผ ์ํฉ์ ๋ํ ํต์ ๋ ฅ์ ํฌ์ํ๊ณ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ก๋ ์๊ฐ์ ๋ ๋นจ๋ฆฌ ์ธ์ํ๋๋ก ํ๊ฑฐ๋ ํ์ ๋๋ ํ์ ๋์ง ์์ ์งํ๋ฅ ํ์๊ธฐ๋ฅผ ํ์ํ๊ธฐ ์ํด ๊ฐ๋ฐ์๋ก์ ํ ์ ์๋ ์ผ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๊ธฐ๋ฅ์ Vue์ ๊ตฌ์ถํ๋ค๊ณ ํด์ ์น์ ๋ ๋์ ๊ณณ์ผ๋ก ๋ง๋๋ ๊ฒ์ ์๋๋๋ค. ๋น์ ์ ๋์ ๊ดํ์ ํ์ฑํํ๊ณ ์์ต๋๋ค.
์ฒ์๋ถํฐ ๋น๋๊ธฐ์ ์ฌ๋ก๋ฅผ ๊ณํํ๊ณ ์ค๊ณํ๋ ๊ฒ์ด ํจ์ฌ ๋ซ์ต๋๋ค.
created
๋๋mounted
๋๋ ์ด๋์์๋ ๋น๋๊ธฐ์ ํ๋ก์ธ์ค๋ฅผ ์์ํ ๋ค์ ๊ตฌ์ฑ ์์์ ๊ณจ๊ฒฉ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ก ํ๊ฑฐ๋ ์ต์ ์ ๊ฒฝ์ฐ API๊ฐ ์ฌ์ฉ์์ ๊ถํ์ ๋ฐํํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์คํผ๋. ํจ์ฌ ๋ ๋์ UX์ ์ ์ด๋ฅผ ํฌ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Vue๋ ๋ฒ๋ค์ ๋ ์๊ฒ ์ ์งํ๋ฉด์ ๋น๋๊ธฐ ์๋ช ์ฃผ๊ธฐ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ์น๋ฆฌ ์น๋ฆฌ.
๋น์ ์ด ๋งํ๋ ๊ฒ์ v-if/v-clock/v-show
๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉด ๋์ ๊ดํ์ ์กฐ์ฅํ๋ฏ๋ก ํด๋น ๊ธฐ๋ฅ์ ์ ๊ฑฐํ์ฌ ํ๋ ์์ํฌ๋ฅผ ๋ ์ ์์ผ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ๋ค์ 3๊ฐ์ ์ง์๋ฌธ์ ๋ฃ์ง ์๊ธฐ ์ํด Vue๊ฐ ๋ ์์์ง๋๋ก ๋ณต์กํ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋์ผํ ์์
์ ์ํํฉ๋๋ค. 1์ฐจ ๊ฐ๋ฐ์๋ ๋ฐ๋ณด๊ฐ ์๋๋ค. ๋ ๋ฒ์งธ ๋ฐ๋ณด ๋ฐฉ์ง ํ๋ ์ ์ํฌ๋ ์ฐจ๋ก๋ก ๋ช
๋ฐฑํ "๋ฐ๋ณด"๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ํ ํ ์์๋ ์์
์ ์ ํํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ฑ์ ์ ํํฉ๋๋ค. ์ ์ฒด ํ๋ฉด์ ๊ณต๋ฐฑ์ผ๋ก ๋๊ณ ๋น๋๊ธฐ ์์
์ ํตํด ์ ์ฒด ์น ์ฌ์ดํธ๋ฅผ ์ฐจ๋จํ๋๋ก v-if
๋ฅผ ๋ฃ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๋น ํ์ด์ง๊ฐ ์์ ์๋ ์๋ค๋ ์ฌ์ค์ ๋ฌด์ํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ์ด์ ๋ก ๊ตฌ์ฑ ์์ ๋ผ๊ณ v-if
์ ์ํด ์ฐจ๋จ๋๊ณ ๋ฌด์ธ๊ฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ํธ๋ฆฌ๊ฑฐ๋๋ ๊ตฌ์ฑ ์์์ผ ์ ์์ต๋๋ค. ๋จ, ์ฒ์ ๋๋๋ง์ ํ๋ ๊ณผ์ ์์ async functions
๋ฑ์ ์ปดํฌ๋ํธ๊ฐ ๋ถํ
๋ ๋ ์ง์ผ์ ธ์ผ ํฉ๋๋ค. ๋๋ ์ด๊ฒ์ ์ฐพ๊ธฐ ์ํด ์ ์ฒด Vue ๋ฌธ์๋ฅผ ์
์
์ด ์ดํด๋ณด์๊ณ ๋ง์นจ๋ด ์์ ํดํน ์์ ์ ๊ฐ์ด ๊ทธ๋ค์ง ์ข์ง ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์์
์ ์ํํ์ต๋๋ค.
๋๋ฅผ ๊ฑฑ์ ์ํค๋ ๊ฒ์ ๋๊ตฐ๊ฐ/๋์ค์ ๋ด๊ฐ ์ฝ๋๋ฅผ ์ ์งํ๋ ๊ฒ์ ๋๋ค. Promise ์ฝ๋ฐฑ ์ง์ฅ ๋ Async ... ๊ธฐ๋ค๋ฆฝ๋๋ค.
์ค์ ๋ก ๋๋ ๊ทธ๊ฒ์ด ํ๋ ์์ํฌ์ ์ ์ฐ์ฑ๊ณผ ์ ์ด ๊ฐ๋ฅ์ฑ์ ์ฝ๊ฒ ํ์ ์กฐ์นํ๋ ๋ฐฉ์์ผ๋ก ํฅ์์ํค๋ ๊ฒ์ ๋ด
๋๋ค. ๋ด๊ฐ ์๋ฏธํ๋ ๋ฐ๋ฅผ ๋ณด๋ ค๋ฉด ์์ ํดํน์ ์ดํด๋ณด์ญ์์ค. ์๋ฅผ ๋ค์ด ๊ฐ๋ฐ์๋ ๊ฐ๋จํ async mounted () { await... }
๋ฌธ์ ๊ณต๋ฐฑ์ ์ฑ์ฐ๊ธฐ ์ํด ๋ชจ๋ ์์
์ ์ํํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์์ผ๋ ค๋ฉด ํจ์๋ฅผ async
๋ก ์ ์ํ์ง ์๊ฑฐ๋ await
๋ฅผ ์ ํ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
์ค์ ๋ก async mounted
๋ผ์ดํ์ฌ์ดํด ํํฌ๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ๋ ์ฌ๋์ ์์ ์ด ํ๋ ์ผ๊ณผ ๊ทธ ์ผ์ ํ๋ ์ด์ ๋ฅผ ์ดํดํ๊ณ ์ฌ๋ฌ๋ถ์ด ๊ฑฑ์ ํ๋ ๋์ ์ต๊ด์ ๋ง๋ค์ง ์์ ๊ฒ์
๋๋ค.
@emahuni , ๋๋ ๋น์ ์ด ๊ณต์ ํ๋ ๊ธฐ๋์ ๋์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ง๋ง, ๋์์ค๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. async mounted
๋๋ async created
๊ฐ ๊ตฌ์ฑ ์์์ ๋ ๋๋ง์ ์ง์ฐํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ถ๋ชจ๋ ๋ฌด์์ํฉ๋๊น? ์ํ:
v-if
์ ๊ฑฐํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.๋์ ์ผ๋ก ๋ก๋๋ ๊ตฌ์ฑ ์์์ ๋ํ ๊ธฐ๋์น๊ฐ ์ผ๊ด์ ์ด๋ผ๋ ๋ฐ ๋์ํ์ง๋ง ๋ถ๋ชจ์ ๋ํ ๋์์ ๊ทธ๋ ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ IMO๋ ์์ ๊ตฌํ์ ๋ถ๋ชจ์๊ฒ ๋ ธ์ถํ๊ณ ๋ถ๋ชจ๊ฐ ํด๋น ๋์ ๊ตฌ์ฑ ์์๋ก ๋ฌด์์ ํด์ผ ํ๋์ง ์์๋ด๋๋ก ๊ฐ์ ํ๋ ๊ฒ์ ๋๋ค. ๋์ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋๋ ๋ฐฉ์๊ณผ ์์ ๊ตฌ์ฑ ์์์ ์ํ๋ ์์์๊ฒ ๋ฌ๋ ค ์์ด์ผ ํฉ๋๋ค. ๋น๋๊ธฐ๋ฅผ ๋ก๋ํ๋ ๊ฒฝ์ฐ Vue์ ๋ฌด์์ ๊ทธ ์๋ฆฌ์ ๋ ๋๋งํด์ผ ํ๋์ง(๋๋ ๋ ๋๋งํ์ง ์์์ผ ํ๋์ง) ์ค๋ช ํ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์๋ก์ด ๋ณต์ก์ฑ์ ๋์ ํ๋ ๊ฒ๋ณด๋ค ํ๋ ์์ํฌ๊ฐ ์ด๋ฏธ ์๋ํ๋ ๋ฐฉ์์ ๋๋ค.
๋ํ, ๋๋ ๋น์ ์ ์ฃผ์ฅ์ ์์ ํ ๋ฐ๋ฅด์ง ์์ต๋๋ค.
๋น์ ์ด ๋งํ๋ ๊ฒ์ v-if/v-clock/v-show ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉด ๋์ ๊ดํ์ ์กฐ์ฅํ๋ฏ๋ก ํด๋น ๊ธฐ๋ฅ์ ์ ๊ฑฐํ์ฌ ํ๋ ์์ํฌ๋ฅผ ๋ ์ ์์ผ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ด ๊ฒฝ์ฐ ๋ง์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์์ฑ๋ ๋น๋๊ธฐ ๊ตฌ์ฑ ์์๋ฅผ ๋์
ํ๋ฉด ๋์ ์ต๊ด ์ด ๋ฐ์ํ๋ค๋ ๊ฒ์ ๋ถ๋ช
ํ ์ ์ ์์ง๋ง ์ด๊ฒ์ด ์ค์ ๋ก ๋ฐ์ํ๋์ง ํ์คํ์ง ์์ต๋๋ค. ๋์งธ, ๊ทธ๊ฒ์ด ๋์ ์ต๊ด์ ์ผ์ผํค๋๋ผ๋ ์๋ก์ด ๋์ ์ต๊ด์ ๋ง๋ค๊ธฐ ์ํ ์ ๋นํ๋ก ์ฌ์ฉํ๊ธฐ๋ณด๋ค๋ ๊ทธ๊ฒ์ ๊ณ ์น ๊ฒ์ ์ ํํด์ผ ํ๋ค๋ ์ง๋ฌธ์ ๋์ง๊ณ ์์ต๋๋ค. v-if
๋ฑ์ ์ํด ์์ฑ๋๋ ๋์ ๊ดํ์ ์๊ณ ์๋ค๋ฉด... ์ ๋นํ๋ก ์ฌ์ฉํ๋ ค๊ณ ํ๊ธฐ ๋ณด๋ค๋ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ๋ช
์์ ์ผ๋ก(๋ฌผ๋ก ๋ค๋ฅธ ๋ฌธ์ ์์) ๊ณต์ ํ๋๋ก ์ด๋ํฉ๋๋ค. ๋ค๋ฅธ ํ ๋ก ์ ์ํด.
@emahuni , ๋๋ ๋น์ ์ด ๊ณต์ ํ๋ ๊ธฐ๋์ ๋์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ง๋ง, ๋์์ค๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
async mounted
๋๋async created
๊ฐ ๊ตฌ์ฑ ์์์ ๋ ๋๋ง์ ์ง์ฐํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ถ๋ชจ๋ ๋ฌด์์ํฉ๋๊น? ์ํ:
- ์ฐจ๋จ๋
๋ถ๋ชจ๋ ์์์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๊ณ์ํด์ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ ๊ทธ๋์ผ ํฉ๋๊น? ์์์ด ๋ ๋๋ง๋๋ฉด ๋ฐ๋ก ์งํํ ์ ์์ผ๋ฉฐ updated
์คํํ ์ ์์ต๋๋ค.
- ๊ตฌ์ฑ ์์๊ฐ ๋ก๋๊ฐ ์๋ฃ๋ ๋๊น์ง DOM
v-if
์ ๊ฑฐํด์ผ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ด๊ฐ ์ด๊ฒ์ ์ป์ ์ ์์์ง ํ์ ์ด ์์ง ์์ง๋ง... ๋๋ต์ ์๋์ค์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ด ์ ๊ฑฐ๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ์ง ์์ต๋๋ค. ๋จ์ง ๊ทธ ์๊ฐ ๋์ ๋ง์ดํธ๋ฅผ ์ฐจ๋จํด์ผ ํ๋ ๋ง์ดํธ ์ค์ ๋ฌด์์ธ๊ฐ๋ฅผ ์ํํด์ผ ํฉ๋๋ค. ์์์ ์ฝ์ ๋ง์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค.
- ๋ก๋๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ตฌ์ฑ ์์๊ฐ ์จ๊ฒจ์ ธ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ด๊ฒ์ ๊ฐ๋ฐ์, ์ ๋ง์ดํธ๋ ํํฌ ๋๋ ๋ค๋ฅธ ํํฌ๋ฅผ ๋น๋๊ธฐํํ๋์ง์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
- ๊ทธ ์๋ฆฌ์ ์์ ์์๋ฅผ ํ์ํ์๊ฒ ์ต๋๊น?
์ ํ ๊ทธ๋ ์ง ์์ ์๋ ์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง ๊ทธ๊ฒ์ ๊ฐ๋ฐ์๊ฐ ๋ฌ์ฑํ๊ณ ์ ํ๋ ๋ฐ์ ๋ฌ๋ ค ์์ต๋๋ค. ์์ ์ ์ด๋ค ๊ฒ๋ ์คํธ๋ ์ดํธ ์ฌํท์ ์
์ด์๋ ์ ๋๋ค๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, v-if
๊ฐ ์ค๊ณ๋์์ ๋ ๋๊ตฐ๊ฐ๊ฐ ๋งค๋ฒ ๊ตฌ์ฑ ์์์ ๋ ๋๋ง์ ์ฐจ๋จํ๋ ค๋ ์ด์ ์ ๋์ ๋ฐฐ์นํ๊ณ ์ค์ ๋ฐฉ์งํ ์ ์๋ ํญ๋ชฉ์ ์๊ฐํ๊ธฐ ๋๋ฌธ์ด ์๋๋๋ค. ๊ฐ๋ฐ์ ๋์์ธ์ ์ํด v-if
์ ์๋ชป๋ ์ ์๋ ๋ง์ ๊ฒ๋ค์ด ์์ต๋๋ค. ๊ทธ ์๊ฐ ๋์ ํ๋ฉด์ ๋ฌด์์ด ๋์ฌ์ง ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค. ํ๋ ์์ํฌ๊ฐ ๊ฑฑ์ ํ ์ผ์ด ์๋๋๋ค.
๋์ ์ผ๋ก ๋ก๋๋ ๊ตฌ์ฑ ์์์ ๋ํ ๊ธฐ๋์น๊ฐ ์ผ๊ด์ ์ด๋ผ๋ ๋ฐ ๋์ํ์ง๋ง ๋ถ๋ชจ์ ๋ํ ๋์์ ๊ทธ๋ ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ IMO๋ ์์ ๊ตฌํ์ ๋ถ๋ชจ์๊ฒ ๋ ธ์ถํ๊ณ ๋ถ๋ชจ๊ฐ ํด๋น ๋์ ๊ตฌ์ฑ ์์๋ก ๋ฌด์์ ํด์ผ ํ๋์ง ์์๋ด๋๋ก ๊ฐ์ ํ๋ ๊ฒ์ ๋๋ค. ๋์ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋๋ ๋ฐฉ์๊ณผ ์์ ๊ตฌ์ฑ ์์์ ์ํ๋ ์์์๊ฒ ๋ฌ๋ ค ์์ด์ผ ํฉ๋๋ค. ๋น๋๊ธฐ๋ฅผ ๋ก๋ํ๋ ๊ฒฝ์ฐ Vue์ ๋ฌด์์ ๊ทธ ์๋ฆฌ์ ๋ ๋๋งํด์ผ ํ๋์ง(๋๋ ๋ ๋๋งํ์ง ์์์ผ ํ๋์ง) ์ค๋ช ํ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์๋ก์ด ๋ณต์ก์ฑ์ ๋์ ํ๋ ๊ฒ๋ณด๋ค ํ๋ ์์ํฌ๊ฐ ์ด๋ฏธ ์๋ํ๋ ๋ฐฉ์์ ๋๋ค.
FYI: ๋น์ ์ ์ด๊ฒ์ด ๊ตฌํ๋์ด์ผ ํ๋ค๋ ๋ฐ ๋์ํ์ง๋ง, ๋น์ ์ด ์ธ๊ณ ์๋ ์ด๋ฌํ ๋ณต์ก์ฑ์ ๋์ ํ ๊ฒ์ด๊ณ ๊ทธ๋ Vue 3๋ณด๋ค ๋ธ๋ ์ดํน ์ฒด์ธ์ง๊ฐ ๋์ ๋ ๋ ๋์ค์ ์ํ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์ ์ ๊ทธ๊ฐ ํ์ํ๋ค๊ณ ๋๋๋ค๋ ๊ฒ์ ๋๋ค. .
๋ํ, ๋๋ ๋น์ ์ ์ฃผ์ฅ์ ์์ ํ ๋ฐ๋ฅด์ง ์์ต๋๋ค.
๋น์ ์ด ๋งํ๋ ๊ฒ์ v-if/v-clock/v-show ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉด ๋์ ๊ดํ์ ์กฐ์ฅํ๋ฏ๋ก ํด๋น ๊ธฐ๋ฅ์ ์ ๊ฑฐํ์ฌ ํ๋ ์์ํฌ๋ฅผ ๋ ์ ์์ผ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ด ๊ฒฝ์ฐ ๋ง์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์์ฑ๋ ๋น๋๊ธฐ ๊ตฌ์ฑ ์์๋ฅผ ๋์ ํ๋ฉด ๋์ ์ต๊ด ์ด ๋ฐ์ํ๋ค๋ ๊ฒ์ ๋ถ๋ช ํ ์ ์ ์์ง๋ง ์ด๊ฒ์ด ์ค์ ๋ก ๋ฐ์ํ๋์ง ํ์คํ์ง ์์ต๋๋ค. ๋์งธ, ๊ทธ๊ฒ์ด ๋์ ์ต๊ด์ ์ผ์ผํค๋๋ผ๋ ์๋ก์ด ๋์ ์ต๊ด์ ๋ง๋ค๊ธฐ ์ํ ์ ๋นํ๋ก ์ฌ์ฉํ๊ธฐ๋ณด๋ค๋ ๊ทธ๊ฒ์ ๊ณ ์น ๊ฒ์ ์ ํํด์ผ ํ๋ค๋ ์ง๋ฌธ์ ๋์ง๊ณ ์์ต๋๋ค.
v-if
๋ฑ์ ์ํด ์์ฑ๋๋ ๋์ ๊ดํ์ ์๊ณ ์๋ค๋ฉด... ์ ๋นํ๋ก ์ฌ์ฉํ๋ ค๊ณ ํ๊ธฐ ๋ณด๋ค๋ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ๋ช ์์ ์ผ๋ก(๋ฌผ๋ก ๋ค๋ฅธ ๋ฌธ์ ์์) ๊ณต์ ํ๋๋ก ์ด๋ํฉ๋๋ค. ๋ค๋ฅธ ํ ๋ก ์ ์ํด.
๋๋ ๋จ์ง async...
๋ํด ๋งํ ๊ฒ๊ณผ ์ ์ฌํ ๊ตฌ์ฑ ์์์ ๋ ๋๋ง์ ์ฐจ๋จํ๋ ๋ฐ ์๋ชป ์ฌ์ฉ๋ ์ ์๋ ๊ธฐ๋ฅ์ ์๋ก ์ด๋ฌํ ์ง์๋ฌธ์ ์ง์ ํ์ต๋๋ค. ์๋ฌด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋๊ตฐ๊ฐ๊ฐ "๋์ ๊ดํ"์ ์ฌ์ฉํ์ฌ ์ ์ ๋์ ๋น ํ์ด์ง๋ฅผ ํ์ํ๋ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ง์๋ฌธ์ ์ ๊ฑฐํด์ผ ํฉ๋๊น? ์ค์ ๋ก ๊ทธ๋ฐ ์ผ์ ์ผ์ด๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ํ๋ ์ฌ๋์ ๋ณผ ์ ์์ต๋๋ค. ๋์ฐํ ์ ๋๋ก ๊ฐ์ฅ ๋์ ์๋ฅผ ๋ค๋ ค๊ณ ํ์ง ์๋ ํ ๋ง์
๋๋ค.
์์ ์ ์์ง ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ณผ ์ ์๋ค๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๋์๊ฒ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ๋งํ์ง ๋ง์ญ์์ค. ๋ฐ๋ผ์ ํด์๋ ์ ๋ฉ๋๋ค. ๋์ ์ต๊ด์ ๋ฌด์ง์ ๋ฌธ์ ์ด๋ฉฐ ๋ฌด์งํ ์ฌ๋์ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ ํ ์ฌ์ฉํ์ง ์์ ์ ์์ต๋๋ค.
๋๊ตฐ๊ฐ๊ฐ https://github.com/vuejs/vue/issues/7209#issuecomment -424349370 ์์ ์ง๋ฌธํ๋๋ฐ ๋ด๊ฐ ๋ณธ ํ ์๋ฌด๋ ๊ทธ์๊ฒ ๋๋ตํ์ง ์์์ต๋๋ค. ์ด๊ฒ์ Vue๊ฐ ์ด ๋ถ๋ถ์์ ๋ค์ฒ์ง๊ณ ์์์ ์ง์ ์ผ๋ก ๋ณด์ฌ์ค๋๋ค. ์ํคํ ์ฒ์ ์ด ๋ถ๋ถ์ ์์ง ๋น๋๊ธฐ๊ฐ ์๋์์ ๋ ์ค๊ณ๋์์ต๋๋ค. ๋ฐ๋ผ์ ํ๋ ์ํคํ ์ฒ์ ๋ํ ์ต์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ์ข์ ์๊ฐ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋๋จธ์ง๋ ์ ๊ณ์์ ์ผ์ด๋๊ณ ์๋ ์ผ์ ํ๋ ๊ฒ๋ณด๋ค ๊ทธ๊ฒ์ ์ํํ๋ ํน์ ๋ฐฉ๋ฒ์ ํ์๋ก ํ๋ ํดํน ๋ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค.
ํ์ง๋ง ์์ง ํ์คํ์ง๋ ์์ง๋ง ์๋ก์ด ๊ธฐ๋ฅ์ API๋ฅผ ํ ๋์ ๋ณด๋ฉด ์ค์ ๋ก ๊ทธ๋ ๊ฒ ํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ธฐ๋ฅ์ ์ด๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ ์๋ช ์ฃผ๊ธฐ ํํฌ์ ๊ฐ์ด ๊ฐ๊ด์ ์ผ๋ก ํ ์ ์๋ ํน์ ์์ ์ ์ํํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
์์ ์ ์์ง ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ณผ ์ ์๋ค๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๋์๊ฒ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ๋งํ์ง ๋ง์ญ์์ค. ๋ฐ๋ผ์ ํด์๋ ์ ๋ฉ๋๋ค. ๋์ ์ต๊ด์ ๋ฌด์ง์ ๋ฌธ์ ์ด๋ฉฐ ๋ฌด์งํ ์ฌ๋์ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ ํ ์ฌ์ฉํ์ง ์์ ์ ์์ต๋๋ค.
๊ทธ ์ ์ ์ง์ ํ ์ ์ด ์์ต๋๋ค. ๊ตฌ์ฑ ์์๊ฐ ๋ ๋๋ง๋๋ ๊ฒ์ ์ฐจ๋จํ์ง ์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ ์์
์ ์ํํ๊ณ ์ถ๋ค๋ ์ ์ ๊ฐ์กฐํ๊ณ ์์ต๋๋ค. mounted
๋๋ created
๋ธ๋ก์์ async
์์
์ ์ํํ๋ฉด ๊ตฌ์ฑ ์์ ๋ ๋๋ง์ด ์ง์ฐ๋๋ค๋ ๊ฒ์ ์ง๊ด์ ์ด์ง ์์ต๋๋ค. ์ด๊ฒ์ด ์ฌ์ค์ด๋ผ๊ณ ๊ฐ์ ํ๋ฉด ๋์ ํ์ฌ ๊ธฐ๋ฅ์ ์ํ๋ ์๋น์๊ฐ ์งํํ๋ ๋ฐฉ์์์ ๋ณต์ก์ฑ์ด ๋ฐ์ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ง๊ธ๊น์ง์ ์ฃผ์ฅ์ ์๊ตฌ๋๋ ๊ฒ์ด ์ํ๋ ์ ์๋ค๋ ๊ฒ์ด ์๋๋ผ ์๊ตฌ๋๋ ๊ฒ์ด ๊ธฐ๋ณธ๊ฐ์ด์ด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. v-if="loaded"
๊ธฐ๋ฐ์ผ๋ก ํ์๋ ํ
ํ๋ฆฟ์ ์ ํํ์ฌ ๊ตฌ์ฑ์์์ ๋ ๋๋ง์ ์ด๋ฏธ ์ฐจ๋จํ ์ ์์ต๋๋ค.
์ง๊ธ ์ฝ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ ๋๋งํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ์ฌ ํด๋น ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<template>
<div>
<spinner v-if="!loaded">
<div v-else>
....
</div>
</template>
<script>
async created() {
await this.loadData();
this.loaded = true;
}
</script>
์ฐจ๋จ์ผ๋ก ๋ ๋๋งํ๋ ๊ฒ์ ์ค์ ๋ก ์ฐจ๋จํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ณด์
๋๋ค. async created()
์ค์ ๋ก ๊ตฌ์ฑ ์์๋ฅผ ์ฐจ๋จํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด์ ์ฝ๋๊ฐ ๋ถ๋ฆฌ๋์์ต๋๋ค. ์คํผ๋๋ฅผ ํ์ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค.
<template>
<div>
<spinner v-if="!loaded">
<div v-else>
....
</div>
</template>
<script>
created() {
this.loadData().then(() => this.loaded = true);
}
</script>
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ํ๋ฉด์์ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ๋ ๊ฒ์ ๋ฌด์ํ์ญ์์ค.
<template>
<div>
<div>
....
</div>
</template>
<script>
async created() {
await this.loadData();
}
</script>
๋ ๋๋ง์ ์ฐจ๋จํ๊ธฐ ์ํด ์ด๋ฌํ ๋จ์ํ๋ฅผ ์ถ๊ฐํ๋ฉด ์ฐจ๋จ์ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค์ง ์๋ ๊ฒ์ด ์ด๋ค ์ด์ ์ด ์์ต๋๊น? ๋๋ ๋จ์ง ๊ทธ๊ฒ์ ๋ณด์ง ์๊ณ ์๋ค.
@yyx990803 ๊ผญ
๋ค์์ ์๋ช
์ฃผ๊ธฐ ํํฌ์ ๋น๋๊ธฐ์ ... await๊ฐ ์๋ ๊ฒฝ์ฐ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌ๋ ์ ์๋ ์ฌ์ฉ ์ฌ๋ก์
๋๋ค.
_๋๋ ์ค์ ๋ก ์ฑ์์ ์ด๊ฒ์ ํ๊ณ ์ถ์๊ณ ์ด๊ฒ์ ๋ฌ์ฑํ๊ธฐ ์ํด ๋ชป์๊ธด ์ฝ๋๋ฅผ ์ป์์ต๋๋ค. ์ด๊ฒ์ coz_์ ๋งค์ฐ ์ธ์์ ์ธ ์์
๋๋ค.
์์ ์ ๋ง์ดํธํ๊ธฐ ์ ์ ๊ตฌ์ฑ ์์ B && C์ mounted
ํํฌ๊ฐ ์คํ๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ค๋ฉด ๊ตฌ์ฑ ์์ A ๊ฐ ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ๊ตฌ์ฑ ์์ A์ mounted
๋ created
ํํฌ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋ฉฐ, ์ด๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ๊ตฌ์ฑ ์์ B ๋ฐ C ์ ๋ง์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ต๋๋ค_(๋๊ธฐ ์ ์ ์ค์ ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ํ ์ ์์)_. ๋ฌธ์ ๋ ์ด ๋ฐฉ๋ฒ์ด ๋ ์ฝ๊ณ ๊ด๋ จ ๊ตฌ์ฑ ์์์ ๋ํด ๋ชจ๋ ๊ฒ์ด ํ ๊ณณ์ ์๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๊นจ๋ํ๊ณ ์ง๊ด์ ์
๋๋ค.
A ๋ ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ด๊ณ B ์ C์ ์๋ต์ ์์ ํฉ๋๋ค. _( B ์ C๋ ๊ณ์ํ๊ธฐ ์ ์ A ์ ์ ํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ , ์ผ๋จ ๋ง์ดํธ๋๋ฉด ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ ๋๋ค)_ ๊ณ์ํ๊ธฐ ์ ์ ๊ฐ๋จํฉ๋๋ค. ์ด๋ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด ๋ค๋ฅธ ๊ณณ์ ํฉ์ด์ ธ ์๋ ๊ด๋ จ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋
์ฃผ์ ํธ์คํ ๊ตฌ์ฑ ์์ , ๋ชจ๋ ๊ตฌ์ฑ ์์๊ฐ ํจ๊ป ๋ก๋๋์ง๋ง ์ด๋ฒคํธ ๋ฐ ๋น๋๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฐ๋ฅธ ๊ตฌ์ฑ ์์๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค... ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ด ์์ด๋ค์ด ๋ฌด์์ ํ๋์ง๋ ๋ ์ ๊ฒฝ์ฐ๊ณ ์ค์ค๋ก ๋ช ๋ นํฉ๋๋ค.
<template>
<div>
...
<component-A/>
<component-B/>
<component-C/>
... other conent
</div>
</template>
<script>
import ComponentA...
...
export default {
components: { ComponentA... }
}
</script>
๊ตฌ์ฑ ์์ A ๋ B์ C์ ์ฅ์ฐฉ์ ์ข ์ ํญ๋ชฉ์ผ๋ก ์ ์ดํฉ๋๋ค. ํธ๋ฆฌ๊ฑฐ๋ ๋์ค์ ๋ค๋ฅธ ํํฌ์์ ๋๋ ๋์ผํ ๊ตฌ์ฑ ์์์ UX ์ด๋ฒคํธ๋ฅผ ํตํด ์ํ๋ ์ ์์ต๋๋ค. ๋ค์์ ์ฌ๊ธฐ์์ ์์ด๋์ด๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
<template>
...
</template>
<script>
export default {
async created() {
// ...do something here before mounting thrusters, even await it
this.root.$emit('mount-thrusters');
await Promise.all([
this.wasMounted('thruster-1-mounted'),
this.wasMounted('thruster-2-mounted')
]);
},
mounted() {
// will only run after components B and C have mounted
...
},
methods: {
wasMounted(compEvent) {
return new Promise( (resolve)=>this.root.$once(compEvent, ()=>resolve()));
}
}
}
</script>
์ฑ๋ถ B
<template>
...
</template>
<script>
export default {
async created() {
// ...do something here, even await it, but happens at the same time as all components
await new Promise( (resolve)=>this.root.$once('mount-thrusters', ()=>resolve()));
},
mounted() {
this.root.$emit('thruster-1-mounted');
}
}
</script>
์ฑ๋ถ C
<template>
...
</template>
<script>
export default {
async created() {
// ...do something here, even await it, but happens at the same time as all components
await new Promise( (resolve)=>this.root.$once('mount-thrusters', ()=>resolve()));
},
mounted() {
this.root.$emit('thruster-2-mounted');
}
}
</script>
์์ ์ฝ๋๋ ๋ง์ ์ค๋ณต ์ฝ๋ ์ค๋ํซ์ด ์์์ ํ์ธํ๋ ๋ฏน์ค์ธ์ผ๋ก ๋ ๋จ์ํํ ์ ์์ต๋๋ค. ์ ๋ ๊ทธ๋ฅ ๋ช ํํ๊ฒ ํ๊ณ ์ถ์์ต๋๋ค. wasMounted ๋ฉ์๋๋ ๋ฏน์ค์ธ์ ํฌํจํ ์ ์์ผ๋ฉฐ 3๊ฐ์ง ๊ตฌ์ฑ ์์ ๋ชจ๋์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ๋์ผํ ๊ฒ์ ์ ์ดํ๊ธฐ ์ํด ๋ค๋ฅธ ๊ณณ์ ํฉ์ด์ ธ ์๋ ๋ค๋ฅธ ํดํน ๋๋ ๋ผ์ฐํฐ ์ฝ๋ ์์ด ๊ฐ ๊ตฌ์ฑ ์์๊ฐ ๊ธฐ๋ํ๋ ๊ฒ์ ๋ช ํํ๊ฒ ๋ณผ ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ ์์ด ์ค์ ๋ก ์ด ์์ ์ ์ํํ๋ ๊ฒ์ ๋งค์ฐ ํผ๋์ค๋ฝ์ต๋๋ค. ์ฑ์์ ์ด ์์ ์ ์ํํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ ๋ถ๋ช ํ ๋ถํ์ํ๊ฒ ๋ณต์กํ๊ณ ์ ์ง ๊ด๋ฆฌํ ์ ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
์ด์ ๋ค๋ฅด๊ฒ ๋์ํ๋ 32๊ฐ์ ์ถ์ง๊ธฐ ๊ตฌ์ฑ ์์๊ฐ ์๋ ๋ํ ์ฑ์์ ์ด๊ฒ์ ์์ํด ๋ณด์ญ์์ค. ๋ฏน์ค์ธ์ ๋ฃ์ผ๋ฉด 2๊ฐ๋ก ์ค์ผ ์ ์๋ ์ฝ 3๊ฐ์ ํฌ์ธํธ๋ง ์๊ฐํ ์ ์์ต๋๋ค.
์ด๋ ๋ง์ดํธ ๋ฐ ์์ฑ์๋ง ๊ตญํ๋์ง ์๊ณ ์ค์ ๋ก ๋ค๋ฅธ ๋ชจ๋ ์๋ช
์ฃผ๊ธฐ ํํฌ์ ํจ๊ป ์๋ํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ์ง์ด๋ ์๋ก์ด beforeActivate
/ beforeUpdate
ํํฌ์ ์๋ค๊ณ ์์ํด๋ณด์ญ์์ค. ์ฐ๋ฆฌ๋ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค ์ await๋ฅผ _activation / update_ ๋ง _activate / update_ ๋ค๊ณผ ๊ตฌ์ฑ ์์๊ฐ _activated / ์
๋ฐ์ดํธ ๋จ์ ๋๋ง๋ค ์๋ฃ๋๋ฉด; ์ ์ ํ ์ํ๋ฅผ ์ ์งํฉ๋๋ค.
์ผ๋จ ์ด๊ฒ์ด ๊ตฌํ๋๋ฉด ๋ชฉ๋ก์ ๋์ด ์์ต๋๋ค.
์์ ์ ์์ง ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ณผ ์ ์๋ค๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๋์๊ฒ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ๋งํ์ง ๋ง์ญ์์ค. ๋ฐ๋ผ์ ํด์๋ ์ ๋ฉ๋๋ค. ๋์ ์ต๊ด์ ๋ฌด์ง์ ๋ฌธ์ ์ด๋ฉฐ ๋ฌด์งํ ์ฌ๋์ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ ํ ์ฌ์ฉํ์ง ์์ ์ ์์ต๋๋ค.
๊ทธ ์ ์ ์ง์ ํ ์ ์ด ์์ต๋๋ค. ๊ตฌ์ฑ ์์๊ฐ ๋ ๋๋ง๋๋ ๊ฒ์ ์ฐจ๋จํ์ง ์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ ์์ ์ ์ํํ๊ณ ์ถ๋ค๋ ์ ์ ๊ฐ์กฐํ๊ณ ์์ต๋๋ค.
mounted
๋๋created
๋ธ๋ก์์async
์์ ์ ์ํํ๋ฉด ๊ตฌ์ฑ ์์ ๋ ๋๋ง์ด ์ง์ฐ๋๋ค๋ ๊ฒ์ ์ง๊ด์ ์ด์ง ์์ต๋๋ค. ์ด๊ฒ์ด ์ฌ์ค์ด๋ผ๊ณ ๊ฐ์ ํ๋ฉด ๋์ ํ์ฌ ๊ธฐ๋ฅ์ ์ํ๋ ์๋น์๊ฐ ์งํํ๋ ๋ฐฉ์์์ ๋ณต์ก์ฑ์ด ๋ฐ์ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ง๊ธ๊น์ง์ ์ฃผ์ฅ์ ์๊ตฌ๋๋ ๊ฒ์ด ์ํ๋ ์ ์๋ค๋ ๊ฒ์ด ์๋๋ผ ์๊ตฌ๋๋ ๊ฒ์ด ๊ธฐ๋ณธ๊ฐ์ด์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.v-if="loaded"
๊ธฐ๋ฐ์ผ๋ก ํ์๋ ํ ํ๋ฆฟ์ ์ ํํ์ฌ ๊ตฌ์ฑ์์์ ๋ ๋๋ง์ ์ด๋ฏธ ์ฐจ๋จํ ์ ์์ต๋๋ค.์ง๊ธ ์ฝ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ ๋๋งํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ์ฌ ํด๋น ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.<template> <div> <spinner v-if="!loaded"> <div v-else> .... </div> </template> <script> async created() { await this.loadData(); this.loaded = true; } </script>
์ฐจ๋จ์ผ๋ก ๋ ๋๋งํ๋ ๊ฒ์ ์ค์ ๋ก ์ฐจ๋จํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ณด์ ๋๋ค.
async created()
์ค์ ๋ก ๊ตฌ์ฑ ์์๋ฅผ ์ฐจ๋จํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด์ ์ฝ๋๊ฐ ๋ถ๋ฆฌ๋์์ต๋๋ค. ์คํผ๋๋ฅผ ํ์ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค.<template> <div> <spinner v-if="!loaded"> <div v-else> .... </div> </template> <script> created() { this.loadData().then(() => this.loaded = true); } </script>
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ํ๋ฉด์์ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ๋ ๊ฒ์ ๋ฌด์ํ์ญ์์ค.
<template> <div> <div> .... </div> </template> <script> async created() { await this.loadData(); } </script>
๋ ๋๋ง์ ์ฐจ๋จํ๊ธฐ ์ํด ์ด๋ฌํ ๋จ์ํ๋ฅผ ์ถ๊ฐํ๋ฉด ์ฐจ๋จ์ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค์ง ์๋ ๊ฒ์ด ์ด๋ค ์ด์ ์ด ์์ต๋๊น? ๋๋ ๋จ์ง ๊ทธ๊ฒ์ ๋ณด์ง ์๊ณ ์๋ค.
์ด๊ฒ์ Vue 101 ๋ถํธ์บ ํ์ด๊ณ ๊ฑฐ๊ธฐ์๋ ์๋ก์ด ๊ฒ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์์ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃจ๊ธฐ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ฌ๊ธฐ์ ์์ด๋์ด๋ Vue๊ฐ ์ค์ ๋ก ์ฌ์ฉ๋๋ ์ฌ์ฉ์ ์์ญ์ ๋ณต์ก์ฑ์ ์ค์ด๊ณ ์ถ๋ก ์ฝ๋์ ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์ ๋ ๋๋ง์ ๋ฌธ์ ๊ฐ ์๋๋ผ ์ค์ ๋ก ๊ฒฐ๊ณผ๊ฐ ๋ ๋๋ง๋๊ธฐ ์ ์ ์ผ์ด๋๋ ์ผ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ตฌ์ฑ ์์๋ฅผ ์งํํ๊ฑฐ๋ ๋ ๋๋งํ๊ธฐ ์ ์ ์์ ์ ์ํํ ์ ์๋ ์์ ๋ฅผ ์ํฉ๋๋ค. ์ด์จ๋ ์ด๊ฒ์ ๋ ๋๋ง ์ฐจ๋จ๊ณผ ์ ํ ๊ด๋ จ์ด ์์ต๋๋ค. Vue๊ฐ ์ง์ํ๋ ๋ง์ ์๋ช ์ฃผ๊ธฐ ํํฌ๊ฐ ์์ผ๋ฉฐ ๋ค๋ฅธ ํํฌ์ ๋ํด ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์ค์ ๋ก ์ ์ฉํ ์ ์์ต๋๋ค. ์์ด๋์ด๋ Vue๊ฐ ๋ค์ ํํฌ ๊ธฐ๋ฅ์ผ๋ก ์ด๋ํ๊ธฐ ์ ์ ๋ด๋ถ์ ์ผ๋ก ๋น๋๊ธฐ๋ฅผ ์กด์คํ๋ ๊ฒ์ ๋๋ค.
B & C๋ฅผ A์ ์ฐ๊ฒฐํ๋ ๋์ ์ฝ๋๋ฅผ A.js์ "๋ก๋ A"๋ก ์ด๋ํ ๋ค์ A.js๊ฐ "B.data" ๋ฐ "C.data"๋ฅผ ์
๋ฐ์ดํธํ๋๋ก ํ๋ ๊ฒ์ด ์ ๋ง ํผ๋์ค๋ฝ์ต๋๋ค. . ๊ทธ๋ ๊ฒ ํ๋ฉด ์ด๋ค ์ด์ ๋ก๋ A.data๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ค๋ฅธ ๊ตฌ์ฑ ์์๊ฐ ์์์ ์๋ํ์ง ์๊ณ ์๋์ผ๋ก ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค.
ํ ๊ตฌ์ฑ ์์์์ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๋ก ์ ์ดํฉ๋๋ค. ๊ณต์ ๋ ๊ฒฝ์ฐ์๋ ์ฌ์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ตฌ์ฑ ์์ A ์์ A๋ฅผ ๋ ๋๋งํฉ๋๋ค. ์ฐ๋ฆฌ๋ fetchData ๋ฐ hasInitialized ์ ๊ฐ์ ๋ฉ์๋๊ฐ ํฌํจ๋ ๋จ์ผ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ผ๋ฉฐ, ํ์๋ ์ฝ์์ด๊ณ ์ ์๋ ํ์๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๊ตฌ์ฑ ์์๋ฅผ ์ง์ ์ฐ๊ฒฐํ๋ฉด ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๊ณ vue๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ค์ ๋ ๋๋งํ ์ ์๋๋ก ํ๋ ์๊ธฐ์น ์์ ์ข
์์ฑ ํธ๋ฆฌ๊ฐ ์์ฑ๋ฉ๋๋ค.
๋๋ ์ ์ญ ๋ฒ์๊ฐ ์๋๋ผ A, B, C์ ๋ถ๋ชจ์๊ฒ ์ง์ ์ด๋ฒคํธ๋ฅผ emit
ํ๊ณ ๋ถ๋ชจ๊ฐ B์ C๋ฅผ ๋ ๋๋งํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋๋ก ํฉ๋๋ค.
<template>
<a-component @rendered="showBandC = true" />
<b-component v-if="showBandC" />
<c-component v-if="showBandC" />
</template>
์ด ๊ฒฝ์ฐ B์ C๊ฐ ๋ ๋๋ง๋๊ธฐ ์ ์ ์ค์ ๋ก ๋ ๋๋งํด์ผ ํ๋ A์ ๋ํ ๊ฒ์ ๋ฌด์์
๋๊น? created()
๋ฉ์๋์ ํญ๋ชฉ์ด ์๋ ๊ฒฝ์ฐ JavaScript ํด๋์ค๋ฅผ ํตํด ๋๋ store
๋ชจ๋์ ์ฌ์ฉํ์ฌ ์ ์ฅ์๋ฅผ ์ฑ์ฐ๋ ๊ฒ์ ๋ฐฉํดํ๋ ๊ฒ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ช
์์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๋ ๋์์ด ๋ฉ๋๋ค. ์ฆ, ์บก์ฒํ ์ ์๋ ์ฌ์ฉ์ ์คํ ๋ฆฌ์ UX๋ ๋ฌด์์
๋๊น?
์์ด๋์ด๋ Vue๊ฐ ๋ค์ ํํฌ ๊ธฐ๋ฅ์ผ๋ก ์ด๋ํ๊ธฐ ์ ์ ๋ด๋ถ์ ์ผ๋ก ๋น๋๊ธฐ๋ฅผ ์กด์คํ๋ ๊ฒ์ ๋๋ค.
๋ฌผ๋ก ๊ทธ ๋ถ๋ถ์ ์ดํด๊ฐ ๋์ง๋ง ์์ ๊ฐ ๋ณต์กํด์ผ ํ๋ ์ด์ ๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์คํ ๋ฆฌ๋ฅผ ๋งํด๋ณด์ธ์.
๋ด ๊ตฌ์ฑ ์์์๋ async beforeMount
๋ฐ async mounted
๊ฐ ๋ชจ๋ ์์ง๋ง beforeMount
์ ์ฝ๋๊ฐ ์๋ฃ๋๊ธฐ ์ ์ mounted
์ ์ฝ๋๊ฐ ์คํ๋ฉ๋๋ค. beforeMount
๊ฐ ์๋ฃ๋๊ธฐ ์ ์ mounted
๋๋ ๊ฒ์ ์ด๋ป๊ฒ ์ฐจ๋จํ ์ ์์ต๋๊น?
์ด๊ฒ์ ์๋ ์์ฒญ์ ์ผ์ข ์ด๋ฏ๋ก ๋ ๋ฒ์งธ ์๋ต์์ ์ ๊ธฐ๋ ์ง๋ฌธ์ ์ฌ์ ํ โโ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. https://github.com/vuejs/vue/issues/7209#issuecomment -350284784
์ง๊ธ์ ์ข ๋ฃ๋์ง๋ง ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ์ถ๋ก /์ฌ์ฉ ์ฌ๋ก/์ํฅ์ ์์ ๋กญ๊ฒ ํ์ ์กฐ์น๋ฅผ ์ทจํ์ญ์์ค.
์ค์ ๋ก ์ด์ ์ ์คํ๋ ์๋ช ์ฃผ๊ธฐ ํํฌ๋ฅผ ์ฐจ๋จํด์ผ ํ๋ ์ ํจํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๊น, ์๋๋ฉด ์๋ช ์ฃผ๊ธฐ ํํฌ๋ฅผ ๋๊ธฐ์์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ๊ฐ์? ์ง๊ธ๊น์ง ํ ๋ก ์ ๋ณธ์ง์ ์ผ๋ก ์ฒ ํ์ ์ด์์ง๋ง(์ข์ ์ํคํ ์ฒ ํ ๋ก ์ด ๊ทธ๋ฌํ๋ฏ์ด) ์ค์ ๋ก ๋ฌธ์ ๋ ์ด๋ ๊ฒ ํ๋ ๋ฐ ์ค์ ๋ก ํฉ๋นํ ์ด์ ๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ํ๋ ์์ํฌ๊ฐ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๋ ๊ฒ์ ์ ์ ์์ฌํ์ง ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ํ์ง ์๊ฑฐ๋ ์ฝ๋ฐฑ์ ์ ๋ฌ(๋๋ ์ฝ๋ฐฑ์ ์ ๋ฌํ์ง๋ง ์ฝ๋ฐฑ์ ์ฝ๋ฐฑ์ ์ ๋ฌํ์ง ์์)ํ์ง ์์ N๊ฐ์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ํํ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ๋น๋๊ธฐ ์๋ช ์ฃผ๊ธฐ ํํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๊น? ์๋๋ฉด "ํ์ง ๋ง์์ผ ํ " ์์ ์ ์๋ํ ๊ฒฐ๊ณผ์ ๋ํ ์ด์ ์ ๋๊น?
์ฆ, created
์๋ฃ๋์ง ์์ ๊ตฌ์ฑ ์์๋ฅผ unmount
ํ๋ ค๊ณ ํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น? ์์ฐ, ์ฌ์ ํ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ์ข์ง ์์ต๋๋ค. ๋๋ destroying
์๋ฃ๋์ง ์์ mounted
, ๋๋ ๊ทธ ๊ธฐ๋ฅ์ ๊ตฌํ์๋ฅผ ๋ถ๋ฌ์ํ์ง ์์ต๋๋ค.
B & C๋ฅผ A์ ์ฐ๊ฒฐํ๋ ๋์ ์ฝ๋๋ฅผ A.js์ "๋ก๋ A"๋ก ์ด๋ํ ๋ค์ A.js๊ฐ "B.data" ๋ฐ "C.data"๋ฅผ ์ ๋ฐ์ดํธํ๋๋ก ํ๋ ๊ฒ์ด ์ ๋ง ํผ๋์ค๋ฝ์ต๋๋ค. . ๊ทธ๋ ๊ฒ ํ๋ฉด ์ด๋ค ์ด์ ๋ก๋ A.data๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ค๋ฅธ ๊ตฌ์ฑ ์์๊ฐ ์์์ ์๋ํ์ง ์๊ณ ์๋์ผ๋ก ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค.
๊ทธ๊ฒ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๊ณ ๋์ ์ต๊ด์ ๋๋ค. ์ฌ๊ธฐ์ ์ ์ฒด๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ๋ฌด์จ ๋ง์ธ์ง ๋ณด๊ฒ ์ต๋๋ค. ํ์ง๋ง ์ ๊ฒ๋ ๋ณต์ก์ฑ์ด ๋ง์ด ์ฆ๊ฐํ์ต๋๋ค.
ํ ๊ตฌ์ฑ ์์์์ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๋ก ์ ์ดํฉ๋๋ค. ๊ณต์ ๋ ๊ฒฝ์ฐ์๋ ์ฌ์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ตฌ์ฑ ์์ A ์์ A๋ฅผ ๋ ๋๋งํฉ๋๋ค. ์ฐ๋ฆฌ๋ fetchData ๋ฐ hasInitialized ์ ๊ฐ์ ๋ฉ์๋๊ฐ ํฌํจ๋ ๋จ์ผ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ผ๋ฉฐ, ํ์๋ ์ฝ์์ด๊ณ ์ ์๋ ํ์๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์ด๊ฒ์ ์ด์ ๊ตฌ์ฑ ์์๋ฅผ ๋๋ฌด ๋ง์ด ๊ฒฐํฉํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ๋ค์ด A๋ฅผ ์ ์ธํ๊ณ ๋ค๋ฅธ ๊ฒ ์์ด ์๋ํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
๊ตฌ์ฑ ์์๋ฅผ ์ง์ ์ฐ๊ฒฐํ๋ฉด ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๊ณ vue๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ค์ ๋ ๋๋งํ ์ ์๋๋ก ํ๋ ์๊ธฐ์น ์์ ์ข ์์ฑ ํธ๋ฆฌ๊ฐ ์์ฑ๋ฉ๋๋ค.
์ฌ์ค ๋น์ ์ ์์ ์ ๋์น๊ณ ์์ต๋๋ค. ์ด๊ฒ๋ค์ ๊ฐ๊ฐ ๋ค๋ฅธ ๊ฒ์ ์ํฅ์ ๋ฏธ์น์ง ์๊ณ ์ฌ์ฉํ๊ณ ์ ์งํ ์ ์๋ ํ์ฅ๊ณผ ๋์จํ๊ฒ ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค. ์ฌ์ค <component-x />
, v-if
, vuex ์ด์ธ์ ๋ถ๋ชจ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ์๋ฌด ๊ณณ์์๋ ์ฌ๋ฌ ๋ฒ ์ญ์ ํ ์ ์์ต๋๋ค.
๋๋ ์์ฐํ๊ธฐ ์ํด A๋ฅผ B์ C์ ์ฐ๊ฒฐํ์ต๋๋ค. ์ด๊ฒ์ ๋ฉ์ง๊ฒ ๋ถํ ํ๊ฑฐ๋ ๋ช ๊ฐ์ ๊ตฌ์ฑ ์์๊ฐ ์๋ตํ๋์ง ๊ณ์ฐํ ๋ค์ ํน์ ์์ ์(์ด ๊ฒฝ์ฐ 2)์ ๋๋ฌํ๋ฉด ๊ณ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
this.$root.$emit('thruster-mounted') // in B and C
// instead of
this.$root.$emit('thruster-1-mounted') // for B and 2 for C
// then count the responses and resolve once they are >= 2 in component A
์ด์จ๋ , ์ด๊ฒ์ด ๋ด๊ฐ ๊ตฌ์ฑ ์์ ์ข ์์ฑ ์ฒ๋ฆฌ๋ผ๊ณ ๋งํ ์ด์ ์ ๋๋ค. ์ด๊ฒ์ ๋ฐ๋์งํ๊ณ ์์๋์ง๋ง ๋ณต์กํ ์๋ก ๋ ํผ๋์ค๋ฌ์์ง๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ํ ๋ ๋ณต์กํ๊ฒ ์ํ๋์ด์ผ ํฉ๋๋ค.
๋๋ ์ ์ญ ๋ฒ์๊ฐ ์๋๋ผ A, B, C์ ๋ถ๋ชจ์๊ฒ ์ง์ ์ด๋ฒคํธ๋ฅผ
emit
ํ๊ณ ๋ถ๋ชจ๊ฐ B์ C๋ฅผ ๋ ๋๋งํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋๋ก ํฉ๋๋ค.
๋๋ ๋น์ ์ด ์ด๋ฐ ๋ง์ ํ ์ค ์์์ง๋ง ์ด๊ฒ์ ๋ฐ๋์งํ์ง ์์ต๋๋ค. ์ด๋ฌํ ๊ตฌ์ฑ ์์๋ ๋ค๋ฅธ ๊ฒ์ ์ํด ์ ์ด๋์ด์๋ ์ ๋๋ฏ๋ก ์ฃผ์ ๊ตฌ์ฑ ์์๋ ์์์ด ํ๋ ์ผ์ ๋ ์ ๊ฒฝ์ฐ๊ณ ๋
๋ฆฝ์ ์ผ๋ก ์ ์ง๋์ด์ผ ํ๋ค๊ณ ๊ฐ์กฐํ์ต๋๋ค. ์ฑ์ ์๋ฌด ๊ณณ์๋ ๋ฐฐ์นํ ์ ์๊ณ ์ฌ์ ํ ๋์ผํ ์์
์ ์ํํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค . ๋น์ ์ด ๊ฑฐ๊ธฐ์์ ๋งํ๋ ๊ฒ์ ํ๋ ์๊ฐ ๋ชจ๋ ๊ฒ์ด ์ด๋ป๊ฒ ๋ฌด๋์ง๋์ง ์ง์ผ๋ณด์ญ์์ค. ๊ทธ๋ฌ๋ ๋๋ ์์ฐํ์ง ์๊ณ ๋ง ๊ทธ๋๋ก DOM ํธ๋ฆฌ์ ์๋ฌด ๊ณณ์๋ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐฐ์นํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ๊ฒ์ด ์ ๋๋ก ์๋ํฉ๋๋ค. ๋๋ ์ด๊ฒ์ ์ฌ๋ณธ์ ์ฌ๋ฌ ๊ฐ ๊ฐ์ง ์ ์์ผ๋ฉฐ ์ฌ์ ํ ์๋ํฉ๋๋ค. async
... await
๋ผ์ดํ์ฌ์ดํด ๋๋ถ์
๋๋ค.
<template> <a-component @rendered="showBandC = true" /> <b-component v-if="showBandC" /> <c-component v-if="showBandC" /> </template>
์ด ๊ฒฝ์ฐ B์ C๊ฐ ๋ ๋๋ง๋๊ธฐ ์ ์ ์ค์ ๋ก ๋ ๋๋งํด์ผ ํ๋ A์ ๋ํ ๊ฒ์ ๋ฌด์์ ๋๊น?
์ฐ๋ฆฌ๋ ๊ฐ ๊ตฌ์ฑ ์์๊ฐ ๋ง์ดํธ๋๊ธฐ ์ ์ ๊ณ ์ ํ ์์
์ ์ํํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ๊ตฌ์ฑ ์์๋ ๋ค๋ฅธ ๋ชจ๋ ๊ตฌ์ฑ ์์๊ฐ ํด๋น ์์
์ ์๋ฃํ ๊ฒฝ์ฐ์๋ง ๋ ๋๋ง๋ฉ๋๋ค. ๊ทธ๊ฒ์ด ์ฌ๊ธฐ์ ์ด์ผ๊ธฐ์
๋๋ค.
๋ฐ๋ผ์ vuex ์ ์ฅ์ ์์ ์์ฑํ ์ค์ ๋ฐ์ดํฐ๋ ๋งํ ๊ฒ๋ ์๊ณ ์ํ ๊ด๋ฆฌ์ v-if
ํ์ด์ ๋น๋๋ค. ๊ตฌ์ฑ ์์๊ฐ ์ฌ์ฉ๋๋ ๊ณณ๋ง๋ค ๋ง์ ์ค๋ณต ์ฝ๋๊ฐ ์์ฑ๋ฉ๋๋ค. A์ C๋ง ๋ค๋ฅธ ๊ตฌ์ฑ์ผ๋ก ํธ์คํ
ํ๋ ๋ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ํ๋ ค๋ฉด v-if
, vuex ์ํ ๊ด๋ฆฌ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ๋ฌธ์ ๊ฐ ๋ณด์ด๋์? ์ค๋ช
ํ๊ฒ ์ต๋๋ค:
// component Z totally different from foo, so we can't make this a component for reuse
<template>
<a-component @rendered="showBandC = true" />
<c-component v-if="showBandC" />
</template>
...
computed: {
showBandB() { ...vuex ...,
showBandC() { ...vuex ...,
}
// component Foo totally unique, probably has other things it does
<template>
<b-component v-if="showBandC" />
<c-component v-if="showBandC" />
</template>
...
computed: {
// ok you could mixin this, fair, but complex nevertheless
showBandB() { ...vuex ...,
showBandC() { ...vuex ...,
}
..... ๋ฑ๋ฑ
๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ชจ์์ ์๋ฌด ๊ฒ๋ํ์ง ์๊ณ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๋์ :
// component Z
<template>
<a-component />
<b-component />
</template>
// component Foo
<template>
<b-component />
<c-component />
</template>
... ๊ธฐํ ๋ฑ๋ฑ
created()
๋ฉ์๋์ ํญ๋ชฉ์ด ์๋ ๊ฒฝ์ฐ JavaScript ํด๋์ค๋ฅผ ํตํด ๋๋store
๋ชจ๋์ ์ฌ์ฉํ์ฌ ์คํ ์ด๋ฅผ ์ฑ์ฐ๋ ๊ฒ์ ๋ฐฉํดํ๋ ๊ฒ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ช ์์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๋ ๋์์ด ๋ฉ๋๋ค. ์ฆ, ์บก์ฒํ ์ ์๋ ์ฌ์ฉ์ ์คํ ๋ฆฌ์ UX๋ ๋ฌด์์ ๋๊น?
๋์ฒ์ ํฉ์ด์ ธ ์๋ ์ํ ๊ด๋ฆฌ์ ๋ํด ๋ด๊ฐ ๋งํ ๊ฒ์ ๊ธฐ์ตํ์ญ๋๊น? ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๊ตฌ์ฑ ์์๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ค๋ฅธ ๊ณณ์์ ๋ง์ ๊ฒ์ ๊ด๋ฆฌํ๊ฒ ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค. ์ด๋ ์ ๊ฐ ๋ฐฉ๊ธ ์ํํ ์์ ๋์ ๋งค์ฐ ๋ณต์กํฉ๋๋ค. ๊ฒ๋ค๊ฐ, ๋ด๊ฐ ์ํ๋ ๋๋ก ๋์ง ์์ต๋๋ค. ๊ฐ ๊ตฌ์ฑ ์์๊ฐ ๋งค์ฐ ์ ์ ๋ณต์ก์ฑ์ผ๋ก ์ํํด์ผ ํ๋ ์์ ์ ์๋ฃํ ๊ฒฝ์ฐ์๋ง ๋ง์ดํธํฉ๋๋ค.
์์ด๋์ด๋ Vue๊ฐ ๋ค์ ํํฌ ๊ธฐ๋ฅ์ผ๋ก ์ด๋ํ๊ธฐ ์ ์ ๋ด๋ถ์ ์ผ๋ก ๋น๋๊ธฐ๋ฅผ ์กด์คํ๋ ๊ฒ์ ๋๋ค.
๋ฌผ๋ก ๊ทธ ๋ถ๋ถ์ ์ดํด๊ฐ ๋์ง๋ง ์์ ๊ฐ ๋ณต์กํด์ผ ํ๋ ์ด์ ๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์คํ ๋ฆฌ๋ฅผ ๋งํด๋ณด์ธ์.
๋ด ๊ตฌ์ฑ ์์์๋
async beforeMount
๋ฐasync mounted
๊ฐ ๋ชจ๋ ์์ง๋งbeforeMount
์ ์ฝ๋๊ฐ ์๋ฃ๋๊ธฐ ์ ์mounted
์ ์ฝ๋๊ฐ ์คํ๋ฉ๋๋ค.beforeMount
๊ฐ ์๋ฃ๋๊ธฐ ์ ์mounted
๋๋ ๊ฒ์ ์ด๋ป๊ฒ ์ฐจ๋จํ ์ ์์ต๋๊น?
์์ ์ ์ด๋ฌํ ๊ตฌ์ฑ ์์๊ฐ ๊ตฌ์ฑ ์์ ์ธ๋ถ์ ๋๋ฌด ๋ง์ ์ ๋ ฅ ์์ด ๋ ๋๋ง๋๊ณ ์ฌ์ฉ๋๊ธฐ ์ ์ ์ผ์ด ์ผ์ด๋๊ธฐ๋ฅผ ์ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค๊ณ ์๋ ์ฑ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๋ฉด ๋ ์ํ ์ ์์์ ๊ฒ์ด๋ผ๋ ์ฌ์ค์ ๊นจ๋ฌ์์ต๋๋ค. ๋๋ ๋ง์ mixin, vuex ๋ฐ ๋ชจ๋ ๊ณณ์์ (mixin ์ฌ์ฉ) ๊ฐํ๊ฒ ๊ฒฐํฉ ๋ ๋ถ๋ชจ๊ฐ์๋ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ๊ตฌ์ฑ ์์๊ฐ ๋๋ฝ๋์ด ์ฌ์ฉ๋์์ต๋๋ค. ์ด๊ฒ์ ๋ณต์กํ ์ด์ผ๊ธฐ๊ฐ ์๋๋ผ ์ค์ ๋ก ์ผ์ด๋ ์ผ์ ๊ฐ๋จํ๊ฒ ๋ง์๋๋ฆฌ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ UI๊ฐ ์ด๋ป๊ฒ ์ค๊ณ๋๊ณ ์ ์ง๋์ด์ผ ํ๋์ง ๋ค์ ์๊ฐํด์ผ ํ์ต๋๋ค. ์๊ฐ์ ์ผ๋ก ๋ ํฅ๋ฏธ๋กญ๊ณ ์ฝ๋์ ์ผ๋ก ํจ์ฌ ๋ณต์กํด์ก์ต๋๋ค.
์ด ๊ฐ๋จํ ์ค์ ์ ๋์ ํ ๋ณต์กํ ์ฌํญ์ด ์๋ช ์ฃผ๊ธฐ์ async ... await ๊ธฐ๋ฅ์ผ๋ก ํด๊ฒฐ๋ ๊ฒ์ด ์ผ๋ง๋ ๋ง์์ง ์ ์ ์์ต๋๊น?
@wparad
์ฆ, ์์ฑ์ด ์๋ฃ๋์ง ์์ ๊ตฌ์ฑ ์์๋ฅผ ๋ง์ดํธ ํด์ ํ๋ ค๊ณ ์๋ํ๋ฉด ์ด๋ป๊ฒ ๋๋์ง, ์์ฐ, ์ฌ์ ํ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ์ข์ง ์์ต๋๋ค. ๋๋ ๋ง์ดํธ๊ฐ ์๋ฃ๋์ง ์์ ๊ฒ์ ํ๊ดดํ๋ ๊ฒ, ๋๋ ๊ทธ ๊ธฐ๋ฅ์ ๊ตฌํ์๋ฅผ ๋ถ๋ฌ์ํ์ง ์์ต๋๋ค.
์ฌ๊ธฐ ์์น:
... ๋ฌ์ฑํ๋ ค๋ฉด ์ํคํ ์ฒ์ ๋ํ ๊ทผ๋ณธ์ ์ธ ์ฌ๊ฒํ /์ฌ์์ฑ์ด ํ์ํ๋ฉฐ ์๋ช ์ฃผ๊ธฐ ํํฌ์ ๋๊ธฐ์ ํน์ฑ์ ์์กดํ๋ ๋ง์ ๋ ผ๋ฆฌ๋ฅผ ์ ์ฌ์ ์ผ๋ก ๊นจ๋จ๋ฆด ์ ์์ต๋๋ค...
... ๋น์ ์ด ์ธ๊ธํ ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ ๋ฐฉ๋ฒ์ด ํ์ํ๋ฉฐ ์๋ง๋ ์ด๊ฒ์ด ๋์ ํ๋ ๊ฒ ์ด์์ผ ๊ฒ์ ๋๋ค. ์ฆ, ์ฐ๋ฆฌ์ ์๋๋ ์ฑ ์ถฉ๋ ์์ด ์๋ํด์ผ ํฉ๋๋ค.
์ด๋ฌํ ๋ชจ๋ ๊ฒฝ์ฐ์ ์คํจํ ์ ์๋ ๋๋ถ๋ถ์ ๋น๋๊ธฐ ์์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์๊ฐ ์ด๊ณผ๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ธฐ๋ฅผ ํ์ธํ๊ฑฐ๋ ์ค๋จํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ ๊ฐ ์ฃผ์ ๊น๊ฒ ์ ์ํ ์๋ฅผ ๋ณด๋ฉด ๋ฌด์จ ๋ง์ธ์ง ์ ์ ์์ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์ด๋์์๋ ๋ง์ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ๋ง์ ๊ฒ์ ํด๊ฒฐํ ์ ์์์ต๋๋ค. ์ฌ์ค ์ด๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ฉด ์ฐ๋ฆฌ ์ฑ์ ํจ์ฌ ์๊ณ ์กฐ๊ฐ ๋ชจ์๋๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฒ ์ด์ค๋ก ํจ์ฌ ๋ ๋์์ ๊ฒ์
๋๋ค.
์ด๋ฌํ ์ข
๋ฅ์ ๊ธฐ๋ฅ์ ๋ํ ์ ์ ์ฅ์ ๋ฌผ์ ๋ถ๋ชํ ํ์๋ง ๊ทธ ์ค์์ฑ์ ๋ณผ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ฐฉ๊ธ ์ ๊ฐ ์ ๊ณตํ ๋ฐ๋ก ์ด ์์ ์ ๋ํด ๋ง์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๊ฐํ์ ๋ ์ด ํ์ด์ง๋ฅผ ์ฒ์ ๋ฐฉ๋ฌธํ์ต๋๋ค. ๋๋ ๋์์ ๊ตฌํ๋ฌ ์จ ๊ฒ์ด ์๋๋ผ Vue์์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ฅ ์์ฒญ์ ์ ์ถํ๊ธฐ ์ํด์์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ๋ด๊ฐ ๊ธฐ๋ค๋ฆฌ๊ณ ์ถ์ ์ค์ ์ฝ๋์ ๋๋ค.
UserPage
๊ตฌ์ฑ ์์์ ์ผ๋ถ๊ฐ ๋ฉ๋๋ค.