[Javascript] Proxy

[์›๋ณธ ๋งํฌ]

Proxy๋Š” ์ผ์ข…์˜ ๊ฐ€๋กœ์ฑ„๊ธฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” JS ํ‘œ์ค€ ๊ฐ์ฒด๋‹ค.
์‚ฌ์ด๋“œ์ดํŽ™ํŠธ ๋ฒ”๋ฒ…์„ ์œ ๋„ํ•˜๋Š” Javascript๋‹ค์šด ๊ธฐ๋Šฅ์ด๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ํ™˜๊ฒฝ์—์„œ ์ž˜ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค.

๋จผ์ € ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ๋‹ค.

์‚ฌ์‹ค ์–ด๋–ค ํ˜•ํƒœ์˜ ๊ฐ์ฒด๋“  ์ƒ๊ด€์—†๋‹ค. ํ•จ์ˆ˜๋„ ๋˜๊ณ  ์ด๋Ÿฐ์ €๋Ÿฐ ๊ฐ’๋“ค ๋‹ค ๋œ๋‹ค.


์ด๊ฑธ Proxy๋ผ๋Š” ๊ฐ์ฒด๋กœ ๊ฐ์‹ธ์„œ ๋งŒ๋“ค๋ฉด ๊ทธ๋•Œ๋ถ€ํ„ฐ ํ”„๋ก์‹œ์˜ ๊ฐ€๋กœ์ฑ„๊ธฐ ๋ชจ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋œ๋‹ค.
Proxy ์ƒ์„ฑ์ž์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” ์›๋ณธ ๊ฐ์ฒด, ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” ๊ฐ€๋กœ์ฑ„๊ธฐ ๋™์ž‘์„ ์ •์˜ํ•˜๋Š” ๊ฐ์ฒด๋‹ค.

์—ฌ๊ธฐ์„œ get์€ ์›๋ณธ ๊ฐ์ฒด์—์„œ ํŠน์ • ํ•„๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค ํ• ๋•Œ ์–ด๋–ค ๋™์ž‘์„ ํ• ์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค. ์ด ๋™์ž‘ ์ •์˜๋ฅผ trap์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
์ €๊ธฐ์„œ๋Š” ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š” ํ•„๋“œ๊ฐ€ ์—†์„ ๋•Œ ๋ฌธ์ž์—ด๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ •๋„์˜ ์ œ์–ด๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ๊ฐ€๋กœ์ฑ„์„œ ๋ฌธ์ž์—ด์ด ๋ฐ˜ํ™˜๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

set์€ ๋ฐ˜๋Œ€๋กœ ํ•„๋“œ์— ๊ฐ’์„ ํ• ๋‹นํ• ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํŠธ๋ฆฌ๊ฑฐ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๋ฉด ์˜๋„ํ•œ๋Œ€๋กœ ๊ฐ’์ด ๋’ค์ง‘ํ˜€์„œ ๋“ค์–ด๊ฐ„๋‹ค.

์ง€์›๋˜๋Š” trap์€ get/set ์™ธ์—๋„ deleteProperty, ownKeys, has, getOwnPropertyDescriptor ์ •๋„๊ฐ€ ์žˆ๋‹ค.
deleteProperty๋Š” del๋กœ ํ•„๋“œ ์‚ญ์ œ๋ฅผ ์‹œ๋„ํ• ๋•Œ ํŠธ๋ฆฌ๊ฑฐ๋˜๊ณ , ownKeys๋Š” for(A in N) ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ ์ˆœํšŒ๋ฅผ ๊ฐ€๋กœ์ฑˆ๋‹ค.
has๋Š” ํ•„๋“œ ํ™•์ธ์šฉ A in B ์—ฐ์‚ฐ์ž ๋™์ž‘์„ ๊ฐ€๋กœ์ฑˆ๋‹ค.

์‚ฌ์‹ค ์‚ฌ์šฉ์„ ๊ทธ๋ฆฌ ๊ถŒํ• ๋งŒํ•œ ๊ธฐ๋Šฅ์€ ์•„๋‹ˆ์ง€๋งŒ, ์•„์ฃผ ๊ฐ€๋” ์œ ์šฉํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.



์ฐธ์กฐ
https://ko.javascript.info/proxy
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Proxy