โ†ย ๋’ค๋กœ๊ฐ€๊ธฐ

์ฑ•ํ„ฐ 1-4: ๋ถˆ๋ณ€๊ฐ์ฒด

2023/01/25

๋ถˆ๋ณ€ ๊ฐ์ฒด

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

๋ถˆ๋ณ€ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ

  • changeName ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    ๊ทธ์ €, newUser๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ, ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ newUser์— ๋„ฃ๊ณ , ํ”„๋กœํผํ‹ฐ name์„ ์ฐธ์กฐํ•ด์„œ ๊ฐ’์„ newName์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ€ ๋ฟ์ด๋‹ค.
  • ๊ทธ๋ ‡๋‹ค๋ณด๋‹ˆ, user2์™€ user์˜ ๊ฐ’์€ ๊ฐ™์„ ์ˆ˜ ๋ฐ–์— ์—†๊ณ , ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋„ false๊ฐ€ ๋‚˜์˜จ ๊ฒƒ์ด๋‹ค.

๋ถˆ๋ณ€๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 1 : ์–•์€ ๋ณต์‚ฌ

  • ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์œ„์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์˜ ๋ฌธ์ œ์ 

1. ์‹ค์ˆ˜ํ•˜๊ธฐ ์‰ฝ๋‹ค.

  • ์‹ค์ˆ˜๋กœ copyObject๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด๋ฒ„๋ฆฐ๋‹ค๋ฉด, ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์€ ๊นจ์ ธ๋ฒ„๋ฆฐ๋‹ค.
  • ํ”„๋กœํผํ‹ฐ ๋ณ€๊ฒฝ ์ž์ฒด๋ฅผ ๋ง‰์•„์•ผ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ๋Œ€ํ‘œ์ ์œผ๋กœ immutable.js์™€ baobab.js๊ฐ€ ์žˆ๋‹ค.

2. ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

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

๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 2 : ๊นŠ์€ ๋ณต์‚ฌ

  • ๊ฐ์ฒด๋ฅผ ์™„์ „ํžˆ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ณต์‚ฌํ•œ๋‹ค.
    ์ด๋Š” ์žฌ๊ท€์ ์œผ๋กœ ํ–‰ํ•ด์ง„๋‹ค.

๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 3 : JSON.stringify ํ™œ์šฉ

  • JSON.stringify๋กœ ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“  ๋‹ค์Œ, parse๋กœ ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค๋ฉด, ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ ์„ ์ด์šฉํ•œ ๊นŠ์€ ๋ณต์‚ฌ์ด๋‹ค.
  • ๋‹จ, ์ด ๋ฐฉ๋ฒ•์€ JSON์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ์ˆจ๊ฒจ์ง„ ํ”„๋กœํผํ‹ฐ์ธ __proto__, getter/setter๋“ฑ์€ ๋ฌด์‹œํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ, ์ด ๋ฐฉ๋ฒ•์€ ์ˆœ์ˆ˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์œ ํšจํ•˜๋‹ค.

๋ถˆ๋ณ€๊ฐ์ฒด ์š”์•ฝ

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