#refactoring, ย #design-pattern

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ์˜ Inversion of Control

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ์˜ Inversion of Control
(์ž๋ฃŒ ์ถœ์ฒ˜ : https://unsplash.com/@ravipalwe)

๐ŸŽ Inversion of Control ์ด๋ž€?

IoC(Inversion of Control), ์ œ์–ด ์—ญ์ „์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ? ๊ฐ€์žฅ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด ์šฉ์–ด ๊ทธ๋Œ€๋กœ ์ฝ”๋“œ์˜ ๋กœ์ง์ด ์ผ๋ฐ˜์ ์ธ ์ œ์–ด ํ๋ฆ„์ด ์•„๋‹ˆ๋ผ ์—ญ์ „๋œ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ฒ˜์Œ IoC๋ฅผ ๋“ฃ๊ฒŒ ๋˜๋ฉด ์ผ๋ฐ˜์ ์ธ ์ œ์–ด ํ๋ฆ„์€ ๋ฌด์—‡์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ๋ฆ„์ด ์–ด๋–ป๊ฒŒ ์—ญ์ „๋˜๋Š” ๊ฒƒ์ธ์ง€ ๊ฐ์ด ์˜ค์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. IoC๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ํƒ์‹œ๋ฅผ ํƒ€๋Š” ์ƒํ™ฉ์„ ์˜ˆ๋กœ ๋“ค์–ด ํ•จ๊ป˜ ์•Œ์•„๋ณด์ž.

image

๋งŒ์•ฝ ํƒ์‹œ๋ฅผ ํƒ”๋Š”๋ฐ ํƒ์‹œ ๊ธฐ์‚ฌ์—๊ฒŒ ์ž๋™์ฐจ ์†๋„๋ฅผ ๋ช‡ km๋กœ ์œ ์ง€ํ•  ์ง€, ๋ชฉ์ ์ง€๊นŒ์ง€ ์–ด๋–ค ๊ธธ๋กœ ๊ฐˆ์ง€, ์‚ฌ์†Œํ•œ ๊ฒƒ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ชจ๋‘ ์ง€์‹œํ•ด์•ผํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ?

๊ต‰์žฅํžˆ ๋ฒˆ๊ฑฐ๋กญ๊ณ  โ€˜์ด๋Ÿฐ ๊ฒƒ๊นŒ์ง€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ์•„์•ผํ•˜๋‚˜?โ€™ ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ์ € ๊ฐ€๊ณ  ์‹ถ์€ ๋ชฉ์ ์ง€๋งŒ ์•Œ๊ณ  ์žˆ๊ณ , ๊ทธ๊ณณ์œผ๋กœ ๊ฐ€๊ณ  ์‹ถ์„ ๋ฟ์ธ๋ฐ ๋ง์ด๋‹ค.

๋ฐ”๋กœ ์ด ์ƒํ™ฉ์ด ์ผ๋ฐ˜์ ์ธ ์ œ์–ด ํ๋ฆ„ ์ด๋‹ค. ์ƒ์œ„ ๋ชจ๋“ˆ์ด ์†๋‹˜์ด๊ณ  ํ•˜์œ„ ๋ชจ๋“ˆ์ด ํƒ์‹œ ๊ธฐ์‚ฌ๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด ๋ชจ๋“  ํ–‰๋™์„ ์ƒ์œ„ ๋ชจ๋“ˆ์ด ํ•˜์œ„ ๋ชจ๋“ˆ์—๊ฒŒ ์ง€์‹œํ•ด์•ผํ•˜๋ฏ€๋กœ ๋ช…๋ น์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์ œ์–ด ํ๋ฆ„์„ ์—ญ์ „ ์‹œํ‚จ๋‹ค๋ฉด ์–ด๋–ค ํ˜•ํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์„๊นŒ? ์†๋‹˜์€ ๊ทธ์ € ๋ชฉ์ ์ง€๋งŒ ์•Œ๊ณ  ์žˆ์„ ๋ฟ์ด๊ณ  ํƒ์‹œ ๊ธฐ์‚ฌ๋Š” ๋ชฉ์ ์ง€๊นŒ์ง€ ์†๋‹˜์„ ์•ˆ๋‚ดํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํƒ์‹œ๊ฐ€ ๋ชฉ์ ์ง€์— ๋„์ฐฉํ•˜๋ฉด ํƒ์‹œ ๊ธฐ์‚ฌ๋Š” ์†๋‹˜์—๊ฒŒ ์•Œ๋ฆด ๊ฒƒ์ด๋‹ค.

์†๋‹˜์ด ํƒ์‹œ ๊ธฐ์‚ฌ์—๊ฒŒ ๋ช…๋ นํ•˜๋˜ ๊ฒƒ์ด ํƒ์‹œ ๊ธฐ์‚ฌ๊ฐ€ ์†๋‹˜์—๊ฒŒ ๋„์ฐฉํ•จ์„ ์•Œ๋ฆฌ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ œ์–ด๊ฐ€ ์—ญ์ „๋œ ๊ฒƒ์ด๋‹ค.

๐Ÿ™‹โ€โ™‚๏ธ ๊ทธ๋Ÿผ IoC๋ฅผ ์ ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”?

IoC๋ฅผ ์ ์šฉํ•˜๋Š” ์ด์œ ์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ ๊ทธ ์ค‘์—์„œ ์ค‘์š”ํ•œ 2๊ฐ€์ง€ ์ด์œ ๋ฅผ ์•Œ์•„๋ณด์ž

1. ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

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

ํ•จ์ˆ˜๋Š” ์ฒ˜์Œ์—” ํ•œ๊ฐ€์ง€ ์ผ์„ ์ž˜ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ง€๊ฒ ์ง€๋งŒ ์ ์  ์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ์ด ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค. ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์€ ์ด ์ƒํ™ฉ์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์šฐ๋ฆฌ์—๊ฒŒ ์š”๊ตฌํ•  ๊ฒƒ์ด๊ณ  ์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ถ”๊ฐ€์ ์ธ ์˜ต์…˜์„ ๋ฐ›๋„๋ก ํ•ด์•ผํ•  ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฐ ๋ฐฉ์‹์€ ํ•จ์ˆ˜์˜ ๋ณ€๊ฒฝ์„ ์žฆ๊ฒŒ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์„ ์œ„ํ•œ documentation์„ ์ถ”๊ฐ€์ ์œผ๋กœ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค๋Š” ์ ์—์„œ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ๋†’์ด๋Š” ์›์ธ์ด ๋œ๋‹ค. ์ด ๊ฒฝ์šฐ IoC๋ฅผ ์ ์šฉํ•˜๋ฉด ํ•˜์œ„ ๋ชจ๋“ˆ์—์„œ ํ•„์š”ํ•œ ์ƒํ™ฉ์„ ์ง์ ‘ ์ •์˜ํ•˜๋ฏ€๋กœ ํ›จ์”ฌ ์œ ์—ฐํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

2. ๊ตฌํ˜„์ด ์ข€ ๋” ๋‹จ์ˆœํ•ด์ง„๋‹ค.

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

๊ทธ๋Œ€์‹  IoC๋ฅผ ํ™œ์šฉํ•œ ์ถ”์ƒํ™”๋ฅผ ์ ์šฉํ•œ๋‹ค๋ฉด ๋กœ์ง์„ ํ•˜์œ„ ๋ชจ๋“ˆ์—์„œ ๊ตฌํ˜„ํ•˜๋ฏ€๋กœ ์ƒ์œ„ ๋ชจ๋“ˆ์˜ ๊ตฌํ˜„์ด ์ข€ ๋” ๋‹จ์ˆœํ•ด์ง„๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

๐Ÿ” ํ”„๋ก ํŠธ์—”๋“œ์—์„œ์˜ IoC - ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ Array.prototype.filter() ๋‚ด์žฅ ํ•จ์ˆ˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณด์ž.

๐Ÿ‘Ž ์ „ํ˜•์ ์ธ ์ถ”์ƒํ™”

function filter(array, { filterNull = true, filterUndefined = true, filterNumber = false } = {}) {
  let newArray = [];

  array.forEach(element => {
    if (filterNull && element === null) return;
    if (filterUndefined && element === undefined) return;
    if (filterNumber && typeof element === 'number') return;

    newArray.push(element);
  });

  return newArray;
}

filter([0, 1, undefined, 2, null, 3, 'four', '']);
// [0, 1, 2, 3, 'four', '']

filter([0, 1, undefined, 2, null, 3, 'four', ''], { filterNumber: true });
// [ 'four', '' ]

์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•œ ์ถ”์ƒํ™”์˜ ๋ฐฉ์‹์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๋” ํ•„์š”ํ•œ use case๊ฐ€ ์žˆ๋‹ค๋ฉด ์—ฌ๋Ÿฌ ์˜ต์…˜์ด ์ถ”๊ฐ€๋  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‹œ๊ฐ„์ด ํ˜๋ €์„ ๋•Œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ต์…˜ ๋ช‡ ๊ฐœ ์ •๋„๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€๋„ ์•Š๋Š”๋ฐ ์‚ญ์ œํ•ด๋„ ๋˜๊ฒ ๋Š”๋ฐ?

ํ•˜์ง€๋งŒ ์ด๋ฅผ ๊นจ๋‹ซ๊ฒŒ ๋˜๋”๋ผ๋„ ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ์˜ต์…˜์„ ์‚ญ์ œํ•˜๊ฒŒ ๋˜๋Š” ๋ฐ์—๋Š” ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  filter ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์•ฑ์ด ๊นจ์งˆ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

๐Ÿ‘ IoC๋ฅผ ์ ์šฉํ•œ ์ถ”์ƒํ™”

function filter(array, filterFunction) {
  let newArray = [];

  array.forEach(element => {
    if (filterFunction(element)) {
      newArray.push(element);
    }
  });

  return newArray;
}

// ๋” ํŠน๋ณ„ํ•œ case์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•จ
filter(
  [
    { name: '๋…์„œํ•˜๊ธฐ', duration: 120 },
    { name: '๋ฐฅ๋จน๊ธฐ', duration: 60 },
    { name: '๊ณต๋ถ€ํ•˜๊ธฐ', duration: 100 },
  ],
  task => task.duration >= 100,
);
// [ { name: '๋…์„œํ•˜๊ธฐ', duration: 120 }, { name: '๊ณต๋ถ€ํ•˜๊ธฐ', duration: 100 } ]

IoC๋ฅผ ์ ์šฉํ•ด ๋‹ค์‹œ filter ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ณธ๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. filter๋Š” ๋ฐฐ์—ด์— ํฌํ•จ๋  ์š”์†Œ๋ฅผ ํŒ๋‹จํ•˜๋Š” filterFunction ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ํ˜ธ์ถœ๋งŒ ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ธ๋ถ€์ ์ธ filterFunction ํ•จ์ˆ˜์˜ ๋กœ์ง์€ ํ•˜์œ„ ๋ชจ๋“ˆ์—์„œ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค.

ํ•ญ์ƒ IoC๊ฐ€ ์ ์šฉ๋œ ์ถ”์ƒํ™”๊ฐ€ ์ข‹์€ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ filter ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ์—์„œ๋Š” use case๊ฐ€ ๊ต‰์žฅํžˆ ๋‹ค์–‘ํ•˜๊ณ  IoC๋Š” ๋‹ค์–‘ํ•œ use case์— ๋Œ€ํ•œ ๋Œ€์‘์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ” ํ”„๋ก ํŠธ์—”๋“œ์—์„œ์˜ IoC - ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

โœ… Redux

์ผ๋ฐ˜์ ์ธ ์ œ์–ด์˜ ํ๋ฆ„์—์„œ ํ™”๋ฉด์˜ ๊ตฌ์„ฑ์„ ๋‹ด๋‹นํ•˜๋Š” component๋Š” ์ƒํƒœ์˜ ๋ณ€ํ™”๊ฐ€ ์–ธ์ œ ์ผ์–ด๋‚˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ getState() ์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋กœ ์—…๋ฐ์ดํŠธ ๋œ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์™€ ํ™”๋ฉด๊ณผ ๋™๊ธฐํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ธ์ œ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋Š”์ง€ ์‹ ๊ฒฝ์„ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋ถˆ๋ณ€์„ฑ์„ ์ด์šฉํ•ด ์–ธ์ œ ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚˜๋Š”์ง€ ๋ฆฌ๋•์Šค๊ฐ€ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ , ์–ด๋–ป๊ฒŒ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธ ํ•ด์•ผํ•˜๋Š”์ง€๋งŒ ์„ ์–ธํ•ด์ฃผ๋ฉด ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚ฌ์„ ๋•Œ ์•Œ์•„์„œ ํ™”๋ฉด์ด ์—…๋ฐ์ดํŠธ๋œ๋‹ค. (pub/sub ํŒจํ„ด๊ณผ ์œ ์‚ฌ)

์ด๋Š” ์ œ์–ด์˜ ์ผ๋ถ€๋ถ„์ด ๋ฆฌ๋•์Šค๋กœ ์—ญ์ „๋˜์—ˆ๊ธฐ์— ๊ฐ€๋Šฅํ•œ ์ผ์ด๋‹ค. IoC๊ฐ€ ๋ฆฌ๋•์Šค์— ์ ์šฉ๋œ ์˜ˆ์‹œ ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ง‘์ค‘ํ•ด์•ผํ•  ํ™”๋ฉด์„ ์–ด๋–ป๊ฒŒ ํ‘œ์‹œํ•˜๋Š”๊ฐ€ ์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ ์™ธ์˜ ๋ถ€๋ถ„์€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๊ฐ€๊น๋‹ค.

โœ… React

React๋Š” reactive view update ๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. ์ƒํƒœ์˜ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ์ž๋™์œผ๋กœ view๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

React๋Š” ์ž๋™์œผ๋กœ view๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถ€๋ถ„์—์„œ IoC๋ฅผ ์ ์šฉํ•˜์˜€๋‹ค.

  1. ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ view๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๊ฒƒ์ธ๊ฐ€
  2. ์–ธ์ œ view๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๊ฒƒ์ธ๊ฐ€

์šฐ๋ฆฌ๋Š” React ํ™˜๊ฒฝ์—์„œ view๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ •์˜ํ•˜์ง€ ์•Š๊ณ  (๋ช…๋ นํ˜•) view๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€๋ฅผ ์„ ์–ธํ•œ๋‹ค.(์„ ์–ธํ˜•) ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€๋งŒ ์„ ์–ธํ•˜๋ฉด ์–ธ์ œ, ์–ด๋–ป๊ฒŒ renderํ•˜๋Š”์ง€๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

โœจ ๋งˆ๋ฌด๋ฆฌ

React๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ IoC๋ผ๋Š” ์šฉ์–ด๋ฅผ ์ฒ˜์Œ ์•Œ๊ฒŒ๋˜์—ˆ๊ณ  ์ด๋ฒˆ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ฉฐ React๋‚˜ Redux๋ผ๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

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

์•ž์œผ๋กœ ์ข…์ข… ๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ๊ณ ๋ฏผํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•œ ๋‚ด์žฌํ™”๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ•ด์•ผ๊ฒ ๋‹ค. ๐Ÿ”ฅ

๐Ÿ“œ ์ฐธ๊ณ  ์ž๋ฃŒ