๐Ÿ” ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค FE ๋ฐ๋ธŒ์ฝ”์Šค 5๊ธฐ TIL = Vue | ๋ผ์ดํ”„์‚ฌ์ดํด | Vue ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ ์‚ฌํ•ญ

Jun 2k (Jun2)ยท2023๋…„ 11์›” 20์ผ
1

2023.11.21 ๊ฐ•์˜

๐Ÿ’ป Intro & TMI

๊ธฐ๋‚˜๊ธด(?) ๋ฐฉํ•™์ด ๋๋‚˜๊ณ  ์ƒˆ๋กœ์šด 2์ฐจ ํŒ€์ด ๊ฒฐ์„ฑ๋˜์—ˆ๋‹ค. ์„ธํฌ ๋ฉ˜ํ† ๋‹˜ ํŒ€์œผ๋กœ ๋ฐฐ์ •๋ฐ›์•˜๊ณ  ์ƒˆ๋กœ์šด 4๋ช…์˜ ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ Vue ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ•์˜๋ถ€ํ„ฐ ํž˜์ฐจ๊ฒŒ ์ถœ๋ฐœํ–ˆ๋‹ค.
๋Œ€๊ตฌ, ๋Œ€์ „ ๋“ฑ ์ง€๋ฐฉ์— ๊ฑฐ์ฃผ ์ค‘์ธ ํŒ€์›๋ถ„์ด 3๋ช…์ด๋‚˜ ์žˆ์—ˆ๋‹ค. ์Šคํฌ๋Ÿผ ์ค‘ ๊ฐ„๊ฐ„ํžˆ ๋‚˜์˜ค๋Š” ์‚ฌํˆฌ๋ฆฌ ์–ต์–‘์ด ์ •๊ฒจ์› ๋‹ค. ๋‹ค๋“ค ์—ด์ •์ด ๋„˜์น˜๋Š” ๊ฑฐ ๊ฐ™์•„ ์ด๋ฒˆ ํŒ€๋„ ๋А๋‚Œ์ด ์ข‹๋‹ค!!



๐Ÿง ์˜ค๋Š˜ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ๊ฒƒ

Vue ํ”„๋ ˆ์ž„์›Œํฌ ์‹œ์ž‘

Vue ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‘ ๊ฐ€์ง€ ํฐ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ์„ ์–ธ์  ๋ Œ๋”๋ง

    Vue๋Š” ํ‘œ์ค€ HTML์„ ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•์œผ๋กœ ํ™•์žฅํ•ด์„œ ์ƒํƒœ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅ๋  HTML์„ ์„ ์–ธ์ ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.

  • ๋ฐ˜์‘์„ฑ

    Vue๋Š” script ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•ด์„œ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋ฉด DOM์— ์ฆ‰์‹œ ํšจ์œจ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•œ๋‹ค.

Vue์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฌธ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์—ˆ๋‹ค.

  • HTML์— JS ๋‚ด content๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ๋Š” ์ด์ค‘์ค‘๊ด„ํ˜ธ{{}}๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • HTML ์†์„ฑ์— ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ํ•  ๋•Œ๋Š” v-bind: ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•œ๋‹ค.


Vue ๋ผ์ดํ”„์‚ฌ์ดํด

React๋ฅผ ์ž…๋ฌธํ•  ๋•Œ๋„ ๋ผ์ดํ”„์‚ฌ์ดํด์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋ฐฐ์› ์—ˆ๋Š”๋ฐ Vue์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ผ์ดํ”„์‚ฌ์ดํด์ด ์กด์žฌํ–ˆ๋‹ค.

๋ผ์ดํ”„์‚ฌ์ดํด์˜ ํ˜•ํƒœ๋Š” React์™€ ๋งค์šฐ ํก์‚ฌํ–ˆ๋‹ค.

Vue์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…์„ ๋Œ€๋žต์ ์œผ๋กœ ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. beforeCreate
    ์˜ต์…˜ API๋ฅผ ํ†ตํ•ด Data๊ฐ€ ์ƒ์„ฑ(create)๋˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š” ํ›…์ด๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์œผ๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ํ–‰๋™์ด ๊ทนํžˆ ์ œํ•œ์ ์ด๋ฏ€๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ผ์ด ๋“œ๋ฌผ๋‹ค.
  2. created
    Data๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  Vue ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ƒ์„ฑ๋˜์–ด ํ…œํ”Œ๋ฆฟ์„ ํ™•์ธํ•˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š” ํ›…์ด๋‹ค.
    ์‹ค์ œ Data๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ ‘๊ทผ ๋ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
    ๋‹จ, HTML๊ณผ ์—ฐ๊ฒฐ์€ ๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ HMTL์„ ๋‹ค๋ฃจ๋Š” ์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์„œ์— ์‹คํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  3. beforeMount
    DOM ๋…ธ๋“œ์— ์ƒ์„ฑ๋˜์–ด ๋งˆ์šดํŠธ ๋˜๊ธฐ ์ด์ „์˜ ์ƒ๋ช…์ฃผ๊ธฐ ํ›…์ด๋‹ค.
    ์ด ๊ฒฝ์šฐ๋„ HTML๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์ƒํƒœ์ด๋ฏ€๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋ฌผ๋‹ค.
  4. mounted
    Data๊ฐ€ HTML์— ์—ฐ๊ฒฐ๋œ ์งํ›„์˜ ์ƒ๋ช…์ฃผ๊ธฐ ์‹œ์ ์„ ๋‹ค๋ฃจ๋Š” ํ›…์ด๋‹ค. created์™€ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์‹ค์ œ๋กœ DOM์— ์ ‘๊ทผํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ HTML๊ณผ Vue ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋งˆ์šดํŠธ๋˜๊ธฐ๊นŒ์ง€์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๊ด€๋ จ๋œ ํ›…์ด๋‹ค.

๋งˆ์šดํŠธ๊ฐ€ ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ ์ด๋ฅผ ๋‹ค๋ฃจ๋Š” ์—…๋ฐ์ดํŠธ์— ๊ด€ํ•œ ์ƒ๋ช…์ฃผ๊ธฐ ํ›…๋„ ์กด์žฌํ•œ๋‹ค.

  1. beforeUpdate
    ๋ง ๊ทธ๋ž˜๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์ด ๋ฆฌ๋ Œ๋”๋ง ๋ฐ ํŒจ์น˜๊ฐ€ ๋˜๊ธฐ ์ด์ „์˜ ์ƒํƒœ๋ฅผ ๋‹ค๋ฃฌ๋‹ค.
  2. updated
    ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์šฉ๋˜๊ณ  ๋ฆฌ๋ Œ๋”๋ง๊นŒ์ง€ ์™„๋ฃŒ๋œ ์งํ›„์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋‹ค๋ฃฌ๋‹ค. ์‹ค์ œ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„ DOM์—๋„ ๋ฐ”๋€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์šฉ๋œ ์ƒํƒœ์ด๋ฏ€๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

๋‹จ๋ฒˆ์— ์ดํ•ดํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š์€ ๊ฐœ๋…์ธ ๊ฒƒ์€ ๋ถ„๋ช…ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ Vue๊ฐ€ ์–ด๋–ค ๊ณผ์ •์„ ๊ฑฐ์ณ Data๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Vue ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•˜์—ฌ Data๋ฅผ ์ ์šฉํ•˜๊ณ  DOM์— ๋งˆ์šดํŠธ์‹œํ‚ค๋Š”์ง€ ์ผ๋ จ์˜ ๊ณผ์ •์ธ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ์•„์˜ˆ ๋ชจ๋ฅด๊ณ ์„œ๋Š” Vue๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๋ชจ์ˆœ์ด๋‹ค.

Vue๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์‹œ์— ํŠน์ • ๋‹จ๊ณ„์— ๋‚ด๊ฐ€ ์˜๋„ํ•œ ๋กœ์ง์ด ์‹คํ–‰๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด ๋ผ์ดํ”„์‚ฌ์ดํด์— ๋Œ€ํ•œ ํŒŒ์•…์€ ๊ผญ ํ•ด์•ผํ•œ๋‹ค.



v-HTML ๋””๋ ‰ํ‹ฐ๋ธŒ๋กœ HTML๋ฅผ ๋‹ค๋ฃฐ ๋•Œ XSS ๊ณต๊ฒฉ ๊ฐ€๋Šฅ์„ฑ

ํ…์ŠคํŠธ ๋ณด๊ฐ„๋ฒ•์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ {{}} ์ด์ค‘ ์ค‘๊ด„ํ˜ธ๋ฅผ ํ†ตํ•ด HTML์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
HTML ์ฝ”๋“œ ์ž์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฝ์ž…ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด v-HTML ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ ์ง์ ‘์ ์œผ๋กœ rawHTML ์†์„ฑ ๊ฐ’์„ ๋‹ค๋ฃจ๊ฒŒ ๋˜๋ฉด XSS ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

XSS๋Š” ์•…์˜์ ์œผ๋กœ HTML์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด์„œ ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์Šคํ† ๋ฆฌ์ง€ ์ •๋ณด๋‚˜ ์ฟ ํ‚ค ๋“ฑ์„ ํ•ด์ปค ์‚ฌ์ดํŠธ๋กœ ๋นผ๋‚ด๋Š” ํ•ดํ‚น ๋ฐฉ๋ฒ•์˜ ์ผ์ข…์ด๋‹ค.
์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„œ๋ฒ„๋‹จ์—์„œ ๋‚ด๋ ค์ฃผ๋Š” ๊ฒ€์ฆ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ npm์˜ XSS ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด์„œ data๋ฅผ ๊ฐ์‹ธ์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์›์ดˆ์ ์ธ ๋ฐฉ์ง€๋ฒ•์€ ๋˜๋„๋ก์ด๋ฉด ์ง์ ‘์ ์œผ๋กœ HTML์— script ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.



Vue์—์„œ Data๊ฐ€ ๊ฐ์ฒด ๋ฐ˜ํ™˜๊ฐ’ ํ˜•ํƒœ์ธ ์ด์œ 

๊ธฐ๋ณธ์ ์œผ๋กœ Vue์—์„œ๋Š” App์„ ์ปดํฌ๋„ŒํŠธ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์„œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’ํžŒ๋‹ค. ์ด ๋•Œ Data๋Š” ํ•จ์ˆ˜ ๋ฐ˜ํ™˜๊ฐ’ ํ˜•ํƒœ๋กœ ์ œ๊ณต๋˜์–ด์•ผ ํ•œ๋‹ค.
๊ทธ ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ?

const App = {
	data() {
		return {
			dataName: 'data';
		}
	}
}

const vm = Vue.createApp(App).mount('#app')

Vue ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งˆ์šดํŠธํ•˜๋ฉด์„œ ๋ฐ˜ํ™˜๋œ vm์„ ์ฝ˜์†”์— ์ฐ์–ด๋ณด๋ฉด Proxy ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค. ๋˜ํ•œ ๋‚ด๋ถ€ $data ๊ฐ์ฒด๋„ Proxy ํ˜•ํƒœ์ด๋‹ค.

Proxy๋Š” MDN ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ž‘์—…์„ ๊ฐ€๋กœ์ฑ„์–ด ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์žฌ์ •์˜ ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
๋”ฐ๋ผ์„œ Vue์—์„œ ํ”„๋ก์‹œ๋Š” target์œผ๋กœ Data๋ฅผ ๋ฐ›์•„์„œ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์ธ ํ•ธ๋“ค๋Ÿฌ์—์„œ getter, setter ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— target์œผ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” Data๊ฐ€ ์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด ํ˜•ํƒœ๋ผ๋ฉด ์—ฌ๋Ÿฌ ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฃจ์–ด์งˆ ๋•Œ ์ฐธ์กฐ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฃจ์–ด์ง€๊ฒŒ ๋œ๋‹ค.
์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ํ”„๋ก์‹œA์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ํ”„๋ก์‹œB์˜ ๋ฐ์ดํ„ฐ๋„ ๋˜‘๊ฐ™์ด ๋ณ€๊ฒฝ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค.
๋”ฐ๋ผ์„œ Vue์—์„œ Data๋Š” ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ฃผ์–ด์•ผ getter๋‚˜ setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์บก์Аํ™”ํ•˜์—ฌ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.



Vue์˜ methods ์ •์˜ ์‹œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์ง€์–‘

Vue๋Š” methods ์•ˆ์—์„œ ์ปดํฌ๋„ŒํŠธ ๋‚ด ์ธ์Šคํ„ด์Šค๋ฅผ ํ•ญ์ƒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ”์„œ๋“œ๊ฐ€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ์ •์˜ํ•˜๊ฒŒ ๋˜๋ฉด this๊ฐ€ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ๋˜๋ฏ€๋กœ ์˜ฌ๋ฐ”๋ฅธ this ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ๋ชปํ•œ๋‹ค.
๋”ฐ๋ผ์„œ methods๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜์„ ์–ธ์‹์œผ๋กœ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

const app = Vue.createApp({
	data() {
		return { count: 0 } // this๊ฐ€ ์ด count๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ•จ์ˆ˜์„ ์–ธ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
	},
	methods: {
		increment() {
			// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ
			this.count++
		}
	}
})


๐Ÿ‘€ ๋А๋‚€์ 

๐Ÿ‘ Keep

Vue ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ง„์งœ ์ฒ˜์Œ ์ ‘ํ•ด๋ดค๋Š”๋ฐ๋„ ์ด์ „์— React์— ๋Œ€ํ•œ ๋ผ์ดํ”„์‚ฌ์ดํด์ด๋ผ๋˜์ง€ ๋ฐ”๋‹๋ผ JS์—์„œ ์ปดํฌ๋„ŒํŠธ ๋ฐ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ž˜ ์ˆ™์ง€ํ•ด๋†”์„œ ๊ทธ๋Ÿฐ์ง€ ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์•˜๋‹ค.
๋ญ๋“  ๋‹ค ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์ด๋‹ˆ Vue๋„ ๊ธฐ์ดˆ๋ฅผ ์ž˜ ๋‹ค์ ธ๋†“์œผ๋ฉด ์ดํ›„ React๋ฅผ ๊ณต๋ถ€ํ•˜๋Š”๋ฐ์—๋„ ๋ถ„๋ช…ํžˆ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

๐Ÿ˜ฑ Problem

์ƒ๊ฐ๋ณด๋‹ค ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์•„์ง ์™„๋ฒฝํ•˜๊ฒŒ ๋˜์ง€ ์•Š์•˜๋‹ค. ๋˜ํ•œ Proxy์— ๋Œ€ํ•œ ๊ฐœ๋…๋„ Vue ๋ฐ์ดํ„ฐ ํ˜•ํƒœ์— ๋Œ€ํ•œ ๊ฐ•์‚ฌ๋‹˜์˜ ๋ถ€์—ฐ ์„ค๋ช…์œผ๋กœ ์•Œ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ ์ƒ์†Œํ•œ ๊ฐœ๋…์ด๋ผ ์ถ”๊ฐ€์ ์ธ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

๐Ÿ˜œ Try

2์ฐจ ํŒ€์›๋“ค๊ณผ ์ข€ ๋” ๋งŽ์€ ๋Œ€ํ™”์™€ ๊ณต๋ถ€ํ•  ๋•Œ ์งˆ๋ฌธ์‚ฌํ•ญ์„ ๊ณต์œ ํ•˜๋ฉด์„œ 1์ฐจ ํ˜„์ฃผํŒ€์›๋“ค์ฒ˜๋Ÿผ ์–ผ๋ฅธ ๋” ๋งŽ์€ ๊ณต๋ถ€ ๋ฉ”์ดํŠธ๋“ค์„ ๋งŒ๋“ค์–ด์•ผ ๊ฒ ๋‹ค.



๐Ÿ˜… ํ•ด๋‹น ๋‚ด์šฉ์€ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด๋‚˜ ์˜คํ•ดํ•˜๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ค€๋น„์ค‘...

0๊ฐœ์˜ ๋Œ“๊ธ€