๊ธฐ๋๊ธด(?) ๋ฐฉํ์ด ๋๋๊ณ ์๋ก์ด 2์ฐจ ํ์ด ๊ฒฐ์ฑ๋์๋ค. ์ธํฌ ๋ฉํ ๋ ํ์ผ๋ก ๋ฐฐ์ ๋ฐ์๊ณ ์๋ก์ด 4๋ช
์ ํ์๋ค๊ณผ ํจ๊ป Vue ํ๋ ์์ํฌ ๊ฐ์๋ถํฐ ํ์ฐจ๊ฒ ์ถ๋ฐํ๋ค.
๋๊ตฌ, ๋์ ๋ฑ ์ง๋ฐฉ์ ๊ฑฐ์ฃผ ์ค์ธ ํ์๋ถ์ด 3๋ช
์ด๋ ์์๋ค. ์คํฌ๋ผ ์ค ๊ฐ๊ฐํ ๋์ค๋ ์ฌํฌ๋ฆฌ ์ต์์ด ์ ๊ฒจ์ ๋ค. ๋ค๋ค ์ด์ ์ด ๋์น๋ ๊ฑฐ ๊ฐ์ ์ด๋ฒ ํ๋ ๋๋์ด ์ข๋ค!!
Vue ํ๋ ์์ํฌ๋ ๋ ๊ฐ์ง ํฐ ํน์ฑ์ ๊ฐ์ง๊ณ ์๋ค.
์ ์ธ์ ๋ ๋๋ง
Vue๋ ํ์ค HTML์ ํ ํ๋ฆฟ ๋ฌธ๋ฒ์ผ๋ก ํ์ฅํด์ ์ํ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด์ ์ถ๋ ฅ๋ HTML์ ์ ์ธ์ ์ผ๋ก ์์ฑํ๋ค.
๋ฐ์์ฑ
Vue๋ script ํ๊ทธ๋ฅผ ํตํด ์ํ ๋ณ๊ฒฝ์ ์ถ์ ํด์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด DOM์ ์ฆ์ ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ฅผ ํ๋ค.
Vue์ ๋ํ์ ์ธ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ์์๋ค.
{{}}
๋ฅผ ์ฌ์ฉํ๋ค.v-bind:
๋๋ ํฐ๋ธ๋ฅผ ํตํด ์ฐ๊ฒฐํ๋ค.React๋ฅผ ์ ๋ฌธํ ๋๋ ๋ผ์ดํ์ฌ์ดํด์ด๋ผ๋ ๊ฐ๋ ์ ๋ฐฐ์ ์๋๋ฐ Vue์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ผ์ดํ์ฌ์ดํด์ด ์กด์ฌํ๋ค.
๋ผ์ดํ์ฌ์ดํด์ ํํ๋ React์ ๋งค์ฐ ํก์ฌํ๋ค.
Vue์ ๋ผ์ดํ์ฌ์ดํด ํ ์ ๋๋ต์ ์ผ๋ก ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- beforeCreate
์ต์ API๋ฅผ ํตํด Data๊ฐ ์์ฑ(create)๋๊ธฐ ์ ์ ์คํ๋๋ ํ ์ด๋ค. ๋ฐ์ดํฐ๊ฐ ์์ฑ๋์ง ์์ผ๋ฉด ํ ์ ์๋ ํ๋์ด ๊ทนํ ์ ํ์ ์ด๋ฏ๋ก ์ฌ์ฉ๋๋ ์ผ์ด ๋๋ฌผ๋ค.- created
Data๊ฐ ์์ฑ๋๊ณ Vue ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ฑ๋์ด ํ ํ๋ฆฟ์ ํ์ธํ๊ธฐ ์ ์ ์คํ๋๋ ํ ์ด๋ค.
์ค์ Data๊ฐ ์์ฑ๋์ด ์์ผ๋ฏ๋ก ์ ๊ทผ ๋ฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์์ฃผ ์ฌ์ฉ๋๋ ํจ์์ด๋ค.
๋จ, HTML๊ณผ ์ฐ๊ฒฐ์ ๋์ด์์ง ์์ผ๋ฏ๋ก HMTL์ ๋ค๋ฃจ๋ ์ฝ๋๋ ์ฌ๊ธฐ์์ ์คํ์ด ๋ถ๊ฐ๋ฅํ๋ค.- beforeMount
DOM ๋ ธ๋์ ์์ฑ๋์ด ๋ง์ดํธ ๋๊ธฐ ์ด์ ์ ์๋ช ์ฃผ๊ธฐ ํ ์ด๋ค.
์ด ๊ฒฝ์ฐ๋ HTML๊ณผ ์ฐ๊ฒฐ๋์ด ์์ง ์์ ์ํ์ด๋ฏ๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ๋ค.- mounted
Data๊ฐ HTML์ ์ฐ๊ฒฐ๋ ์งํ์ ์๋ช ์ฃผ๊ธฐ ์์ ์ ๋ค๋ฃจ๋ ํ ์ด๋ค. created์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๊ณ ์ค์ ๋ก DOM์ ์ ๊ทผํ ์๋ ์๋ค.
์ฌ๊ธฐ๊น์ง๋ ๊ธฐ๋ณธ์ ์ผ๋ก HTML๊ณผ Vue ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ง์ดํธ๋๊ธฐ๊น์ง์ ์๋ช ์ฃผ๊ธฐ์ ๊ด๋ จ๋ ํ ์ด๋ค.
๋ง์ดํธ๊ฐ ๋์ด ์๋ ์ํ์์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ค๋ฃจ๋ ์ ๋ฐ์ดํธ์ ๊ดํ ์๋ช ์ฃผ๊ธฐ ํ ๋ ์กด์ฌํ๋ค.
- beforeUpdate
๋ง ๊ทธ๋๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์ด ๋ฆฌ๋ ๋๋ง ๋ฐ ํจ์น๊ฐ ๋๊ธฐ ์ด์ ์ ์ํ๋ฅผ ๋ค๋ฃฌ๋ค.- 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์์๋ 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
์์์ ์ปดํฌ๋ํธ ๋ด ์ธ์คํด์ค๋ฅผ ํญ์ ์ฐธ์กฐํ ์ ์๊ฒ ํด์ผ ํ๋ค. ๋ฐ๋ผ์ ๋ฉ์๋๊ฐ ํ์ดํ ํจ์๋ก ์ ์ํ๊ฒ ๋๋ฉด this๊ฐ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํค๊ฒ ๋๋ฏ๋ก ์ฌ๋ฐ๋ฅธ this ๊ฐ์ ๋ฐ์ธ๋ฉํ์ง ๋ชปํ๋ค.
๋ฐ๋ผ์ methods๋ฅผ ์ ์ํ ๋๋ ํ์ดํ ํจ์๊ฐ ์๋ ํจ์์ ์ธ์์ผ๋ก ์ ์ํด์ผ ํ๋ค.
const app = Vue.createApp({
data() {
return { count: 0 } // this๊ฐ ์ด count๋ฅผ ๊ฐ๋ฅดํค๊ธฐ ์ํด์๋ ๋ฉ์๋๋ฅผ ํจ์์ ์ธ์์ ์ฌ์ฉํด์ผ ํ๋ค.
},
methods: {
increment() {
// ํ์ดํ ํจ์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ
this.count++
}
}
})
Vue ํ๋ ์์ํฌ๋ ์ง์ง ์ฒ์ ์ ํด๋ดค๋๋ฐ๋ ์ด์ ์ React์ ๋ํ ๋ผ์ดํ์ฌ์ดํด์ด๋ผ๋์ง ๋ฐ๋๋ผ JS์์ ์ปดํฌ๋ํธ ๋ฐ ๋ฉ์๋ ๊ตฌํ์ ๋ํ ๋ด์ฉ์ ์ ์์งํด๋์ ๊ทธ๋ฐ์ง ์๊ฐ๋ณด๋ค ์ด๋ ต์ง ์์๋ค.
๋ญ๋ ๋ค ์ฐ๊ฒฐ๋๋ ๊ฒ์ด๋ Vue๋ ๊ธฐ์ด๋ฅผ ์ ๋ค์ ธ๋์ผ๋ฉด ์ดํ React๋ฅผ ๊ณต๋ถํ๋๋ฐ์๋ ๋ถ๋ช
ํ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค.
์๊ฐ๋ณด๋ค ๋ผ์ดํ์ฌ์ดํด ํ ์ ๋ํ ์ดํด๊ฐ ์์ง ์๋ฒฝํ๊ฒ ๋์ง ์์๋ค. ๋ํ Proxy์ ๋ํ ๊ฐ๋ ๋ Vue ๋ฐ์ดํฐ ํํ์ ๋ํ ๊ฐ์ฌ๋์ ๋ถ์ฐ ์ค๋ช ์ผ๋ก ์๊ฒ ๋์๋๋ฐ ์์ํ ๊ฐ๋ ์ด๋ผ ์ถ๊ฐ์ ์ธ ์ ๋ฆฌ๊ฐ ํ์ํ ๊ฒ ๊ฐ๋ค.
2์ฐจ ํ์๋ค๊ณผ ์ข ๋ ๋ง์ ๋ํ์ ๊ณต๋ถํ ๋ ์ง๋ฌธ์ฌํญ์ ๊ณต์ ํ๋ฉด์ 1์ฐจ ํ์ฃผํ์๋ค์ฒ๋ผ ์ผ๋ฅธ ๋ ๋ง์ ๊ณต๋ถ ๋ฉ์ดํธ๋ค์ ๋ง๋ค์ด์ผ ๊ฒ ๋ค.
๐ ํด๋น ๋ด์ฉ์ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ํ๋ฆฐ ๋ถ๋ถ์ด๋ ์คํดํ๊ณ ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ํผ๋๋ฐฑ ๋ถํ๋๋ฆฝ๋๋ค.