Vue: ๋น„๋™๊ธฐ ๊ตฌ์„ฑ ์š”์†Œ ์ˆ˜๋ช… ์ฃผ๊ธฐ ํ›„ํฌ ๋Œ€๊ธฐ

์— ๋งŒ๋“  2017๋…„ 12์›” 08์ผ  ยท  51์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: vuejs/vue

์ด ๊ธฐ๋Šฅ์€ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ?

์‚ฌ์šฉ์ž๊ฐ€ ๋น„๋™๊ธฐ ์ž‘์—…์— ์˜์กดํ•˜๋Š” ์ˆ˜๋ช… ์ฃผ๊ธฐ ํ›„ํฌ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ vue๋Š” ๊ตฌํ˜„๋œ ํ›„ํฌ์˜ ๋น„๋™๊ธฐ ํŠน์„ฑ์„ ์กด์ค‘ํ•˜๊ณ  vue ๋žœ๋“œ์—์„œ ๋Œ€๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ API๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ?

API๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ›„ํฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๋ฟ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์‹ถ์€ ์‹ค์ œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

  beforeMount: async function() {
       this.user = await client.get({type: 'user', id: this.$route.params.id});
    }

UserPage ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ผ๋ถ€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  51 ๋Œ“๊ธ€

๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ์›ํ•˜๋Š”

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 ๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ Œ๋”๋ง์„ ์ง€์—ฐํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ถ€๋ชจ๋Š” ๋ฌด์—‡์„ํ•ฉ๋‹ˆ๊นŒ? ์ˆ˜ํ–‰:

  • ์ฐจ๋‹จ๋„
  • ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ DOM 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์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋Šฅ ์š”์ฒญ์„ ์ œ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ์˜€์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰