ํ”„๋ก ํŠธ์—”๋“œ/JavaScript

[JavaScript] ํ”„๋ก์‹œ(Proxy) ๊ฐ์ฒด

1eehyunji 2023. 8. 3. 17:21

ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์–ด๋–ค ๋Œ€์ƒ์˜ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘(์†์„ฑ ์ ‘๊ทผ, ํ• ๋‹น, ์ˆœํšŒ, ์—ด๊ฑฐ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋“ฑ)์˜ ์ž‘์—…์„ ๊ฐ€๋กœ์ฑ„์„œ ํŠน๋ณ„ํ•œ ๋‹ค๋ฅธ ๋™์ž‘(ํŠธ๋žฉ)์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋œปํ•œ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„๋‹ค.

  • target : ํ”„๋ก์‹œํ•  ๋Œ€์ƒ
  • handler : target์˜ ๋™์ž‘์„ ๊ฐ€๋กœ์ฑ„๊ณ  ์–ด๋– ํ•œ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •๋˜์–ด ์žˆ๋Š” ํ•จ์ˆ˜

ํ”„๋ก์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜ํ•œ๋‹ค.

const proxy = new Proxy(target, handler)

 

๋จผ์ € ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์—†๋Š” ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์€ ํ”„๋ก์‹œ๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

const target= {};
const proxy = new Proxy(target, {}) //ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์—†๋Š” proxy ๊ฐ์ฒด ์ •์˜

proxy.test = 5; // 1. proxy์— ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ 'test' ์ถ”๊ฐ€
console.log(proxy.test) // 2. proxy์˜ test ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. ๋‹น์—ฐํžˆ 5๊ฐ€ ์ถœ๋ ฅ
console.log(target.test) // 3. ์›๋ž˜ ๊ฐ์ฒด์ธ target์˜ test ํ”„๋กœํผํ‹ฐ์—๋„ 5๊ฐ€ ์ €์žฅ๋œ๋‹ค

๋งŒ์•ฝ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์„ ์–ธ๋˜์ง€ ์•Š์€ ํ”„๋ก์‹œ๋ผ๋ฉด, target ๊ฐ์ฒด๋ฅผ ๊ฐ์‹ธ๋Š” ํˆฌ๋ช…ํ•œ ๋ž˜ํผ(wrapper)๊ฐ€ ๋œ๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ ์–ด๋–ค ๋™์ž‘์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ž‘์—…์„ ๊ฐ€๋กœ์ฑ„์„œ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ ๋Œ€ํ‘œ์ ์œผ๋กœ ์•„๋ž˜์˜ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ get๊ณผ set์˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด์„œ ์ตํ˜€๋ณด์ž

get

const handler = {
	get: function(target, prop){
    	return prop=='name'? `${target.a} ${target.b}` : target[prop]
    }
}

const p = new Proxy({a:'KUNDOL', b:'IS AMUMU ZANGIN'}, handler);
console.log(p.name); //KUNDOL IS AMUMU ZANGIN

ํ”„๋ก์‹œ ๊ฐ์ฒด์˜ get ํ•จ์ˆ˜๋Š” ํƒ€๊ฒŸ์˜ ์–ด๋–ค ์†์„ฑ์„ ์ฝ์„ ๋•Œ ํŠธ๋žฉ์„ ๋ฐœ๋™ํ•œ๋‹ค. 

get ํ•จ์ˆ˜๋Š” ๋ณดํ†ต 2๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

  • target : new Proxy ์„ ์–ธ ์‹œ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ฃผ์—ˆ๋˜ target ๊ฐ์ฒด
  • prop : ์กฐํšŒํ•œ ์†์„ฑ์˜ ์ด๋ฆ„

target์œผ๋กœ a ์†์„ฑ๊ณผ b ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋„ฃ๊ณ , handler ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ์–ด์„œ p๋ผ๋Š” ๋ณ€์ˆ˜์— ์„ ์–ธํ–ˆ๋‹ค.

์ดํ›„ p์˜ name ์†์„ฑ์„ ์ฐธ์กฐํ•ด์„œ handler ํ•จ์ˆ˜์˜ get ์•ˆ์— ์„ ์–ธํ•œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์ด ๊ฒฝ์šฐ์— ์ฐธ์กฐํ•œ ์†์„ฑ์˜ ์ด๋ฆ„์ด 'name'์ผ ๊ฒฝ์šฐ a, b ์†์„ฑ ๊ฐ’์„ ํ•ฉ์ณ์„œ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์–ด ๋ฆฌํ„ดํ•˜๊ณ , ์•„๋‹ ๊ฒฝ์šฐ target์˜ ์ฐธ์กฐํ•œ ์†์„ฑ์„ ๋ฆฌํ„ดํ•˜๋Š” ๋กœ์ง์— ๋”ฐ๋ฅธ๋‹ค. 

์ด์™€ ๊ฐ™์ด ํŠน์ • ์†์„ฑ์— ์ ‘๊ทผํ•  ๋•Œ ๊ทธ ๋ถ€๋ถ„์„ ๊ฐ€๋กœ์ฑ„์„œ ์–ด๋–ค ๋กœ์ง์„ ๊ฐ•์ œ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Set

const target= {};
const proxy = new Proxy(target, {
	set(target, prop, value){
      console.log(target,prop, value)
    }
})

proxy.test = 5; // ์ถœ๋ ฅ: {} test 5

set ํ•จ์ˆ˜๋Š” ํƒ€๊ฒŸ์˜ ์–ด๋–ค ์†์„ฑ์— ๊ฐ’์„ ์“ธ ๋•Œ ํŠธ๋žฉ์„ ๋ฐœ์ƒํ•œ๋‹ค. 

set ํ•จ์ˆ˜์—์„œ ๋ณดํ†ต 3๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. 

  • target : new Proxy ์„ ์–ธ ์‹œ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ฃผ์—ˆ๋˜ target ๊ฐ์ฒด
  • prop : ์ž‘์„ฑํ•œ ์†์„ฑ์˜ ์ด๋ฆ„
  • value: ์ž‘์„ฑํ•œ ์†์„ฑ์˜ ๊ฐ’

์œ„ ์ฝ”๋“œ์—์„œ proxy ๊ฐ์ฒด์˜ 'test'๋ผ๋Š” ์†์„ฑ์— ์ ‘๊ทผํ•ด์„œ ํ•ธ๋“ค๋Ÿฌ์˜ set ํ•จ์ˆ˜๊ฐ€ ๋ฐœ๋™ํ–ˆ๊ณ , ๊ฐ๊ฐ ํƒ€์ผ“๊ณผ ์ ‘๊ทผํ•œ ์†์„ฑ ์ด๋ฆ„, ์†์„ฑ ๊ฐ’์„ ์ถœ๋ ฅํ–ˆ๋‹ค.

'ํ”„๋ก ํŠธ์—”๋“œ > JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JavaScript] Function vs Const  (1) 2023.12.04