๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

(JS) Closure์™€ Method Chaining ๐Ÿ”—

ยท ์•ฝ 11๋ถ„
์‹ฌ์™„

LG์œ ํ”Œ๋Ÿฌ์Šค์—์„œ 1๋…„ 4์›”๋™์•ˆ ์žฌ์งํ•˜๋ฉฐ, Javascript์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ ๐Ÿ“โ€‹

๋‹น์‹œ ๊ฐœ๋ฐœํ™˜๊ฒฝ์ด ๋งค์šฐ ํŠน์ดํ•˜๊ณ , ์–ด๋ ค์šด ์ ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.

๋‹น์‹œ ๊ฐœ๋ฐœํ™˜๊ฒฝโ€‹

I๋ชจ ์—…์ฒด์˜ SPA๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ , XML ํŒŒ์ผ ์•ˆ์—์„œ JS๋กœ์ง์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ์‹์ด์˜€์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋„ ๊ฐ™์€ ์—…์ฒด์—์„œ ๊ฐœ๋ฐœํ•œ Chrome ๊ธฐ๋ฐ˜์˜ ๊ฒƒ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ฌ 3์›” ๊ธฐ์ค€ Chrome 92 ๊ธฐ๋ฐ˜์ด ์ตœ์‹ ์ด์˜€์Šต๋‹ˆ๋‹ค. IDE๋Š” Spring Tool Suite๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์ โ€‹

  • Syntax ์ž๋™์™„์„ฑ ๋ถˆ๊ฐ€ (4์›”์ฏค๋ถ€ํ„ฐ ์ง€์›)
  • VS code ์‚ฌ์šฉ๋ถˆ๊ฐ€ (Editor๋กœ์จ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ)
  • ๊ทธ๋“ค๋งŒ์˜ Data ๊ตฌ์กฐ
  • ๊ทธ๋“ค๋งŒ์˜ API
  • ๋‹จ์œ„ํ…Œ์ŠคํŠธ โŒ
  • ํ†ตํ•ฉํ…Œ์ŠคํŠธ โŒ

์š”์•ฝํ•ด์„œ ๋งํ•˜์ž๋ฉด, ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋งค์šฐ ์–ด๋ ค์šด ํ™˜๊ฒฝ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•โ€‹

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

1. Closure ๐Ÿ“ฆโ€‹

๊ฐœ๋…โ€‹

Closure๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์„ ์™„๋ฃŒํ•œ ํ›„์—๋„ ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜ ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค๋ผ๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œโ€‹

Closure๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด, ๊ฐ„๋‹จํ•œ Counter๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function createCounter() {
let count = 0;

return {
increment: function () {
count++;
},
decrement: function () {
count--;
},
getCount: function () {
return count;
},
};
}

const counter = createCounter();

counter.increment();
counter.increment();
console.log(counter.getCount()); // ์ถœ๋ ฅ : 2

counter.decrement();
console.log(counter.getCount()); // ์ถœ๋ ฅ : 1

console.log(counter.count); // ์ถœ๋ ฅ : undefined

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, createCounter ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ count ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  createCounter ํ•จ์ˆ˜๋Š” increment, decrement, getCount ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ createCounter ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋‚˜๋ฉด, count ๋ณ€์ˆ˜๋Š” ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, createCounter ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋“ค์€ count ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Closure์˜ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์ ์šฉ ์‚ฌ๋ก€โ€‹

scwin.initialize = () => {
// ๊ถŒํ•œ Controller
const authController = {
checkAccessAuth: async () => {
// ๋ณต์žกํ•œ ๋‚ด๋ถ€ ๋กœ์ง
},
spcyAuthCallback: () => {
// ๋ณต์žกํ•œ ๋‚ด๋ถ€ ๋กœ์ง
},
};

// ๋ฐ์ดํ„ฐ Controller
const dataController = {
initCommonCode: () => {
// ๋ณต์žกํ•œ ๋‚ด๋ถ€ ๋กœ์ง
},
initUserData: () => {
// ๋ณต์žกํ•œ ๋‚ด๋ถ€ ๋กœ์ง
},
initPageData: () => {
// ๋ณต์žกํ•œ ๋‚ด๋ถ€ ๋กœ์ง
},
};

// ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ
return {
// ๋ชจ๋“  ๊ถŒํ•œ ์ฒดํฌ
checkAuth: async () => {
await authController.checkAccessAuth();
authController.spcyAuthCallback();
},
// ๋ชจ๋“  ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”
initData: () => {
dataController.initCommonCode();
dataController.initUserData();
dataController.initPageData();
},
};
};

SOLID๋กœ ์ƒ๊ฐํ•ด๋ณด๊ธฐโ€‹

  1. ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP): ์ด ์ฝ”๋“œ๋Š” authController์™€ dataController๋ผ๋Š” ๋‘ ๊ฐœ์˜ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ์—๋Š” ๊ณ ์œ ํ•œ ์ฑ…์ž„์ด ์žˆ์œผ๋ฉฐ, authController๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ  dataController๋Š” ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์—…๋ฌด๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

  2. ๊ฐœ๋ฐฉ/ํ์‡„ ์›์น™(OCP): ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋Š” ์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ธฐ์กด ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ authController ๋˜๋Š” dataController์— ๋ฉ”์„œ๋“œ๋ฅผ ๋” ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ์—ฐ์„ฑ์€ ํ˜„์žฌ ๊ธฐ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  3. ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™(ISP): authController์™€ dataController๋Š” ๊ฐ๊ฐ ํŠน์ • ์ž‘์—…์— ์ดˆ์ ์„ ๋งž์ถ˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋œ ๋ช…ํ™•ํ•˜๊ณ  ์ตœ์†Œํ•œ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ค๊ณ„๋Š” ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋‹ด๋‹น ์—…๋ฌด์™€ ๊ด€๋ จ๋œ ๋ฉ”์„œ๋“œ๋งŒ ๋…ธ์ถœํ•˜๋„๋ก ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ ๋ถ€๋‹ด ์—†์ด ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

2. this๋ฅผ ํ™œ์šฉํ•œ Method Chaining ๐Ÿ”—โ€‹

๊ฐœ๋…โ€‹

Method Chaining์€ ๋‹จ์ผ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์—์„œ ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ํ‘œํ˜„์‹์œผ๋กœ ์ฐจ๋ก€๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜

Method Chaining์€ this๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” this ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ณ , ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

์˜ˆ์‹œโ€‹

Method Chaining์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด, ๊ฐ„๋‹จํ•œ Calculator ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

class Calculator {
constructor() {
this.value = 0;
}

add(num) {
this.value += num;
return this;
}

subtract(num) {
this.value -= num;
return this;
}

multiply(num) {
this.value *= num;
return this;
}

divide(num) {
this.value /= num;
return this;
}
}

const calc = new Calculator();
calc.add(10).subtract(3).multiply(2).divide(7);
concole.log(calc.value); // ์ถœ๋ ฅ : 2

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, add, subtract, multiply, divide ๋ฉ”์„œ๋“œ๊ฐ€ ๋ชจ๋‘ this๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ this๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด, calc ์ธ์Šคํ„ด์Šค์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ์†์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ์šฉ ์‚ฌ๋ก€โ€‹

class ParamData {
constructor() {
this.userInfo = {};
this.encnInfo = {};
this.hmMllnGrpId = "";
}

async setUserInfo() {
const userInfo = await getUserInfo();
this.userInfo = userInfo;
return this;
}

async setEncnInfo() {
const encnInfo = await getEncnInfo();
this.encnInfo = encnInfo;
return this;
}

async setHmMllnGrpId() {
const hmMllnGrpId = await getHmMllnGrpId();
this.hmMllnGrpId = hmMllnGrpId;
return this;
}

async checkUserInfo() {
const { userInfo } = this;
if (!userInfo) {
throw new Error("์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
}
return this;
}

async checkEncnInfo() {
const { encnInfo } = this;
if (!encnInfo) {
throw new Error("encn ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
}
return this;
}

async checkHmMllnGrpId() {
const { hmMllnGrpId } = this;
if (!hmMllnGrpId) {
throw new Error("hmMllnGrpId๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
}
return this;
}
}

// ์‚ฌ์šฉ ์˜ˆ์‹œ
const paramData = new ParamData();

try {
paramData.setUserInfo().then(() => paramData.checkUserInfo());
paramData.setEncnInfo().then(() => paramData.checkEncnInfo());
paramData.setHmMllnGrpId().then(() => paramData.checkHmMllnGrpId());
} catch (error) {
console.log(error);
}

SOLID๋กœ ์ƒ๊ฐํ•ด๋ณด๊ธฐโ€‹

  1. ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP): ParamData ํด๋ž˜์Šค๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด, encn ์ •๋ณด ๋ฐ hmMllnGrpId์— ๋Œ€ํ•œ ๊ด€๋ จ ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์บก์Šํ™”ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ๊ฐ ๋ฉ”์„œ๋“œ์—๋Š” ๋‹จ์ผ ์ฑ…์ž„์ด ์žˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ๊ฐœ๋ฐฉ/ํ์‡„ ์›์น™(OCP): ParamData ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜์—ฌ ๊ธฐ์กด ๊ตฌํ˜„์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ์™€ ๊ด€๋ จ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ParamData๋ฅผ ์„œ๋ธŒํด๋ž˜์‹ฑํ•˜๋ฉด ๊ธฐ์กด ๊ธฐ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™(LSP): ์ด ์ฝ”๋“œ๋Š” ์ „์ฒด ๊ธฐ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ ParamData์˜ ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•˜๊ณ  ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ParamData๋ฅผ ํ™•์žฅํ•˜๋Š” ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๊ฐ€ ๋„์ž…๋  ๊ฒฝ์šฐ ๊ธฐ๋ณธ ํด๋ž˜์Šค ๋Œ€์‹  ๋ฌธ์ œ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  4. ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™(ISP): ParamData ํด๋ž˜์Šค๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ ์†์„ฑ์„ ์„ค์ •ํ•˜๊ณ  ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ์ง‘์ค‘์ ์ด๊ณ  ์ตœ์†Œํ•œ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ค๊ณ„๋Š” ํด๋ž˜์Šค๊ฐ€ ๋‹ด๋‹น ์—…๋ฌด์™€ ๊ด€๋ จ๋œ ๋ฉ”์„œ๋“œ๋งŒ ๋…ธ์ถœํ•˜๋„๋ก ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ ์—†์ด ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐโ€‹

์ด ๊ธ€์˜ ์ œ๋ชฉ์€ (JS) Closure์™€ Method Chaining ๐Ÿ”—์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” SOLID ์›์น™์— ๋Œ€ํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. SOLID ์›์น™์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์›์น™ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด ์›์น™์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•˜๋ฉด, ์ฝ”๋“œ๋ฅผ ๋” ๊น”๋”ํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌํŒฉํ† ๋ง์œผ๋กœ ์™„์„ฑ๋œ ์œ„์˜ JavaScript ์ฝ”๋“œ ์˜ˆ์ œ๋Š” SOLID ์›์น™์„ ํ†ตํ•ด, ์–ด๋–ป๊ฒŒ ๋” ๊น”๋”ํ•˜๊ณ  ์ฒด๊ณ„์ ์ด๋ฉฐ ํšจ์œจ์ ์ธ ์ฝ”๋“œ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์•„์ง ๋ถ€์กฑํ•œ ์ ์ด ๋งŽ์ง€๋งŒ ์•ž์œผ๋กœ SOLID ์›์น™๊ณผ ๋”๋ถˆ์–ด ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋Š” ๋†’์ด๋Š” ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๋ฒ•์„ ๊ณต๋ถ€ํ•˜๊ณ  ์ ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.