ํ๋ก ํธ์๋์์์ Inversion of Control
๐ Inversion of Control ์ด๋?
IoC(Inversion of Control)
, ์ ์ด ์ญ์ ์ด๋ ๋ฌด์์ผ๊น?
๊ฐ์ฅ ๊ฐ๋จํ ์ค๋ช
ํ์๋ฉด ์ฉ์ด ๊ทธ๋๋ก ์ฝ๋์ ๋ก์ง์ด ์ผ๋ฐ์ ์ธ ์ ์ด ํ๋ฆ์ด ์๋๋ผ ์ญ์ ๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํ์ง๋ง ์ฒ์ IoC๋ฅผ ๋ฃ๊ฒ ๋๋ฉด ์ผ๋ฐ์ ์ธ ์ ์ด ํ๋ฆ
์ ๋ฌด์์ธ์ง,
๊ทธ๋ฆฌ๊ณ ๊ทธ ํ๋ฆ์ด ์ด๋ป๊ฒ ์ญ์ ๋๋ ๊ฒ์ธ์ง ๊ฐ์ด ์ค์ง ์์ ๊ฒ์ด๋ค.
IoC๋ฅผ ์ดํดํ๊ธฐ ์ํด ํ์๋ฅผ ํ๋ ์ํฉ์ ์๋ก ๋ค์ด ํจ๊ป ์์๋ณด์.
๋ง์ฝ ํ์๋ฅผ ํ๋๋ฐ ํ์ ๊ธฐ์ฌ์๊ฒ ์๋์ฐจ ์๋๋ฅผ ๋ช 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๋ฅผ ์ ์ฉํ์๋ค.
- ์ด๋ค ๋ฐฉ์์ผ๋ก view๋ฅผ ์ ๋ฐ์ดํธ ํ ๊ฒ์ธ๊ฐ
- ์ธ์ view๋ฅผ ์ ๋ฐ์ดํธ ํ ๊ฒ์ธ๊ฐ
์ฐ๋ฆฌ๋ React ํ๊ฒฝ์์ view๊ฐ ๋ฌด์์ ํ๋์ง ์ ์ํ์ง ์๊ณ (๋ช ๋ นํ) view๊ฐ ์ด๋ป๊ฒ ๋ณด์ผ์ง๋ฅผ ์ ์ธํ๋ค.(์ ์ธํ) ์ด๋ป๊ฒ ๋ณด์ผ์ง๋ง ์ ์ธํ๋ฉด ์ธ์ , ์ด๋ป๊ฒ renderํ๋์ง๋ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ ๊ฒ์ด๋ค.
โจ ๋ง๋ฌด๋ฆฌ
React๋ก ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ IoC๋ผ๋ ์ฉ์ด๋ฅผ ์ฒ์ ์๊ฒ๋์๊ณ ์ด๋ฒ ๊ธ์ ์์ฑํ๋ฉฐ React๋ Redux๋ผ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ๋ํด ๊ณ ๋ฏผํด๋ณผ ์ ์์๋ค.
๋ด๊ฐ ๊ฐ๋ฐ์ ์ฌ์ฉํ๋ ๋๊ตฌ๋ฅผ ์ดํดํ๋ ค๋ ๋ ธ๋ ฅ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ๋ ์ค์ํ๋ ๋ถ๋ถ์ ์ด๋์ ๋ ์ค์ฌ์ค ์๋ ์๊ณ ๋ค๋ฅธ ๋๊ตฌ์ ๋น๊ตํ์ฌ ์ด๋ ๊ฒ์ด ๋ด ํ๋ก์ ํธ์ ๋ ์ ํฉํ์ง ํ๋จํจ์ ์์ด ์ ์ฉํ๊ฒ ์ฐ์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
์์ผ๋ก ์ข ์ข ๋์์ธ ํจํด์ ๋ํด์ ๊ณ ๋ฏผํด ๋ณผ ์ ์๋ ์๊ฐ์ ๊ฐ์ ธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ๋ํ ๋ด์ฌํ๊ฐ ๋ ์ ์๋๋ก ๋ ธ๋ ฅํด์ผ๊ฒ ๋ค. ๐ฅ