๋‹จ์ผ ์ฑ…์ž„ ์›์น™. ๋ณด์ด๋Š” ๊ฒƒ๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‹ค

๋‹จ์ผ ์ฑ…์ž„ ์›์น™. ๋ณด์ด๋Š” ๊ฒƒ๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‹ค ๋‹จ์ผ ์ฑ…์ž„ ์›์น™, ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.
์ผ๋ช… ๊ท ์ผ ๊ฐ€๋ณ€์„ฑ์˜ ์›๋ฆฌ - ์ดํ•ดํ•˜๊ธฐ ๋งค์šฐ ๋ฏธ๋„๋Ÿฝ๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ธํ„ฐ๋ทฐ์—์„œ ๋งค์šฐ ๊ธด์žฅ๋œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ์›๋ฆฌ์— ๋Œ€ํ•œ ๋‚˜์˜ ์ฒซ ๋ฒˆ์งธ ์ง„์ง€ํ•œ ์ง€์ธ์€ ์ฒซํ•ด ์ดˆ์— ์–ด๋ฆฐ ๋…น์ƒ‰ ์‚ฌ๋žŒ๋“ค์ด ์• ๋ฒŒ๋ ˆ์—์„œ ํ•™์ƒ, ์ฆ‰ ์‹ค์ œ ํ•™์ƒ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ˆฒ์œผ๋กœ ๋Œ๋ ค ๊ฐ”์„ ๋•Œ ์ผ์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

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

๋Œ€๊ธฐ์—ด ํฌ๊ธฐ๊ฐ€ XNUMX์˜ ๋ฐฐ์ˆ˜์ธ ๊ฒฝ์šฐ๋Š” SRP๋ฅผ ์ž˜ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ •์˜ 1. ๋‹จ์ผ ์ฑ…์ž„.

๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์˜ ๊ณต์‹ ์ •์˜์— ๋”ฐ๋ฅด๋ฉด ๊ฐ ์—”ํ„ฐํ‹ฐ์—๋Š” ๊ณ ์œ ํ•œ ์ฑ…์ž„๊ณผ ์กด์žฌ ์ด์œ ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ฑ…์ž„์€ ํ•˜๋‚˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

"Drinker"๋ผ๋Š” ๊ฐœ์ฒด๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค(์ˆ ๊พผ).
SRP ์›์น™์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ฑ…์ž„์„ ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.

  • ํ•˜๋‚˜๋Š” ๋ถ“๋Š”๋‹ค (ํƒ€์„ค์ž‘์—…)
  • ํ•œ ์ž”(DrinkUp์ž‘์—…)
  • ํ•œ ๋ช…์€ ๊ฐ„์‹์„ ๋จน์Šต๋‹ˆ๋‹ค(TakeBiteOperation)

ํ”„๋กœ์„ธ์Šค์˜ ๊ฐ ์ฐธ๊ฐ€์ž๋Š” ํ”„๋กœ์„ธ์Šค์˜ ํ•œ ๊ตฌ์„ฑ ์š”์†Œ, ์ฆ‰ ๋งˆ์‹œ๊ณ , ๋”ฐ๋ฅด๊ณ , ๊ฐ„์‹์„ ๋จน๋Š” ํ•˜๋‚˜์˜ ์›์ž์  ์ฑ…์ž„์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์Œ์ฃผ ๊ตฌ๋ฉ์€ ๋‹ค์Œ ์ž‘์—…์˜ ์™ธ๊ด€์ž…๋‹ˆ๋‹ค.

ัlass Tippler {
    //...
    void Act(){
        _pourOperation.Do() // ะฝะฐะปะธั‚ัŒ
        _drinkUpOperation.Do() // ะฒั‹ะฟะธั‚ัŒ
        _takeBiteOperation.Do() // ะทะฐะบัƒัะธั‚ัŒ
    }
}

๋‹จ์ผ ์ฑ…์ž„ ์›์น™. ๋ณด์ด๋Š” ๊ฒƒ๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‹ค

์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

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

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

์ด์ œ, SRP๋Š” ์–ด๋–ป๊ฒŒ ๋ถ„ํ•ดํ•ด์•ผ ํ•˜๋Š”์ง€, ์ฆ‰ ์–ด๋””์— ๊ตฌ๋ถ„์„ ์„ ๊ทธ์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์›๋ฆฌ์ด๋‹ค..

์ฑ…์ž„ ๋ถ„๋‹ด์˜ ์›์น™, ์ฆ‰ ํŠน์ • ๋Œ€์ƒ์˜ ์ž„๋ฌด์— ๋”ฐ๋ผ ๋ถ„ํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•œ๋‹ค.

๋‹จ์ผ ์ฑ…์ž„ ์›์น™. ๋ณด์ด๋Š” ๊ฒƒ๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‹ค

์›์ˆญ์ด ๋‚จ์ž๊ฐ€ ๋ถ„ํ•ด ์ค‘์— ์–ป๋Š” ์Œ์ฃผ์™€ ์ด์ ์œผ๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

(์•„, ์ด๊ฑด ์ด๋ฏธ OCP ์›์น™์ธ ๊ฒƒ ๊ฐ™๊ณ , ์ œ๊ฐ€ ์ด ๊ธ€์˜ ์ฑ…์ž„์„ ์œ„๋ฐ˜ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค)

๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  ๋‹จ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋” ๋งŽ์€ ์œ ํ˜•์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆ ๊ณ ๋ž˜๋Š” ํ‰์†Œ๋ณด๋‹ค ๋‘ ์‹œ๊ฐ„ ๋Šฆ๊ฒŒ ์ฒ˜์Œ์œผ๋กœ ์ˆ ์„ ๋งˆ์‹ ๋‹ค.

์ •์˜ 2. ํ†ตํ•ฉ๋œ ๊ฐ€๋ณ€์„ฑ.

ํ—ˆ์šฉํ•ด์ฃผ์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„! ์Œ์ฃผ ์ˆ˜์—…์—๋„ ๋‹จ ํ•˜๋‚˜์˜ ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์Œ์ฃผ์ž…๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ "์ฑ…์ž„"์ด๋ผ๋Š” ๋‹จ์–ด๋Š” ๋งค์šฐ ๋ชจํ˜ธํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์ธ๋ฅ˜์˜ ์šด๋ช…์„ ์ฑ…์ž„์ง€๋Š” ์‚ฌ๋žŒ์ด ์žˆ๊ณ , ๊ทน์ง€๋ฐฉ์—์„œ ์ „๋ณต๋œ ํŽญ๊ท„์„ ํ‚ค์šธ ์ฑ…์ž„์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋‹ค.

drinker์˜ ๋‘ ๊ฐ€์ง€ ๊ตฌํ˜„์„ ๊ณ ๋ คํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ฒซ ๋ฒˆ์งธ ํด๋ž˜์Šค์—๋Š” ๋”ฐ๋ฅด๊ธฐ, ๋งˆ์‹œ๊ธฐ, ๊ฐ„์‹์˜ ์„ธ ๊ฐ€์ง€ ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ๋Š” "Forward and Only Forward" ๋ฐฉ๋ฒ•๋ก ์„ ํ†ตํ•ด ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ํ•ด๋‹น ๋ฐฉ๋ฒ•์˜ ๋ชจ๋“  ๋…ผ๋ฆฌ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํ–‰๋™:

//ะะต ั‚ั€ะฐั‚ัŒั‚ะต ะฒั€ะตะผั  ะฝะฐ ะธะทัƒั‡ะตะฝะธะต ัั‚ะพะณะพ ะบะปะฐััะฐ. ะ›ัƒั‡ัˆะต ััŠะตัˆัŒั‚ะต ะฟะตั‡ะตะฝัŒะบัƒ
ัlass BrutTippler {
   //...
   void Act(){
        // ะฝะฐะปะธะฒะฐะตะผ
    if(!_hand.TryDischarge(from:_bottle, to:_glass, size:_glass.Capacity))
        throw new OverdrunkException();

    // ะฒั‹ะฟะธะฒะฐะตะผ
    if(!_hand.TryDrink(from: _glass,  size: _glass.Capacity))
        throw new OverdrunkException();

    //ะ—ะฐะบัƒัั‹ะฒะฐะตะผ
    for(int i = 0; i< 3; i++){
        var food = _foodStore.TakeOrDefault();
        if(food==null)
            throw new FoodIsOverException();

        _hand.TryEat(food);
    }
   }
}

์™ธ๋ถ€ ๊ด€์ฐฐ์ž์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด ์ด ๋‘ ํด๋ž˜์Šค๋Š” ์™„์ „ํžˆ ๋˜‘๊ฐ™์•„ ๋ณด์ด๋ฉฐ "์Œ์ฃผ"์— ๋Œ€ํ•œ ๋™์ผํ•œ ์ฑ…์ž„์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

์ฐฉ๋ž€!

๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜จ๋ผ์ธ์— ์ ‘์†ํ•˜์—ฌ SRP์˜ ๋˜ ๋‹ค๋ฅธ ์ •์˜์ธ ๋‹จ์ผ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ ์›์น™์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

SCP๋Š” "๋ชจ๋“ˆ์—๋Š” ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋‹จ ํ•˜๋‚˜์˜ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.". ์ฆ‰, โ€œ์ฑ…์ž„์€ ๋ณ€ํ™”์˜ ์ด์œ ์ด๋‹คโ€์ด๋‹ค.

(์›๋ž˜ ์ •์˜๋ฅผ ์ƒ๊ฐํ•ด๋‚ธ ๋…€์„๋“ค์€ ์œ ์ธ์›์˜ ํ…”๋ ˆํŒŒ์‹œ ๋Šฅ๋ ฅ์— ์ž์‹ ์ด ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค)

์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ์ œ์ž๋ฆฌ์— ๋†“์˜€์Šต๋‹ˆ๋‹ค. ๋ณ„๋„๋กœ ๋ถ“๊ธฐ, ๋งˆ์‹œ๊ธฐ ๋ฐ ๊ฐ„์‹ ์ ˆ์ฐจ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ˆ ๊พผ ์ž์ฒด์—์„œ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ๋งˆ์‹œ๊ธฐ ์ „์— ๊ฐ„์‹์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๊ฑด๋ฐฐ ์ฝ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋“ฑ ์ž‘์—… ์ˆœ์„œ์™€ ๊ตฌ์„ฑ๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"Forward and Only Forward" ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ ๋ฉ”์„œ๋“œ์—์„œ๋งŒ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ํ–‰๋™. ์ด๊ฒƒ์€ ๋…ผ๋ฆฌ๊ฐ€ ๊ฑฐ์˜ ์—†๊ณ  ๊ฑฐ์˜ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๋•Œ ์ฝ๊ธฐ ์‰ฝ๊ณ  ํšจ๊ณผ์ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ข…์ข… ๋Ÿฌ์‹œ์•„๊ฐ€ NATO์— ๊ฐ€์ž…ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ if ๋ฌธ์ด ํฌํ•จ๋˜์–ด ๊ฐ๊ฐ 500์ค„์˜ ๋”์ฐํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์ •์˜ 3. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ํ˜„์ง€ํ™”.

์ˆ ๊พผ๋“ค์€ ์ž์‹ ์ด ์™œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์•„ํŒŒํŠธ์—์„œ ๊นจ์–ด๋‚ฌ๋Š”์ง€, ํœด๋Œ€ํฐ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ž์„ธํ•œ ๋กœ๊น…์„ ์ถ”๊ฐ€ํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค.

๋ถ“๋Š” ๊ณผ์ •์— ๋Œ€ํ•œ ๊ธฐ๋ก์„ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

class PourOperation: IOperation{
    PourOperation(ILogger log /*....*/){/*...*/}
    //...
    void Do(){
        _log.Log($"Before pour with {_hand} and {_bottle}");
        //Pour business logic ...
        _log.Log($"After pour with {_hand} and {_bottle}");
    }
}

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

interface IPourLogger{
    void LogBefore(IHand, IBottle){}
    void LogAfter(IHand, IBottle){}
    void OnError(IHand, IBottle, Exception){}
}

class PourOperation: IOperation{
    PourOperation(IPourLogger log /*....*/){/*...*/}
    //...
    void Do(){
        _log.LogBefore(_hand, _bottle);
        try{
             //... business logic
             _log.LogAfter(_hand, _bottle");
        }
        catch(exception e){
            _log.OnError(_hand, _bottle, e)
        }
    }
}

์„ธ์‹ฌํ•œ ๋…์ž๋Š” ๊ทธ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ฆด ๊ฒƒ์ด๋‹ค. ๋กœ๊ทธ์ดํ›„, ๋กœ๊ทธ์ด์ „ ะธ ์˜ค๋ฅ˜ ์‹œ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ ์ด์ „ ๋‹จ๊ณ„์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์„ธ ๊ฐ€์ง€ ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. PourLogger์ด์ „, PourLogger์ดํ›„ ะธ PourErrorLogger.

๊ทธ๋ฆฌ๊ณ  ์ˆ ๊พผ์— ๋Œ€ํ•œ ์„ธ ๊ฐ€์ง€ ์ž‘์—…์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” 14๊ฐœ์˜ ๋กœ๊น… ํด๋ž˜์Šค๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ „์ฒด ์Œ์ฃผ ์„œํด์€ โ€‹โ€‹XNUMX(!!!) ํด๋ž˜์Šค๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์Œ๊ณก์„ ? ๊ฑฐ์˜ ~ ์•„๋‹ˆ๋‹ค! ๋ถ„ํ•ด ์ˆ˜๋ฅ˜ํƒ„์„ ๋“ค๊ณ  ์žˆ๋Š” ์›์ˆญ์ด ๋‚จ์ž๋Š” "์ฃผ์ž…๊ธฐ"๋ฅผ ๋””์บ”ํ„ฐ, ์œ ๋ฆฌ์ž”, ์Ÿ์•„์ง€๋Š” ์กฐ์ž‘์ž, ๋ฌผ ๊ณต๊ธ‰ ์„œ๋น„์Šค, ๋ถ„์ž ์ถฉ๋Œ์˜ ๋ฌผ๋ฆฌ์  ๋ชจ๋ธ๋กœ ๋‚˜๋ˆ„๊ณ  ๋‹ค์Œ ๋ถ„๊ธฐ ๋™์•ˆ ๊ทธ๋Š” ์ข…์†์„ฑ์„ ํ’€๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „์—ญ ๋ณ€์ˆ˜. ๊ทธ๋ฆฌ๊ณ  ๋‚ด ๋ง์„ ๋ฏฟ์œผ์„ธ์š”. ๊ทธ๋Š” ๋ฉˆ์ถ”์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ SRP๊ฐ€ ํ•‘ํฌ ์™•๊ตญ์˜ ๋™ํ™”๋ผ๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ•˜๊ณ  ๊ตญ์ˆ˜๋ฅผ ์ฆ๊ธฐ๋Ÿฌ ๋– ๋‚ฉ๋‹ˆ๋‹ค.

... Srp์˜ ์„ธ ๋ฒˆ์งธ ์ •์˜์˜ ์กด์žฌ์— ๋Œ€ํ•ด ์ „ํ˜€ ๋ฐฐ์šฐ์ง€ ์•Š์€ ์ฑ„:

โ€œ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™”์™€ ์œ ์‚ฌํ•œ ๊ฒƒ๋“ค์€ ํ•œ ๊ณณ์— ๋ณด๊ด€ํ•ด์•ผ ํ•œ๋‹ค". ๋˜๋Š” "ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์€ ํ•œ ๊ณณ์— ๋ณด๊ด€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."

์ฆ‰, ์ž‘์—… ๋กœ๊น…์„ ๋ณ€๊ฒฝํ•˜๋ฉด ํ•œ ๊ณณ์—์„œ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๋‹จ์ผ ์ฑ…์ž„ ์›์น™. ๋ณด์ด๋Š” ๊ฒƒ๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‹ค

์ด์ œ ์ˆ ๊พผ์˜ ๊ธฐ๋ถ„์ด ์ข‹์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. IPourLogger ๋กœ๊ฑฐ๋ฅผ ์„ธ ๊ฐ€์ง€ ํด๋ž˜์Šค๋กœ ๋ถ„ํ• ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์‚ฌ์‹ค ์™ธ์—๋„ ๋ชจ๋“  ๋กœ๊ฑฐ๋ฅผ ํ•˜๋‚˜์˜ ์œ ํ˜•์œผ๋กœ ๊ฒฐํ•ฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

class OperationLogger{
    public OperationLogger(string operationName){/*..*/}
    public void LogBefore(object[] args){/*...*/}       
    public void LogAfter(object[] args){/*..*/}
    public void LogError(object[] args, exception e){/*..*/}
}

๊ทธ๋ฆฌ๊ณ  ๋„ค ๋ฒˆ์งธ ์œ ํ˜•์˜ ์ž‘์—…์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๋‹น ์ž‘์—…์— ๋Œ€ํ•œ ๋กœ๊น…์ด ์ด๋ฏธ ์ค€๋น„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šด์˜ ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ๊นจ๋—ํ•˜๊ณ  ์ธํ”„๋ผ ๋…ธ์ด์ฆˆ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ์Œ์ฃผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ 5๊ฐ€์ง€ ์ˆ˜์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ถ“๋Š” ์ž‘์—…
  • ์Œ์ฃผ์šด์ „
  • ์ „ํŒŒ ๋ฐฉํ•ด ์ž‘์—…
  • ๋‚˜๋ฌด๊พผ
  • ์ˆ ๊พผ ์™ธ๊ด€

๊ฐ๊ฐ์€ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์—„๊ฒฉํ•˜๊ฒŒ ์ฑ…์ž„์„ ์ง€๋ฉฐ ๋ณ€๊ฒฝ ์ด์œ ๋„ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๊ณผ ์œ ์‚ฌํ•œ ๋ชจ๋“  ๊ทœ์น™์€ ๊ทผ์ฒ˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ์‚ฌ๋ก€

์šฐ๋ฆฌ๋Š” B2B ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ ์‚ฌํ•œ ๋‚ด์šฉ์˜ 200์ค„์— ๋Œ€ํ•ด GOD ๋ฐฉ๋ฒ•์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

  • 1C๋กœ ์ด๋™ํ•˜์—ฌ ๊ณ„์ •์„ ๋งŒ๋“œ์‹ญ์‹œ์˜ค
  • ์ด ๊ณ„์ •์œผ๋กœ ๊ฒฐ์ œ ๋ชจ๋“ˆ๋กœ ์ด๋™ํ•˜์—ฌ ์ƒ์„ฑํ•˜์„ธ์š”.
  • ํ•ด๋‹น ๊ณ„์ •์„ ๊ฐ€์ง„ ๊ณ„์ •์ด ๋ฉ”์ธ ์„œ๋ฒ„์— ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”
  • ์ƒˆ ๊ณ„์ • ์ƒ์„ฑ
  • ๊ฒฐ์ œ ๋ชจ๋“ˆ์— ๋“ฑ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋“ฑ๋ก ๊ฒฐ๊ณผ ์„œ๋น„์Šค์— 1c ๋ฒˆํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ํ…Œ์ด๋ธ”์— ๊ณ„์ • ์ •๋ณด ์ถ”๊ฐ€
  • ํฌ์ธํŠธ ์„œ๋น„์Šค์—์„œ ์ด ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ํฌ์ธํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค์— 1c ๊ณ„์ขŒ ๋ฒˆํ˜ธ๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”.

๊ทธ๋ฆฌ๊ณ  ์ด ๋ชฉ๋ก์—๋Š” ์—ฐ๊ฒฐ์„ฑ์ด ์ข‹์ง€ ์•Š์€ ๋น„์ฆˆ๋‹ˆ์Šค ์šด์˜์ด ์•ฝ 10๊ฐœ ๋” ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๊ณ„์ • ๊ฐœ์ฒด๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ์˜ ์ ˆ๋ฐ˜์—๋Š” ํฌ์ธํŠธ ID์™€ ํด๋ผ์ด์–ธํŠธ ์ด๋ฆ„์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•œ ์‹œ๊ฐ„์˜ ๋ฆฌํŒฉํ† ๋ง ํ›„์— ์šฐ๋ฆฌ๋Š” ์ธํ”„๋ผ ์ฝ”๋“œ์™€ ๊ณ„์ • ์ž‘์—…์˜ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๋ฅผ ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ/ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. God ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์‰ฌ์›Œ์กŒ์ง€๋งŒ, ์—‰ํ‚ค๊ณ  ์‹ถ์ง€ ์•Š์€ 100์ค„์˜ ์ฝ”๋“œ๊ฐ€ ๋‚จ์•„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ถˆ๊ณผ ๋ฉฐ์น  ํ›„์—์•ผ ์ด "๊ฐ€๋ฒผ์šด" ๋ฐฉ๋ฒ•์˜ ๋ณธ์งˆ์ด ๋น„์ฆˆ๋‹ˆ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์ˆ  ์‚ฌ์–‘์— ๋Œ€ํ•œ ์›๋ž˜ ์„ค๋ช…์€ ์ƒ๋‹นํžˆ ๋ณต์žกํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฐฉ๋ฒ•์„ SRP๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„๋ ค๋Š” ์‹œ๋„์ด๋ฉฐ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

ํ˜•์‹์ฃผ์˜.

์ด์ œ ์ˆ ์— ์ทจํ•œ ์‚ฌ๋žŒ์„ ๋‚ด๋ฒ„๋ ค ๋‘˜ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ๋ˆˆ๋ฌผ์„ ๋‹ฆ์•„์ฃผ์„ธ์š”. ์–ธ์  ๊ฐ€๋Š” ๊ผญ ๋‹ค์‹œ ๋Œ์•„์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์ด ๊ธฐ์‚ฌ์—์„œ ์–ป์€ ์ง€์‹์„ ๊ณต์‹ํ™”ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ˜•์‹์ฃผ์˜ 1. SRP์˜ ์ •์˜

  1. ๊ฐ ์š”์†Œ๊ฐ€ ํ•œ ๊ฐ€์ง€๋ฅผ ๋‹ด๋‹นํ•˜๋„๋ก ์š”์†Œ๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  2. ์ฑ…์ž„์€ โ€œ๋ณ€ํ™”์˜ ์ด์œ โ€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ ์š”์†Œ์—๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ ์ธก๋ฉด์—์„œ ๋ณ€๊ฒฝ ์ด์œ ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋Œ€ํ•œ ์ž ์žฌ์ ์ธ ๋ณ€๊ฒฝ. ํ˜„์ง€ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ์š”์†Œ๋Š” ๊ทผ์ฒ˜์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜•์‹์ฃผ์˜ 2. ํ•„์š”ํ•œ ์ž์ฒด ํ…Œ์ŠคํŠธ ๊ธฐ์ค€.

SRP๋ฅผ ์ดํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ถฉ๋ถ„ํ•œ ๊ธฐ์ค€์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•„์š”ํ•œ ์กฐ๊ฑด์ด ์žˆ์Šต๋‹ˆ๋‹ค:

1) ์ด ํด๋ž˜์Šค/๋ฉ”์„œ๋“œ/๋ชจ๋“ˆ/์„œ๋น„์Šค๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์Šค์Šค๋กœ์—๊ฒŒ ๋ฌผ์–ด๋ณด์„ธ์š”. ๊ฐ„๋‹จํ•œ ์ •์˜๋กœ ๋Œ€๋‹ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ( ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๋ธŒ๋ผ์ดํ† ๋ฆฌ )

์„ค๋ช…

๊ทธ๋Ÿฌ๋‚˜ ๋•Œ๋กœ๋Š” ๊ฐ„๋‹จํ•œ ์ •์˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

2) ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ตœ์†Œ ํŒŒ์ผ/ํด๋ž˜์Šค ์ˆ˜๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์„ค๋ช…

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

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋Š” ์ด์ „ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ์ƒˆ๋กœ์šด UI ์ปจํŠธ๋กค์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด 10๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ์™€ 15๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋„ˆ๋ฌด ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

3) ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ‘ํ•ฉ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ, ์ฆ‰ ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์ผํ•œ ํŒŒ์ผ/ํด๋ž˜์Šค๋ฅผ ๋™์‹œ์— ๋ณ€๊ฒฝํ•  ๊ฐ€๋Šฅ์„ฑ์€ ์ตœ์†Œํ™”๋ฉ๋‹ˆ๋‹ค.

์„ค๋ช…

์ƒˆ๋กœ์šด ์ž‘์—… "ํ…Œ์ด๋ธ” ์•„๋ž˜์— ๋ณด๋“œ์นด ๋ถ“๊ธฐ"๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๋กœ๊ฑฐ, ๋งˆ์‹œ๊ณ  ๋ถ“๋Š” ์ž‘์—…์— ์˜ํ–ฅ์„ ์ฃผ์–ด์•ผ ํ•œ๋‹ค๋ฉด ์ฑ…์ž„์ด ์‚๋šค๊ฒŒ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์ด ํ•ญ์ƒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ด ์ˆ˜์น˜๋ฅผ ์ค„์ด๋„๋ก ๋…ธ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4) ๊ฐœ๋ฐœ์ž๋‚˜ ๊ด€๋ฆฌ์ž๋กœ๋ถ€ํ„ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์งˆ๋ฌธ์„ ๋ฐ›์œผ๋ฉด ์—„๊ฒฉํ•˜๊ฒŒ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค/ํŒŒ์ผ๋กœ ์ด๋™ํ•˜์—ฌ ๊ฑฐ๊ธฐ์—์„œ๋งŒ ์ •๋ณด๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์„ค๋ช…

๊ธฐ๋Šฅ, ๊ทœ์น™ ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ๊ฐ ํ•œ ๊ณณ์— ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ๋˜๋ฉฐ ์ฝ”๋“œ ๊ณต๊ฐ„ ์ „์ฒด์— ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ํฉ์–ด์ ธ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

5) ์ด๋ฆ„์ด ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

์„ค๋ช…

์šฐ๋ฆฌ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ๋Š” ํ•œ ๊ฐ€์ง€ ์ผ์„ ๋‹ด๋‹นํ•˜๋ฉฐ, ๊ทธ ์ฑ…์ž„์€ ์ด๋ฆ„์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

AllManagersManagerService - God ํด๋ž˜์Šค์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
LocalPayment - ์•„๋งˆ๋„ ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜•์‹์ฃผ์˜ 3. Occam ์šฐ์„  ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก .

๋””์ž์ธ ์ดˆ๊ธฐ์— ์›์ˆญ์ด ๋‚จ์ž๋Š” ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๋ชจ๋“  ๋ฏธ๋ฌ˜ํ•จ์„ ๋ชจ๋ฅด๊ณ  ๋Š๋ผ์ง€ ๋ชปํ•˜์—ฌ ์‹ค์ˆ˜๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹ค์ˆ˜๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์„œ๋กœ ๋‹ค๋ฅธ ์ฑ…์ž„์„ ๋ณ‘ํ•ฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋„ˆ๋ฌด ํฌ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ํ•˜๋‚˜์˜ ์ฑ…์ž„์„ ๋‹ค์–‘ํ•œ ์œ ํ˜•์œผ๋กœ ๋‚˜๋ˆ„์–ด ์žฌ๊ตฌ์„ฑ
  • ์ฑ…์ž„์˜ ๊ฒฝ๊ณ„๋ฅผ ์ž˜๋ชป ์ •์˜ํ•จ

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

์ด์ œ ํ•˜๋ฃจ๋ผ๊ณ  ํ•  ์‹œ๊ฐ„์ด์•ผ

SRP์˜ ๋ฒ”์œ„๋Š” OOP์™€ SOLID์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฉ”์„œ๋“œ, ํ•จ์ˆ˜, ํด๋ž˜์Šค, ๋ชจ๋“ˆ, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋ฐ ์„œ๋น„์Šค์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” "figax-figax-and-prod" ๋ฐ "๋กœ์ผ“ ๊ณผํ•™" ๊ฐœ๋ฐœ ๋ชจ๋‘์— ์ ์šฉ๋˜์–ด ๋ชจ๋“  ๊ณณ์—์„œ ์„ธ์ƒ์„ ์กฐ๊ธˆ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ด๊ฒƒ์ด ๊ฑฐ์˜ ๋ชจ๋“  ๊ณตํ•™์˜ ๊ธฐ๋ณธ ์›๋ฆฌ์ด๋‹ค. ๊ธฐ๊ณ„ ์—”์ง€๋‹ˆ์–ด๋ง, ์ œ์–ด ์‹œ์Šคํ…œ ๋ฐ ์‹ค์ œ๋กœ ๋ชจ๋“  ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์€ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ตฌ์ถ•๋˜๋ฉฐ "๊ณผ์†Œ ๋‹จํŽธํ™”"๋Š” ์„ค๊ณ„์ž์˜ ์œ ์—ฐ์„ฑ์„ ๋ฐ•ํƒˆํ•˜๊ณ  "๊ณผ๋„ํ•œ ๋‹จํŽธํ™”"๋Š” ์„ค๊ณ„์ž์˜ ํšจ์œจ์„ฑ์„ ๋ฐ•ํƒˆํ•˜๋ฉฐ ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋Š” ์ด์„ฑ๊ณผ ๋งˆ์Œ์˜ ํ‰ํ™”๋ฅผ ๋ฐ•ํƒˆํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ผ ์ฑ…์ž„ ์›์น™. ๋ณด์ด๋Š” ๊ฒƒ๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‹ค

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

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€