๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฑ… ๋ฆฌ๋ทฐ/ํด๋ฆฐ์ฝ”๋“œ

[ํด๋ฆฐ์ฝ”๋“œ] 3. ํ•จ์ˆ˜

์ฝ์€ ๋‚ ์งœ : 2024.08.26
์ง€์€์ด : ๋กœ๋ฒ„ํŠธ C. ๋งˆํ‹ด
์ถœํŒ์‚ฌ : ์ธ์‚ฌ์ดํŠธ

 

โœ”๏ธ ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ

์˜๋„๋ฅผ ๋ถ„๋ช…ํžˆ ํ‘œํ˜„ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

1. ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ

  • ๊ธธ์ด๊ฐ€ ์งง์„์ˆ˜๋ก ์ข‹๋‹ค.

2. ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ ํ•ด๋ผ

  • ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์œผ๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•˜๋Š” ์…ˆ์ด๋‹ค.

3. ํ•˜๋‚˜์˜ ํ•จ์ˆ˜ ๋‚ด์˜ ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ผ

  • ์ฝ”๋“œ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ์ด์•ผ๊ธฐ์ฒ˜๋Ÿผ ์ฝํ˜€์•ผ ํ•œ๋‹ค.
  • ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ์„ ๋•Œ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ํ•œ ๋ฒˆ์— ํ•œ ๋‹จ๊ณ„์”ฉ ๋‚ฎ์•„์ง€๋ฉด ์ฝ๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

4. Switch ๋ฌธ์„ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ์— ์ˆจ๊ฒจ๋ผ

  • ๊ฐ case ์กฐ๊ฑด์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ์บก์Аํ™”ํ•˜๊ณ , ์ด๋ฅผ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

5. ์„œ์ˆ ์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด๋ผ

  • ๊ธธ๊ณ  ์„œ์ˆ ์ ์ธ ์ด๋ฆ„์ด ์งง๊ณ  ์–ด๋ ค์šด ์ด๋ฆ„๋ณด๋‹ค ์ข‹๋‹ค.
  • ์„œ์ˆ ์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž ๋จธ๋ฆฟ์†์—์„œ๋„ ์„ค๊ณ„๊ฐ€ ๋šœ๋ ทํ•ด์ง€๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

6. ์ด์ƒ์ ์ธ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๋Š” 2๊ฐœ ์ดํ•˜ [์ฐธ๊ณ ]

  • ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž.
    • ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ํ•จ์ˆ˜๊ฐ€ ํ•œ ๊ฐ€์ง€ ์ด์ƒ์˜ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.
    • boolean ๊ธฐ๋ฐ˜์œผ๋กœ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋‚˜๋‰œ๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ๋ถ„๋ฆฌํ•˜์ž.
  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 2~3๊ฐœ ํ•„์š”ํ•˜๋‹ค๋ฉด ํด๋ž˜์Šค ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด ๊ฐœ๋…์„ ๋ฌถ๋Š”๋‹ค.
Circle makeCircle(double x, double y, double radius);
Circle makeCircle(Pointer center, double radius);
  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 1๊ฐœ์ธ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜์™€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋™์‚ฌ-๋ช…์‚ฌ ์Œ์„ ์ด๋ฃจ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.
    • write(name) โžก๏ธ writeField(name)
  • ํ•จ์ˆ˜ ์ด๋ฆ„์— ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋„ฃ์œผ๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆœ์„œ๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ์•Š์•„๋„ ๋ผ์„œ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.
    • assertEquals(expected, actual) โžก๏ธ assertExpectedEqualsActual(expected, actual)

7. ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์กฐ์‹ฌํ•ด๋ผ

  • ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ , ์™ธ๋ถ€ ์ƒํƒœ์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์„ ์กฐ์‹ฌํ•˜์ž. [์ฐธ๊ณ 1] [์ฐธ๊ณ 2]
    • ํ•จ์ˆ˜๋กœ ๋„˜์–ด์˜จ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.
// Bad
const addItemToCart = (cart, item) => {
  cart.push({ item, date: Date.now() });
};

// Good
const addItemToCart = (cart, item) => {
  return [...cart, { item, date : Date.now() }];
};
  • ํŠน์ • ์ƒํ™ฉ์—์„œ๋งŒ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜์ง€ ์•Š๋„๋ก ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด checkPassword()๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•˜๊ณ  true/false๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•œ๋‹ค.
    • ์ด์™ธ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์œ ํšจํ•œ ๊ฒฝ์šฐ ์„ธ์…˜์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ด๋ฆ„๋งŒ ๋ณด๊ณ  ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ์„ธ์…˜ ์ดˆ๊ธฐํ™”์— ๋Œ€ํ•œ ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

8. ๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ผ

  • ํ•จ์ˆ˜๋Š” ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ํ•ด์•ผ ํ•œ๋‹ค.

9. ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ณด๋‹ค ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

  • ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ˜ธ์ถœ์ž๋Š” ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๊ณง๋ฐ”๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.
  • ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์›๋ž˜ ์ฝ”๋“œ์—์„œ ๋ถ„๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ try/catch ๋ธ”๋ก์€ ์ •์ƒ ๋™์ž‘๊ณผ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋’ค์„ž๋Š”๋‹ค. ๋ณ„๋„์˜ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ์˜ฌ๋ผ๊ฐ„๋‹ค.
  • ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋„ ํ•œ ๊ฐ€์ง€ ์ž‘์—…๋งŒ ํ•ด์•ผ ํ•œ๋‹ค.
// Bad โŒ
if (deletePage(page) == E_OK) {
  if (registry.deleteReference(page.name) == E_OK) {
    if (configKeys.deleteKey(page.name.makeKey()) == E_OK) {
      logger.log("page deleted");
    } else {
      logger.log("configKey not deleted");
    }
  } else {
    logger.log("deleteReference from registry failed");
  }
} else {
  logger.log("delete failed");
  return E_ERROR;
}

// Good โœ…
try {
  deletePageAndAllReferences(page);
}
catch (Exception e) {
  logError(e)
}

private void deletePageAndAllReferences(Page page) throws Exception {
  deletePage(page);
  registry.deleteReference(page.name);
  configKey.deleteKey(page.name.makeKey());
}

private void logError(Exception e) {
  logger.log(e.getMessage());
}

 

โœ”๏ธ ์˜ค๋Š˜ ์ฝ์€ ์†Œ๊ฐ

'์ง„์งœ ๋ชฉํ‘œ๋Š” ์‹œ์Šคํ…œ์ด๋ผ๋Š” ์ด์•ผ๊ธฐ๋ฅผ ํ’€์–ด๋‚˜๊ฐ€๋Š” ๋ฐ ์žˆ๋‹ค'๋Š” ๋ง์ด ํฌ๊ฒŒ ์™€๋‹ฟ์•˜๋‹ค. 

์œ„์—์„œ ์•„๋ž˜๋กœ ์ด์•ผ๊ธฐ์ฒ˜๋Ÿผ ์ฝํžˆ๋ฉด์„œ, ํ•œ ๊ฐ€์ง€ ์ผ์„ ์ž˜ ํ•ด๋‚ด๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. 

๋˜ํ•œ, ๋‹น์žฅ ํ•จ์ˆ˜๋ฅผ ๋‹ค ๋ถ„๋ฆฌํ•ด๋‚ด์ง€ ๋ชปํ•˜๋”๋ผ๋„, ์ด๋ฆ„์„ ์˜๋ฏธ์žˆ๊ฒŒ ์ง“๊ณ  ํ•จ์ˆ˜์˜ ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ๋งŒ๋“œ๋ ค๊ณ  ํ•˜๋‹ค๋ณด๋ฉด ๊ฐ€๋…์„ฑ์€ ์ €์ ˆ๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

โœ”๏ธ ๊ถ๊ธˆํ•œ ๋‚ด์šฉ & ์ž˜ ์ดํ•ด๋˜์ง€ ์•Š๋Š” ๋‚ด์šฉ

SRP(Single Responsibility Principle)

  • "ํ•œ ๊ฐ€์ง€ ์ด์œ ๋กœ๋งŒ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค."
    • ํด๋ž˜์Šค๋‚˜ ๋ชจ๋“ˆ์€ ๋‹จ ํ•˜๋‚˜์˜ ๋ณ€๊ฒฝ ์ด์œ ๋งŒ์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋”ฑ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค.
    • ์ฑ…์ž„์€ '์™œ ๋ณ€๊ฒฝ๋˜๋Š”๊ฐ€'์— ๋”ฐ๋ผ ๊ตฌ๋ถ„๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๋ณ€๊ฒฝ๋˜๋Š” ์ด์œ ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฑ…์ž„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค.

OCP(Open-Closed Principle)

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

์ถ”์ƒ ํŒฉํ† ๋ฆฌ

  • ๊ฐ์ฒด ์ƒ์„ฑ์— ๊ด€๋ จ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด. ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.
  • ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?
    • ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•  ๋•Œ
    • ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์กฐ๋ฆฝ์ด ์„œ๋กœ ๊ด€๋ จ๋˜์–ด ์žˆ์„ ๋•Œ
  • ๊ตฌ์„ฑ ์š”์†Œ
    • AbstractFactory : ๊ฐ์ฒด ์ƒ์„ฑ์— ๊ด€๋ จ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ "์ƒ์„ฑ ๋ฉ”์„œ๋“œ"๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    • ConcreteFactory : AbstractFactory๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค. ํŠน์ •ํ•œ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฑ…์ž„์ด ์žˆ๋‹ค.
    • AbstractProduct : ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๋“ค์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์ œํ’ˆ์— ๋Œ€ํ•œ ๊ณตํ†ต์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    • ConcreteProduct : AbstractProduct๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค. ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ตฌํ˜„์„ ๋‹ด๋‹นํ•œ๋‹ค.
    • Client : ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ. ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌ์ฒด์ ์ธ ํŒฉํ† ๋ฆฌ์™€ ์ œํ’ˆ ํด๋ž˜์Šค๋ฅผ ๋ชฐ๋ผ๋„ ๋œ๋‹ค.

๋ช…๋ น / ์กฐํšŒ ๋ถ„๋ฆฌ(Command Query Separation, CQS)

  • ํ•จ์ˆ˜๋Š” ๋ช…๋ น(command) ๋˜๋Š” ์กฐํšŒ(query) ์ค‘ ํ•˜๋‚˜๋งŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™.
  • command๋Š” ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , query๋Š” ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ์ฝ๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ํ•จ์ˆ˜์˜ ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๋ฏ€๋กœ ๊ฐ€๋…์„ฑ์€ ์˜ฌ๋ผ๊ฐ€์ง€๋งŒ, ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์˜ค๋ฒ„ ์—”์ง€๋‹ˆ์–ด๋ง์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
  • CQS(Command Query Separation) vs CQRS(Command Query Responsibility Segregation)
    • CQS๋Š” ํ•จ์ˆ˜ ๋ ˆ๋ฒจ์—์„œ ์ ์šฉํ•˜๋Š” ์›์น™์ด๊ณ , CQRS๋Š” ์‹œ์Šคํ…œ ์ฐจ์›์—์„œ ๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    • ๋‘˜ ๋‹ค ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”„๋กœ๊ทธ๋žจ, ์‹œ์Šคํ…œ์—์„œ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

AOP(Aspect Oriented Programming)

  • ์ฝ”๋“œ์˜ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(cross-cutting concerns)๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๊ณ  ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
  • ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋Š” ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์ด๋‚˜ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„(e.g. ๋กœ๊น…, ๋ณด์•ˆ, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋“ฑ)์„ ๋งํ•œ๋‹ค.
  • Spring์—์„œ๋Š” AOP, AspectJ ๋“ฑ์˜ AOP ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์žˆ๊ณ , NestJS์—์„œ๋Š” Interceptor, Custom Decorator ๋“ฑ์ด ์žˆ๋‹ค.
  • ํด๋ฆฐ ์ฝ”๋“œ ์ฑ…์—์„œ๋Š” ์ค‘๋ณต์„ ์—†์• ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ์–ธ๊ธ‰๋˜์—ˆ๋‹ค.

COP(Component Oriented Programming)

  • ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ฃผ์š” ๋‹จ์œ„๋ฅผ "์ปดํฌ๋„ŒํŠธ"๋กœ ๋ณด๊ณ , ์ด๋Ÿฌํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์กฐ๋ฆฝํ•˜์—ฌ ์ „์ฒด ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์ด๋‹ค.
  • ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ๋  ์ˆ˜ ์žˆ๋Š” ๋‹จ์œ„์ด๋‹ค.

 

โœ”๏ธ ์ฐธ๊ณ 

clean-code-javascript

๐Ÿ’  ์ถ”์ƒ ํŒฉํ† ๋ฆฌ(Abstract Factory) ํŒจํ„ด - ์™„๋ฒฝ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ

๋ช…๋ น-์กฐํšŒ-๋ถ„๋ฆฌ(CQS)- ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๋””์ž์ธ ํŒจํ„ด