๐ก ๋ฐ์ํ๋ฐ์ดํฐ ํน์ง / Proxy / ๋ถ๋ณ์ฑ
๋ฐ์ํ๋ฐ์ดํฐ
๐ง ๋ฐ์ํ๋ฐ์ดํฐ ํน์ง
- ๋ฐ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ๋๋ ๋ฏธ๋ฆฌ data ์ต์
์ ์ ์ธํ์ง์์ผ๋ฉด ๋์ค์ ์ถ๊ฐ๋๋ ๋ฐ์ดํฐ๋ ๋ฐ์์ฑ์ ๊ฐ์ง์ง ์๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง๋ data๊ฐ ๊ฐ์ง ์ต์
์
vm.key
์ vm.$data.key
์ ์กด์ฌํ๋ค.
- ์๋๋
vm.$data.key
์ ๊ฐ์ด ์ ์ธ์ด ๋์ง๋ง this๋ฅผ ํตํด์ ์ ๊ทผ ํ ์ ์๋๋ก vm.key
๋ ํ ์ ์๊ฒ ๋ง๋ค์๋ค.
(๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋๋ค ์๋ก๊ฐ์ ์ฐ๊ฒฐ๋ก ์ํฅ์ ๋ฐ๋๋ค.)
<div id="app">
<h1>{{count}}</h1>
<h2>{{double}}</h2>
</div>
</body>
<script>
const App = {
data() {
return {
count: 0
}
}
}
const vm = Vue.createApp(App).mount('#app')
</script>
- ๋ฐ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ๋๋ ๋ฏธ๋ฆฌ data ์ต์ ์ ์ ์ธํ์ง์์ผ๋ฉด ๋์ค์ ์ถ๊ฐ๋๋ ๋ฐ์ดํฐ๋ ๋ฐ์์ฑ์ ๊ฐ์ง์ง ์๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง๋ data๊ฐ ๊ฐ์ง ์ต์
์
vm.key
์vm.$data.key
์ ์กด์ฌํ๋ค. - ์๋๋
vm.$data.key
์ ๊ฐ์ด ์ ์ธ์ด ๋์ง๋ง this๋ฅผ ํตํด์ ์ ๊ทผ ํ ์ ์๋๋กvm.key
๋ ํ ์ ์๊ฒ ๋ง๋ค์๋ค.
(๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋๋ค ์๋ก๊ฐ์ ์ฐ๊ฒฐ๋ก ์ํฅ์ ๋ฐ๋๋ค.)
<div id="app">
<h1>{{count}}</h1>
<h2>{{double}}</h2>
</div>
</body>
<script>
const App = {
data() {
return {
count: 0
}
}
}
const vm = Vue.createApp(App).mount('#app')
</script>
๋ง๋ค์ด์ง vm์ ๊ฒฝ์ฐ data์ต์ ์ ๋ฐ๋ count๋
vm.count์๋ ์กด์ฌํ๊ณ , vm.$data.count์๋ ์กด์ฌํ๋ค.
์ฆ,๋ฐ์ํ ๋ฐ์ดํฐ ํน์ง 2,3๋ฒ์ด ์ฑ๋ฆฝํ๋ค.
์ง์
$data.double
๊ณผ double์ ๊ฐ์ ๋ฐ๊พธ์ด๋<h2>
์ ์ ์ฅํ double์ด ์ ์ฉ๋์ง ์๋ ๊ฒ์ ๋ณด๋ฉด ๋ฐ์ํ ๋ฐ์ดํฐ ํน์ง 1๋ฒ์ด ์ฑ๋ฆฝํ๋ค.
์ฆ, ๋ฑ๋ก๋์ง์๋ ๊ฒ์vm.$data.double
๊ณผvm.double
๊ฐ์ ๊ฒฐํฉ์ด ์กด์ฌํ์ง๋ ์์์๋ผ๊ณ ์๊ฐ๋ ๋ ๋ค.
(์ค์ ๋กvm.double=100
์ ํ๊ณvm.$data.double
์ ๊ด์ฐฐํ๋ฉด ์กด์ฌํ์ง์๋๋ค. )
๋ถ๋ณ์ฑ
๐ง ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๊ฐ ์๋ ํจ์๋ก ๋ฐํํด์ผํ๋ ์ด์
๊ฐ๋จํ ์์
๊ฐ์ฅ ๊ฐ๋จํ ์์๋ฅผ ๋ค์ด๋ณด์
const obj1 = {
data : {
count : 0
}
}
const obj2 = {
data() {
return {
count : 0
}
}
}
function P(data){
this.change = ()=>{
data.count += 10;
}
this.ret = () => {
return data.count;
}
}
let A = new P(obj1.data)
let B = new P(obj1.data)
let C = new P(obj2.data())
let D = new P(obj2.data())
A.change()
console.log(A.ret()) //10
console.log(B.ret()) //10
// A์ ์ํฅ์ ๋ฐ์ B๊ฐ ๋ณ๊ฒฝ
C.change()
console.log(C.ret()) //10
console.log(D.ret()) //0
// C์ ์ํฅ์ ๋ฐ์ง์์ D๋ ๋ณ๊ฒฝX
- ๊ฒฐ๊ณผ๋ ์ด์ ๊ฐ๋ค.
์ฆ, ๊ฐ์ฒด๋ฅผ ํตํด ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ ๋์์ ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์ด์ ์ฐ๊ด๋ ๊ฐ ๋ํ ๋ณํ๊ฒ ๋๋ call by reference์ ์ํฅ์ ๋ฐ๋๋ค.
์ด๋ฅผ ์๋ก๊ฐ์ ์ฐ๊ด์ ์์ ๊ธฐ ์ํด์ ํด๋น return ๊ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์์ ๋ฃ์ผ๋ฉด ๊ฐ์ด ๋ณํด๋ ๋ค๋ฅธ ๊ฐ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ฒด๊ฐ ์๋ ๊ฐ์ผ๋ก ๋ฐ๋๋ค๋ฉด?
function P({count}){
this.change = ()=>{
count += 10;
}
this.ret = () => {
return count;
}
}
Pํจ์๊ฐ ์ด์๊ฐ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด ๊ฐ์ ๋ฐ์๊ฒ์ด๋ call by value๋ก
์๋ก๊ฐ์ ์ํฅ์์ด ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
๊ฐ์ฅ ๊ฐ๋จํ ์์๋ฅผ ๋ค์ด๋ณด์
const obj1 = {
data : {
count : 0
}
}
const obj2 = {
data() {
return {
count : 0
}
}
}
function P(data){
this.change = ()=>{
data.count += 10;
}
this.ret = () => {
return data.count;
}
}
let A = new P(obj1.data)
let B = new P(obj1.data)
let C = new P(obj2.data())
let D = new P(obj2.data())
A.change()
console.log(A.ret()) //10
console.log(B.ret()) //10
// A์ ์ํฅ์ ๋ฐ์ B๊ฐ ๋ณ๊ฒฝ
C.change()
console.log(C.ret()) //10
console.log(D.ret()) //0
// C์ ์ํฅ์ ๋ฐ์ง์์ D๋ ๋ณ๊ฒฝX
์ฆ, ๊ฐ์ฒด๋ฅผ ํตํด ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ ๋์์ ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์ด์ ์ฐ๊ด๋ ๊ฐ ๋ํ ๋ณํ๊ฒ ๋๋ call by reference์ ์ํฅ์ ๋ฐ๋๋ค.
์ด๋ฅผ ์๋ก๊ฐ์ ์ฐ๊ด์ ์์ ๊ธฐ ์ํด์ ํด๋น return ๊ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์์ ๋ฃ์ผ๋ฉด ๊ฐ์ด ๋ณํด๋ ๋ค๋ฅธ ๊ฐ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
function P({count}){
this.change = ()=>{
count += 10;
}
this.ret = () => {
return count;
}
}
Pํจ์๊ฐ ์ด์๊ฐ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด ๊ฐ์ ๋ฐ์๊ฒ์ด๋ call by value๋ก
์๋ก๊ฐ์ ์ํฅ์์ด ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
110
100
110
100
this.count๋ฅผ ์ฌ์ฉํ๋ค๋ฉด?
function P(data){
this.count = data.count;
this.change = ()=>{
this.count += 10;
}
this.ret = () => {
return this.count;
}
}
Pํจ์๊ฐ ์ด์๊ฐ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด data.count๋ผ๋ value๊ฐ์ ์ฌ์ฉํ๋ฏ๋ก ์๋ก๊ฐ์ ์ํฅ์์ด ์์ ๊ฐ๋ค.
๐ง new Proxy
๊ฐ์ฒด์ ๋ฆฌํดํ ํจ์ ์ฐจ์ด
const App1 = {
data : {
count: 0
}
}
const proxyA = new Proxy(App1.data,{
get(target, key){
return target[key]
},
set(target, key, value){
target[key] = value * 2
}
})
const proxyB = new Proxy(App1.data,{
get(target, key){
return target[key]
},
set(target, key, value){
target[key] = value * 2
}
})
const App2 = {
data() {
return {count : 0}
}
}
const proxyC = new Proxy(App2.data(),{
get(target, key){
return target[key]
},
set(target, key, value){
target[key] = value * 2
}
})
const proxyD = new Proxy(App2.data(),{
get(target, key){
return target[key]
},
set(target, key, value){
target[key] = value * 2
}
})
๊ฐ์ฒด๋ฅผ ์ง์ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์๋ proxyA,proxyB๋ ์๋ก ์ํฅ์ ๋ฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋์๊ณ
returnํ ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์๋ proxyC,proxyD๋ ์๋ก ์ํฅ์ ๋ฐ์ง์์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง์์๋ค.
๐ง Vue
const App = {
data() {
return {
counter: 0
}
}
}
const vm1 = Vue.createApp(App).mount('#app')
const vm2 = Vue.createApp(App).mount('#btn')
proxy์ ์ ์ฌํ Vue์์๋ ํด๋น App ์ปดํฌ๋ํธ๋ฅผ ์ฌํ์ฉํ๊ธฐ์ํด ์ฌ์ฌ์ฉํ ๋ ์๋ก๊ฐ์ ์ํฅ์ผ๋ก ์ค๋ฅ๊ฐ ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด์
์ด์๊ฐ์ด return์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ฐ์์ฃผ๋ ๊ฒ์ ์ ์ ์๋ค.
์ ๋ฆฌ
์ฐ๋ฆฌ๋ ์ด๋ ํ ๊ฐ์ ๋ฐ์ ๋ ๊ทธ ๊ฐ์ด ์์ํ์ธ์ง ์ฐธ์กฐํ์ธ์ง์ ๋ฐ๋ผ
ํด๋น ๊ฐ(์์ํ/์ฐธ์กฐํ)์ ๋ณ๊ฒฝํ์์ ๋
์ด๊ฒ์ ๋ค๋ฅธ ๊ณณ์์๋ ์ฌ์ฉํ ๊ณณ์์ ์ํฅ์ ๋ฐ๋๋ค๋ฉด ์ฐธ์กฐํ
๋ค๋ฅธ ๊ณณ์์ ์ํฅ์ ๋ฐ์ง ์๋๋ค๋ฉด ์์ํ์ผ๋ก ๋ณผ ์ ์๋ค.
์ด๋ ์ฐธ์กฐํ์ ์ฐ๊ธดํ๋ ์๋ก๊ฐ์ ์ํฅ์ ์ฃผ๊ณ ์ถ์ง ์๊ฒ ๋ง๋ค๋ ค๋ฉด
์ง์ ์ฐ๋๊ฒ์ด ์๋ ํจ์๋ฅผ ํตํด ๋ฆฌํดํ ์ํ์ ์ฐธ์กฐํ์ ๋ฐํํด์ ์ฌ์ฉํด์ผํ๋ค.
app.data (X) -> app.data()
์ฆ, vue์์๋ ์ฐธ์กฐํ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฌ์ฉ์ ์์ด์ ํด๋น ๊ฐ๋ค์ ๋
๋ฆฝ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ฆฌํดํ ์ํ์ ์ฐธ์กฐํ์ ๋ฐํ์ ์ด์ฉํ๋ค.
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ก ๋ฐ์ํ๋ฐ์ดํฐ ํน์ง / Proxy / ๋ถ๋ณ์ฑ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค
https://velog.io/@khw970421/Vue-๋ถ๋ณ์ฑ-๋ฐ์ํ๋ฐ์ดํฐ
์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์
๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ
์ธ ๋ฐ๊ฒฌ์ ์ ๋
(Collection and Share based on the CC Protocol.)
์ฐ๋ฆฌ๋ ์ด๋ ํ ๊ฐ์ ๋ฐ์ ๋ ๊ทธ ๊ฐ์ด ์์ํ์ธ์ง ์ฐธ์กฐํ์ธ์ง์ ๋ฐ๋ผ
ํด๋น ๊ฐ(์์ํ/์ฐธ์กฐํ)์ ๋ณ๊ฒฝํ์์ ๋
์ด๊ฒ์ ๋ค๋ฅธ ๊ณณ์์๋ ์ฌ์ฉํ ๊ณณ์์ ์ํฅ์ ๋ฐ๋๋ค๋ฉด ์ฐธ์กฐํ
๋ค๋ฅธ ๊ณณ์์ ์ํฅ์ ๋ฐ์ง ์๋๋ค๋ฉด ์์ํ์ผ๋ก ๋ณผ ์ ์๋ค.
์ด๋ ์ฐธ์กฐํ์ ์ฐ๊ธดํ๋ ์๋ก๊ฐ์ ์ํฅ์ ์ฃผ๊ณ ์ถ์ง ์๊ฒ ๋ง๋ค๋ ค๋ฉด
์ง์ ์ฐ๋๊ฒ์ด ์๋ ํจ์๋ฅผ ํตํด ๋ฆฌํดํ ์ํ์ ์ฐธ์กฐํ์ ๋ฐํํด์ ์ฌ์ฉํด์ผํ๋ค.
app.data (X) -> app.data()
์ฆ, vue์์๋ ์ฐธ์กฐํ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฌ์ฉ์ ์์ด์ ํด๋น ๊ฐ๋ค์ ๋ ๋ฆฝ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ฆฌํดํ ์ํ์ ์ฐธ์กฐํ์ ๋ฐํ์ ์ด์ฉํ๋ค.
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ก ๋ฐ์ํ๋ฐ์ดํฐ ํน์ง / Proxy / ๋ถ๋ณ์ฑ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@khw970421/Vue-๋ถ๋ณ์ฑ-๋ฐ์ํ๋ฐ์ดํฐ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค