๐Ÿš€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•: ์ฝ”๋“œ์˜ ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ๋˜๋Š” ๊ธธ ๐Ÿง™โ€โ™‚๏ธ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•: ์ฝ”๋“œ์˜ ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ๋˜๋Š” ๊ธธ ๐Ÿง™โ€โ™‚๏ธ

 

 

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์ฐพ์•„์™”์–ด. ๋ฐ”๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ๊ธฐ์ˆ ์— ๋Œ€ํ•ด ์–˜๊ธฐํ•ด๋ณผ ๊ฑฐ์•ผ. ๐Ÿ˜Ž

ํ˜น์‹œ "๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ"์ด๋ผ๋Š” ๋ง์„ ๋“ค์–ด๋ณธ ์  ์žˆ์–ด? ์—†์–ด๋„ ๊ฑฑ์ • ๋งˆ! ์ง€๊ธˆ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์„ค๋ช…ํ•ด์ค„ ํ…Œ๋‹ˆ๊นŒ. ์ด ๊ธฐ์ˆ ์„ ์•Œ๊ฒŒ ๋˜๋ฉด, ๋„Œ ๋งˆ์น˜ ์ฝ”๋“œ์˜ ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๋‚„ ๊ฑฐ์•ผ. ์ง„์งœ๋กœ! ๐ŸŽฉโœจ

๊ทธ๋Ÿผ ์ด์ œ๋ถ€ํ„ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ๊ณ„๋กœ ํ’๋ฉ~ ๋น ์ ธ๋ณด์ž๊ณ ! ๐ŸŠโ€โ™‚๏ธ

๐Ÿค” ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋ญ์•ผ?

์ž, ์ผ๋‹จ "๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ"์ด๋ผ๋Š” ๋ง๋ถ€ํ„ฐ ํ’€์–ด๋ณผ๊นŒ? ๐Ÿง

  • ๋ฉ”ํƒ€(Meta): "~์— ๋Œ€ํ•œ" ๋˜๋Š” "~์„ ๋„˜์–ด์„ "์ด๋ผ๋Š” ๋œป์ด์•ผ.
  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Programming): ๋ง ๊ทธ๋Œ€๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ๊ฑฐ์ง€.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ "ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ"์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์–ด. ๋ญ”๊ฐ€ ๋ณต์žกํ•ด ๋ณด์ด์ง€? ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ! ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด์ค„๊ฒŒ. ๐Ÿ˜‰

๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋งˆ์น˜ ์š”๋ฆฌ์‚ฌ๊ฐ€ ์š”๋ฆฌ๋ฅผ ํ•˜๋ฉด์„œ ๋™์‹œ์— ์ƒˆ๋กœ์šด ์š”๋ฆฌ ๋„๊ตฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด. ๐Ÿณ๐Ÿ”ง

๋ณดํ†ต ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ์ด ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค์ง€? ๊ทธ๋Ÿฐ๋ฐ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์—ฌ๊ธฐ์„œ ํ•œ ๋ฐœ ๋” ๋‚˜์•„๊ฐ€. ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฑฐ์•ผ. ์‹ ๊ธฐํ•˜์ง€ ์•Š์•„? ๐Ÿคฏ

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ? ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)๊ฐ™์€ ํ”Œ๋žซํผ์„ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด. ๋ณดํ†ต์€ ๊ฐ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฝ”๋”ฉํ•˜๊ฒ ์ง€? ๊ทผ๋ฐ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด, ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. ์ด๋Ÿฌ๋ฉด ํ”Œ๋žซํผ์ด ํ›จ์”ฌ ๋” ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ์„ฑ ์žˆ๊ฒŒ ๋˜๊ฒ ์ง€? ๐Ÿ‘จโ€๐Ÿ’ป

๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…๋„ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…๋„ ์ผ๋ฐ˜ ์ฝ”๋“œ ์ƒ์„ฑ๋œ ์ฝ”๋“œ ์ฝ”๋“œ ์ƒ์„ฑ

์ž, ์ด์ œ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋ญ”์ง€ ๋Œ€์ถฉ ๊ฐ์ด ์™”์ง€? ๊ทธ๋Ÿผ ์ด์ œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด ๋งˆ๋ฒ• ๊ฐ™์€ ๊ธฐ์ˆ ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž๊ณ ! ๐Ÿง™โ€โ™‚๏ธโœจ

๐Ÿ› ๏ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ ๋„๊ตฌ๋“ค

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ํŠน๋ณ„ํ•œ ๋„๊ตฌ๋“ค์ด ํ•„์š”ํ•ด. ์ด ๋„๊ตฌ๋“ค์€ ๋งˆ์น˜ ๋งˆ๋ฒ•์‚ฌ์˜ ์ง€ํŒก์ด ๊ฐ™์€ ๊ฑฐ์•ผ. ์ด๊ฑธ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๊ณ , ์‹ฌ์ง€์–ด ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ์ง€! ๐Ÿ˜ฎ

๊ทธ๋Ÿผ ์ด์ œ ๊ทธ ๋„๊ตฌ๋“ค์„ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณผ๊นŒ?

1. eval() ํ•จ์ˆ˜ ๐ŸŽญ

eval() ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜. ๋ง ๊ทธ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ํ‰๊ฐ€(evaluate)ํ•˜๋Š” ๊ฑฐ์ง€.

์ฃผ์˜! eval()์€ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์–ด. ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์‚ฌ์šฉ์„ ํ”ผํ•˜๋Š” ๊ฒŒ ์ข‹์•„.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


let x = 10;
let result = eval('x + 5');
console.log(result); // ์ถœ๋ ฅ: 15
  

์—ฌ๊ธฐ์„œ eval()์€ 'x + 5'๋ผ๋Š” ๋ฌธ์ž์—ด์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•ด. ์‹ ๊ธฐํ•˜์ง€? ๐ŸŽฉโœจ

2. new Function() ์ƒ์„ฑ์ž ๐Ÿ—๏ธ

new Function()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋Ÿฐํƒ€์ž„์— ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. ์ด๊ฒƒ๋„ ๋ฌธ์ž์—ด๋กœ ๋œ ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„์„œ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฑฐ์•ผ.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ:


let sum = new Function('a', 'b', 'return a + b');
console.log(sum(2, 3)); // ์ถœ๋ ฅ: 5
  

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด sum์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฑฐ์•ผ. coolํ•˜์ง€? ๐Ÿ˜Ž

3. Object.defineProperty() ๋ฉ”์„œ๋“œ ๐Ÿ 

์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์ƒˆ๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ด๋ฏธ ์žˆ๋Š” ์†์„ฑ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด. ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์ง€.

ํ•œ๋ฒˆ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


let obj = {};
Object.defineProperty(obj, 'name', {
  value: '์žฌ๋Šฅ๋„ท',
  writable: false,
  enumerable: true,
  configurable: true
});

console.log(obj.name); // ์ถœ๋ ฅ: ์žฌ๋Šฅ๋„ท
obj.name = '๋‹ค๋ฅธ ์ด๋ฆ„'; // ๋ณ€๊ฒฝ ์‹œ๋„
console.log(obj.name); // ์—ฌ์ „ํžˆ ์ถœ๋ ฅ: ์žฌ๋Šฅ๋„ท (writable: false ๋•Œ๋ฌธ)
  

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” obj๋ผ๋Š” ๊ฐ์ฒด์— name์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ์†์„ฑ์„ ์ถ”๊ฐ€ํ–ˆ์–ด. ๊ทธ๋ฆฌ๊ณ  ์ด ์†์„ฑ์€ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์„ค์ •ํ–ˆ์ง€. ๊ทธ๋ž˜์„œ ๋‚˜์ค‘์— ๋ณ€๊ฒฝ์„ ์‹œ๋„ํ•ด๋„ ์›๋ž˜ ๊ฐ’์ด ์œ ์ง€๋ผ. ๋งˆ์น˜ ๋งˆ๋ฒ•์˜ ๋ด‰์ธ์„ ๊ฑด ๊ฒƒ ๊ฐ™์ง€ ์•Š์•„? ๐Ÿ”’โœจ

4. Proxy ๊ฐ์ฒด ๐Ÿ•ต๏ธ

Proxy๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ž‘์—…(์†์„ฑ ์กฐํšŒ, ํ• ๋‹น, ์—ด๊ฑฐ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋“ฑ)์„ ๊ฐ€๋กœ์ฑ„๊ณ  ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜. ์ด๊ฑด ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์•ผ!

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋ณผ๊ฒŒ:


let target = {
  name: '์žฌ๋Šฅ๋„ท',
  type: 'ํ”Œ๋žซํผ'
};

let handler = {
  get: function(obj, prop) {
    return prop in obj ? obj[prop] : '๊ทธ๋Ÿฐ ์†์„ฑ์€ ์—†์–ด์š”!';
  }
};

let proxy = new Proxy(target, handler);

console.log(proxy.name); // ์ถœ๋ ฅ: ์žฌ๋Šฅ๋„ท
console.log(proxy.age); // ์ถœ๋ ฅ: ๊ทธ๋Ÿฐ ์†์„ฑ์€ ์—†์–ด์š”!
  

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” target ๊ฐ์ฒด์— ๋Œ€ํ•œ Proxy๋ฅผ ๋งŒ๋“ค์—ˆ์–ด. ์ด ํ”„๋ก์‹œ๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์ฝ์œผ๋ ค๊ณ  ํ•  ๋•Œ ๊ฐœ์ž…ํ•ด์„œ, ๋งŒ์•ฝ ๊ทธ ์†์„ฑ์ด ์—†๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ •์˜ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ด. ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด์˜ ๋™์ž‘์„ ์šฐ๋ฆฌ ๋งˆ์Œ๋Œ€๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์ง€. ์™„์ „ ์ฉ”์ง€ ์•Š์•„? ๐Ÿ˜†

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋„๊ตฌ๋“ค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋„๊ตฌ๋“ค eval() new Function() Object.defineProperty() Proxy

์ด ๋„๊ตฌ๋“ค์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๊ฒƒ๋“ค์ด์•ผ. ์ด๊ฑธ ์ด์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์Šค์Šค๋กœ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์ง€. ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์„ ๋งŒ๋“ค ๋•Œ๋„ ์ด๋Ÿฐ ๊ธฐ์ˆ ๋“ค์ด ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ผ ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ฑฐ๋‚˜, ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • ๋™์ž‘์„ ๊ฐ์‹œํ•˜๊ณ  ์ œ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€.

์ž, ์ด์ œ ๊ธฐ๋ณธ์ ์ธ ๋„๊ตฌ๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์œผ๋‹ˆ, ๋‹ค์Œ์œผ๋กœ ์ด ๋„๊ตฌ๋“ค์„ ์–ด๋–ป๊ฒŒ ์‹ค์ œ๋กœ ํ™œ์šฉํ•˜๋Š”์ง€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž๊ณ ! ๐Ÿš€

๐ŸŽญ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์‹ค์ „ ๊ธฐ๋ฒ•๋“ค

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋„๊ตฌ๋“ค์„ ๊ฐ€์ง€๊ณ  ์‹ค์ œ๋กœ ์–ด๋–ค ๋งˆ๋ฒ•์„ ๋ถ€๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณผ ์ฐจ๋ก€์•ผ. ์ค€๋น„๋์–ด? ๊ทธ๋Ÿผ ์ถœ๋ฐœ! ๐Ÿš€

1. ๋™์  ์†์„ฑ ์ ‘๊ทผ ๋ฐ ์กฐ์ž‘ ๐Ÿ”ฎ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ์— ๋™์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฑด ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ์ด ๋˜๋Š” ์•„์ฃผ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด์ง€.


let user = {
  name: '์ฒ ์ˆ˜',
  age: 25
};

// ์†์„ฑ ์ด๋ฆ„์„ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ
let prop = 'name';
console.log(user[prop]); // ์ถœ๋ ฅ: ์ฒ ์ˆ˜

// ๋™์ ์œผ๋กœ ์ƒˆ ์†์„ฑ ์ถ”๊ฐ€
user['likes' + 'Pizza'] = true;
console.log(user.likesPizza); // ์ถœ๋ ฅ: true

// ๊ฐ์ฒด์˜ ๋ชจ๋“  ์†์„ฑ์„ ์ˆœํšŒ
for (let key in user) {
  console.log(`${key}: ${user[key]}`);
}
  

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋ฅผ runtime์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด. ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„์„ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ๋•Œ ์ด๋Ÿฐ ๊ธฐ๋ฒ•์„ ์“ธ ์ˆ˜ ์žˆ๊ฒ ์ง€? ๐Ÿ˜‰

2. ํ•จ์ˆ˜์˜ ๋™์  ์ƒ์„ฑ ๋ฐ ์ˆ˜์ • ๐Ÿ—๏ธ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ•จ์ˆ˜๋„ ๊ฐ์ฒด์•ผ. ๊ทธ๋ž˜์„œ ํ•จ์ˆ˜๋ฅผ ๋™์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์ง€. ์ด๊ฑธ ์ด์šฉํ•˜๋ฉด ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ์–ด.


// ๋™์ ์œผ๋กœ ํ•จ์ˆ˜ ์ƒ์„ฑ
function createMultiplier(factor) {
  return function(number) {
    return number * factor;
  };
}

let double = createMultiplier(2);
console.log(double(5)); // ์ถœ๋ ฅ: 10

// ํ•จ์ˆ˜ ์ˆ˜์ •ํ•˜๊ธฐ
function greet(name) {
  console.log(`์•ˆ๋…•, ${name}!`);
}

// ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•ด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
function enhanceGreeting(originalGreeting) {
  return function(name) {
    originalGreeting(name);
    console.log("์˜ค๋Š˜๋„ ์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”!");
  };
}

greet = enhanceGreeting(greet);
greet("์˜ํฌ"); 
// ์ถœ๋ ฅ:
// ์•ˆ๋…•, ์˜ํฌ!
// ์˜ค๋Š˜๋„ ์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”!
  

์ด๋Ÿฐ ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ๋™์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด. ์žฌ๋Šฅ๋„ท์—์„œ ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ๋•Œ ์ด๋Ÿฐ ๊ธฐ๋ฒ•์„ ์“ธ ์ˆ˜ ์žˆ๊ฒ ์ง€? ์™„์ „ ์ฉ”์–ด! ๐Ÿ˜Ž

3. ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ด์šฉํ•œ ๊ฐ์ฒด ์ œ์–ด ๐ŸŽ›๏ธ

Object.defineProperty()๋‚˜ Object.defineProperties()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์•„์ฃผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฑธ ์ด์šฉํ•˜๋ฉด getter, setter๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ํ”„๋กœํผํ‹ฐ์˜ ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€.


let person = {};

Object.defineProperty(person, 'name', {
  value: '์ฒ ์ˆ˜',
  writable: false,
  enumerable: true,
  configurable: false
});

Object.defineProperty(person, 'age', {
  get: function() {
    return this._age;
  },
  set: function(value) {
    if (value > 0 && value < 120) {
      this._age = value;
    } else {
      console.log("๋‚˜์ด๋Š” 0์—์„œ 120 ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.");
    }
  },
  enumerable: true,
  configurable: true
});

person.name = '์˜ํฌ'; // ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ (writable: false)
console.log(person.name); // ์ถœ๋ ฅ: ์ฒ ์ˆ˜

person.age = 25;
console.log(person.age); // ์ถœ๋ ฅ: 25

person.age = 150; // ์ฝ˜์†”์— ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
  

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์•„์ฃผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด. ์žฌ๋Šฅ๋„ท์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์ด๋Ÿฐ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€? ๐Ÿ‘จโ€๐Ÿ’ผ

4. Proxy๋ฅผ ์ด์šฉํ•œ ๊ฐ์ฒด ๊ฐ€๋กœ์ฑ„๊ธฐ ๐Ÿ•ต๏ธโ€โ™€๏ธ

Proxy ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ž‘์—…์„ ๊ฐ€๋กœ์ฑ„๊ณ  ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฑด ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋„๊ตฌ์•ผ!


let user = {
  name: '์ฒ ์ˆ˜',
  age: 25
};

let handler = {
  get: function(target, property) {
    console.log(`${property} ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฝ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.`);
    return property in target ? target[property] : '๊ทธ๋Ÿฐ ์†์„ฑ์€ ์—†์–ด์š”!';
  },
  set: function(target, property, value) {
    if (property === 'age' && typeof value !== 'number') {
      throw new TypeError('๋‚˜์ด๋Š” ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.');
    }
    target[property] = value;
    return true;
  }
};

let proxyUser = new Proxy(user, handler);

console.log(proxyUser.name); 
// ์ถœ๋ ฅ: 
// name ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฝ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
// ์ฒ ์ˆ˜

proxyUser.age = '์Šค๋ฌผ๋‹ค์„ฏ'; // TypeError: ๋‚˜์ด๋Š” ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  

์ด๋ ‡๊ฒŒ Proxy๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด์˜ ๋™์ž‘์„ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด. ์žฌ๋Šฅ๋„ท์—์„œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜ ๋กœ๊น…์„ ํ•  ๋•Œ ์ด๋Ÿฐ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€? ์™„์ „ ๊ฐ•๋ ฅํ•ด! ๐Ÿ’ช

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค์ „ ๊ธฐ๋ฒ• ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค์ „ ๊ธฐ๋ฒ• ๋™์  ์†์„ฑ ์ ‘๊ทผ ๋ฐ ์กฐ์ž‘ ํ•จ์ˆ˜์˜ ๋™์  ์ƒ์„ฑ ๋ฐ ์ˆ˜์ • ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ Proxy๋ฅผ ์ด์šฉํ•œ ๊ฐ์ฒด ๊ฐ€๋กœ์ฑ„๊ธฐ

์ด๋Ÿฐ ์‹ค์ „ ๊ธฐ๋ฒ•๋“ค์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ์–ด. ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์ด๋Ÿฐ ๊ธฐ๋ฒ•๋“ค์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์ง€. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ฑฐ๋‚˜, ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐ ์ด๋Ÿฐ ๊ธฐ๋ฒ•๋“ค์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด.

ํ•˜์ง€๋งŒ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ๋„ ์žˆ์–ด. ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ฐ•๋ ฅํ•œ ๋งŒํผ ์œ„ํ—˜ํ•  ์ˆ˜๋„ ์žˆ๊ฑฐ๋“ . ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ณ , ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ๋‚˜ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์–ด. ๊ทธ๋ž˜์„œ ํ•ญ์ƒ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ด.

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์‹ค์ „ ๊ธฐ๋ฒ•๋“ค์„ ์•Œ์•„๋ดค์–ด. ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ• ์ง€๋Š” ๋„ˆ์˜ ์ƒ์ƒ๋ ฅ์— ๋‹ฌ๋ ธ์–ด! ์–ด๋–ค ๋ฉ‹์ง„ ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ค๋ฅด๋‹ˆ? ๐Ÿš€๐Ÿ’ก

๐ŸŽจ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์‹ค์ œ ์‘์šฉ ์‚ฌ๋ก€

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ์ด ๋ชจ๋“  ๋ฉ‹์ง„ ๊ธฐ์ˆ ๋“ค์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณผ ์ฐจ๋ก€์•ผ. ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ. ์ค€๋น„๋์–ด? ๊ทธ๋Ÿผ ๊ณ ๊ณ ! ๐Ÿš€

1. ๋™์  ํผ ์ƒ์„ฑ๊ธฐ ๐Ÿ“

์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ํ”„๋กœํ•„์„ ๋งŒ๋“ค ๋•Œ, ๋‹ค์–‘ํ•œ ํ•„๋“œ๊ฐ€ ํ•„์š”ํ•  ๊ฑฐ์•ผ. ๊ทผ๋ฐ ์ด ํ•„๋“œ๋“ค์ด ์‚ฌ์šฉ์ž๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค๋ฉด? ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•ด์„œ ๋™์ ์œผ๋กœ ํผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด!


function createFormField(type, name, label) {
  let field = document.createElement('div');
  field.innerHTML = `
    &  lt;label for="${name}">${label}: </label>
    <input type="${type}" id="${name}" name="${name}">
  `;
  return field;
}

function createForm(fields) {
  let form = document.createElement('form');
  fields.forEach(field => {
    form.appendChild(createFormField(field.type, field.name, field.label));
  });
  return form;
}

// ์‚ฌ์šฉ ์˜ˆ
let userFields = [
  {type: 'text', name: 'name', label: '์ด๋ฆ„'},
  {type: 'email', name: 'email', label: '์ด๋ฉ”์ผ'},
  {type: 'number', name: 'age', label: '๋‚˜์ด'}
];

document.body.appendChild(createForm(userFields));
  

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•„์š”์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ํผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด. ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์žฌ๋Šฅ์„ ๋“ฑ๋กํ•  ๋•Œ ์ด๋Ÿฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๊ฒ ์ง€? ๐Ÿ˜‰

2. API ๋ž˜ํผ ์ž๋™ ์ƒ์„ฑ๊ธฐ ๐Ÿ”„

์žฌ๋Šฅ๋„ท์ด ์™ธ๋ถ€ API๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๊ฐ API ํ˜ธ์ถœ๋งˆ๋‹ค ์ผ์ผ์ด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑด ๋„ˆ๋ฌด ๊ท€์ฐฎ๊ฒ ์ง€? ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด API ๋ž˜ํผ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด!


const API_BASE_URL = 'https://api.example.com';

function createApiWrapper(endpoints) {
  let wrapper = {};
  endpoints.forEach(endpoint => {
    wrapper[endpoint.name] = async (data) => {
      let response = await fetch(`${API_BASE_URL}${endpoint.path}`, {
        method: endpoint.method,
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify(data)
      });
      return response.json();
    };
  });
  return wrapper;
}

// ์‚ฌ์šฉ ์˜ˆ
let api = createApiWrapper([
  {name: 'getUser', path: '/user', method: 'GET'},
  {name: 'createPost', path: '/post', method: 'POST'},
  {name: 'updateProfile', path: '/profile', method: 'PUT'}
]);

// ์ด์ œ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด
api.getUser({id: 123}).then(user => console.log(user));
api.createPost({title: '์ƒˆ ๊ธ€', content: '๋‚ด์šฉ'}).then(post => console.log(post));
  

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด API ํ˜ธ์ถœ์„ ์œ„ํ•œ ํ•จ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด. ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์™ธ๋ถ€ ์„œ๋น„์Šค์™€ ์—ฐ๋™ํ•  ๋•Œ ์ด๋Ÿฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ค„์ผ ์ˆ˜ ์žˆ๊ฒ ์ง€? ๐Ÿ‘จโ€๐Ÿ’ป

3. ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ ๐Ÿ”Œ

์žฌ๋Šฅ๋„ท์— ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ ์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด!


class PluginSystem {
  constructor() {
    this.plugins = {};
  }

  register(name, plugin) {
    this.plugins[name] = plugin;
  }

  execute(name, ...args) {
    if (this.plugins[name]) {
      return this.plugins[name](...args);
    }
    throw new Error(`Plugin ${name} not found`);
  }
}

// ์‚ฌ์šฉ ์˜ˆ
let pluginSystem = new PluginSystem();

// ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ๋ก
pluginSystem.register('greet', (name) => `์•ˆ๋…•, ${name}!`);
pluginSystem.register('calculateTax', (amount) => amount * 0.1);

// ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹คํ–‰
console.log(pluginSystem.execute('greet', '์ฒ ์ˆ˜')); // ์ถœ๋ ฅ: ์•ˆ๋…•, ์ฒ ์ˆ˜!
console.log(pluginSystem.execute('calculateTax', 1000)); // ์ถœ๋ ฅ: 100
  

์ด๋Ÿฐ ์‹์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๋ฉด, ์žฌ๋Šฅ๋„ท์˜ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒˆ๋กœ์šด ๊ฒฐ์ œ ์‹œ์Šคํ…œ์ด๋‚˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€? ๐Ÿ˜Ž

4. ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ๐Ÿ”—

์žฌ๋Šฅ๋„ท์˜ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฑธ ์ž๋™ํ™”ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ด๋ณด์ž. Proxy๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ์™€ UI๋ฅผ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”ํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด!


function createBindableObject(obj, onChange) {
  return new Proxy(obj, {
    set(target, property, value) {
      let oldValue = target[property];
      target[property] = value;
      onChange(property, value, oldValue);
      return true;
    }
  });
}

// ์‚ฌ์šฉ ์˜ˆ
let user = createBindableObject({
  name: '์ฒ ์ˆ˜',
  age: 25
}, (property, newValue, oldValue) => {
  console.log(`${property}๊ฐ€ ${oldValue}์—์„œ ${newValue}๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.`);
  // ์—ฌ๊ธฐ์„œ UI ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด
});

user.name = '์˜ํฌ';
// ์ถœ๋ ฅ: name์ด ์ฒ ์ˆ˜์—์„œ ์˜ํฌ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

user.age = 26;
// ์ถœ๋ ฅ: age๊ฐ€ 25์—์„œ 26์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์–ด. ์žฌ๋Šฅ๋„ท์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฐ์ดํ„ฐ(์˜ˆ: ์ž…์ฐฐ๊ฐ€, ๋‚จ์€ ์‹œ๊ฐ„ ๋“ฑ)๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ์ด๋Ÿฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๊ฒ ์ง€? ๐Ÿ•ฐ๏ธ

๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‘์šฉ ์‚ฌ๋ก€ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‘์šฉ ์‚ฌ๋ก€ ๋™์  ํผ ์ƒ์„ฑ๊ธฐ API ๋ž˜ํผ ์ž๋™ ์ƒ์„ฑ๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ ํ”„๋ก์‹œ๋ฅผ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ

์ด๋ ‡๊ฒŒ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ™œ์šฉํ•˜๋ฉด ์ •๋ง ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ์ฐฝ์˜์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด. ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ๋ณต์žกํ•œ ํ”Œ๋žซํผ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์ด๋Ÿฐ ๊ธฐ๋ฒ•๋“ค์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ , ํ™•์žฅ์„ฑ์„ ๊ฐœ์„ ํ•˜๊ณ , ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์ง€.

ํ•˜์ง€๋งŒ ๊ธฐ์–ตํ•ด์•ผ ํ•  ์ ์€, ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ํ•ญ์ƒ ์ตœ์„ ์˜ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฑฐ์•ผ. ๋•Œ๋กœ๋Š” ๋‹จ์ˆœํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ์–ด. ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ณต์žก์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ , ๋””๋ฒ„๊น…์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฑฐ๋“ . ๊ทธ๋ž˜์„œ ํ•ญ์ƒ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด.

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์‹ค์ œ ์‘์šฉ ์‚ฌ๋ก€๋“ค์„ ์‚ดํŽด๋ดค์–ด. ์ด๋Ÿฐ ๊ธฐ๋ฒ•๋“ค์„ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ• ์ง€๋Š” ๋„ˆ์˜ ์ƒ์ƒ๋ ฅ๊ณผ ์ฐฝ์˜๋ ฅ์— ๋‹ฌ๋ ธ์–ด. ์–ด๋–ค ๋ฉ‹์ง„ ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ค๋ฅด๋‹ˆ? ๐Ÿš€๐Ÿ’ก

๐ŸŽ“ ๋งˆ๋ฌด๋ฆฌ: ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ฌํ–‰์ด ๊ฑฐ์˜ ๋๋‚˜๊ฐ€๊ณ  ์žˆ์–ด. ์ •๋ง ๊ธด ์—ฌ์ •์ด์—ˆ์ง€? ํ•˜์ง€๋งŒ ์ด๊ฒŒ ๋์ด ์•„๋‹ˆ์•ผ. ์ด๊ฑด ๊ทธ์ € ์‹œ์ž‘์ผ ๋ฟ์ด์ง€! ๐Ÿ˜‰

์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณผ๊นŒ?

  • ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋„๊ตฌ๋“ค
  • ์‹ค์ „ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•๋“ค
  • ์‹ค์ œ ์‘์šฉ ์‚ฌ๋ก€๋“ค

์ด ๋ชจ๋“  ๊ฒƒ๋“ค์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ณ  ์ž์œ ์ž์žฌ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์‹œ๊ฐ„๊ณผ ์—ฐ์Šต์ด ํ•„์š”ํ•ด. ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ! ๋„ˆ๋Š” ์ด๋ฏธ ํฐ ๊ฑธ์Œ์„ ๋‚ด๋”›์—ˆ์–ด. ๐Ÿ‘ฃ

๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ํŒ์„ ์ค„๊ฒŒ:

  1. ๊ณ„์† ์—ฐ์Šตํ•˜๊ธฐ: ์ž‘์€ ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์„ ์ ์šฉํ•ด๋ด.
  2. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ ์ฝ๊ธฐ: ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์—์„œ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์‚ดํŽด๋ด.
  3. ์‹คํ—˜ํ•˜๊ธฐ: ์ƒˆ๋กœ์šด ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ค๋ฅด๋ฉด ์ฃผ์ €ํ•˜์ง€ ๋ง๊ณ  ์‹œ๋„ํ•ด๋ด.
  4. ๊ท ํ˜• ์žก๊ธฐ: ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ํ•ญ์ƒ ์ตœ์„ ์˜ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹ˆ์•ผ. ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์›Œ.
  5. ์ตœ์‹  ํŠธ๋ Œ๋“œ ๋”ฐ๋ผ๊ฐ€๊ธฐ: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์€ ๊ณ„์† ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์–ด. ์ตœ์‹  ๋™ํ–ฅ์„ ๋†“์น˜์ง€ ๋งˆ!

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํž˜์„ ์ฑ…์ž„๊ฐ ์žˆ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ. ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ•ญ์ƒ ์—ผ๋‘์— ๋‘๊ณ , ํŒ€์›๋“ค๊ณผ ์†Œํ†ตํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด.

์ž, ์ด์ œ ๋„ˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ๊ณ„๋กœ ๋“ค์–ด๊ฐˆ ์ค€๋น„๊ฐ€ ๋์–ด! ๐Ÿš€ ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์–ด๋–ค ๋ฉ‹์ง„ ๊ฒƒ๋“ค์„ ๋งŒ๋“ค์–ด๋‚ผ์ง€ ์ •๋ง ๊ธฐ๋Œ€๋ผ. ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์„ ๊ฐœ๋ฐœํ•  ๋•Œ, ์ด๋Ÿฐ ๊ธฐ์ˆ ๋“ค์„ ์ ์žฌ์ ์†Œ์— ํ™œ์šฉํ•œ๋‹ค๋ฉด ์ •๋ง ๋†€๋ผ์šด ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ.

๊ธฐ์–ตํ•ด, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ๊ณ„์—๋Š” ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์žˆ์–ด. ๊ณ„์†ํ•ด์„œ ๋ฐฐ์šฐ๊ณ , ์‹คํ—˜ํ•˜๊ณ , ์„ฑ์žฅํ•˜๋Š” ๊ฑธ ๋ฉˆ์ถ”์ง€ ๋งˆ. ๋„Œ ์ด๋ฏธ ๋Œ€๋‹จํ•œ ์—ฌ์ •์„ ์‹œ์ž‘ํ–ˆ์–ด. ์ด์ œ ๊ทธ ์—ฌ์ •์„ ์ฆ๊ธฐ๋ฉด์„œ ๊ณ„์† ๋‚˜์•„๊ฐ€๋ด!

ํ™”์ดํŒ…! ๐ŸŽ‰๐Ÿ‘จโ€๐Ÿ’ป๐Ÿ‘ฉโ€๐Ÿ’ป

๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ ์—ฐ์Šตํ•˜๊ธฐ ์ฝ”๋“œ ์ฝ๊ธฐ ์‹คํ—˜ํ•˜๊ธฐ ๊ท ํ˜• ์žก๊ธฐ