๋จ์ผ ์ฑ
์ ์์น, ๋จ์ผ ์ฑ
์ ์์น์ด๋ผ๊ณ ๋ ํฉ๋๋ค.
์ผ๋ช
๊ท ์ผ ๊ฐ๋ณ์ฑ์ ์๋ฆฌ - ์ดํดํ๊ธฐ ๋งค์ฐ ๋ฏธ๋๋ฝ๊ณ ํ๋ก๊ทธ๋๋จธ ์ธํฐ๋ทฐ์์ ๋งค์ฐ ๊ธด์ฅ๋ ์ง๋ฌธ์
๋๋ค.
์ด ์๋ฆฌ์ ๋ํ ๋์ ์ฒซ ๋ฒ์งธ ์ง์งํ ์ง์ธ์ ์ฒซํด ์ด์ ์ด๋ฆฐ ๋ น์ ์ฌ๋๋ค์ด ์ ๋ฒ๋ ์์ ํ์, ์ฆ ์ค์ ํ์์ ๋ง๋ค๊ธฐ ์ํด ์ฒ์ผ๋ก ๋๋ ค ๊ฐ์ ๋ ์ผ์ด๋ฌ์ต๋๋ค.
์ฒ์์์ ์ฐ๋ฆฌ๋ 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์ ์ ์
- ๊ฐ ์์๊ฐ ํ ๊ฐ์ง๋ฅผ ๋ด๋นํ๋๋ก ์์๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค.
- ์ฑ ์์ โ๋ณํ์ ์ด์ โ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ, ๊ฐ ์์์๋ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ ์ธก๋ฉด์์ ๋ณ๊ฒฝ ์ด์ ๊ฐ ํ๋๋ง ์์ต๋๋ค.
- ๋น์ฆ๋์ค ๋ก์ง์ ๋ํ ์ ์ฌ์ ์ธ ๋ณ๊ฒฝ. ํ์งํํด์ผ ํฉ๋๋ค. ๋๊ธฐ์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ ์์๋ ๊ทผ์ฒ์ ์์ด์ผ ํฉ๋๋ค.
ํ์์ฃผ์ 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