12์ฅ ์ฐฝ๋ฐ์ฑ
์ฐฝ๋ฐ์ฑ์ด๋?
ํ์ ์ฒด๊ณ๋ก๋ถํฐ ์๊ฒจ๋์ง๋ง, ๊ทธ ํ์ ์ฒด๊ณ๋ก ํ์๋์ง ์๋ ์์ฑ
1. ์ฐฝ๋ฐ์ ์ค๊ณ๋ก ๊น๋ํ ์ฝ๋๋ฅผ ๊ตฌํํ์
- ๋ชจ๋ ํ ์คํธ๋ฅผ ์คํํ๋ค.
- ์ค๋ณต์ ์์ค๋ค.
- ํ๋ก๊ทธ๋๋จธ ์๋๋ฅผ ํํํ๋ค.
- ํด๋์ค์ ๋ฉ์๋ ์๋ฅผ ์ต์๋ก ์ค์ธ๋ค.
์ ๋ค ๊ฐ์ง ๊ท์น์ ์ฐฉ์คํ๊ฒ ๋ฐ๋ฅด๊ธฐ๋ง ํ๋ฉด
- ์ฐ์ํ ์ค๊ณ๊ฐ ๋์ค๊ณ
- ์ฝ๋ ๊ตฌ์กฐ์ ์ค๊ณ๋ฅผ ํ์ ํ๊ธฐ ์ฝ๊ณ
- SRP(๋จ์ผ ์ฑ ์ ์์น)๋ DIP(์์กด ๊ด๊ณ ์ญ์ ์์น)์ ๊ฐ์ ์์น์ ์ ์ฉํ๊ธฐ ์ฝ๊ณ
- ์ฐฝ๋ฐ์ฑ์ ์ด์งํ๋ค.
2. ๋จ์ํ ์ค๊ณ ๊ท์น 1 : ๋ชจ๋ ํ ์คํธ๋ฅผ ์คํํ๋ผ
๋ฌด์๋ณด๋ค ๋จผ์ , ์ค๊ณ๋ ์๋ํ ๋๋ก ๋์๊ฐ๋ ์์คํ ์ ๋ด๋์์ผ ํ๋ค.
๋ฌธ์๋ก๋ ์์คํ ์ ์๋ฒฝํ๊ฒ ์ค๊ณํ์ง๋ง ์์คํ ์ด ์๋ํ ๋๋ก ๋์๊ฐ๋์ง ๊ฒ์ฆํ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด
๋ฌธ์ ์์ฑ์ ์ํด ํฌ์ํ ๋ ธ๋ ฅ์ ๋ํ ๊ฐ์น๋ ์ธ์ ๋ฐ๊ธฐ ํ๋ค๋ค.
ํ ์คํธ๊ฐ ๊ฐ๋ฅํ ์์คํ ์ ๋ง๋ค๋ ค๊ณ ์ ์ฐ๋ฉด ์ค๊ณ ํ์ง์ด ๋๋ถ์ด ๋์์ง๋ค.
- ํฌ๊ธฐ๊ฐ ์๊ณ ๋ชฉ์ ํ๋๋ง ์ํํ๋ ํด๋์ค๊ฐ ๋์จ๋ค. (SRP)
- ๊ฒฐํฉ๋๊ฐ ๋์ผ๋ฉด ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์์กด์ฑ ์ฃผ์ , ์ธํฐํ์ด์ค ์ถ์ํ ๋ฑ๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ค.
๋๋๊ฒ๋ "ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋ค๊ณ ๊ณ์ ๋๋ ค๋ผ"๋ผ๋ ๊ฐ๋จํ๊ณ ๋จ์ํ ๊ท์น์ ๋ฐ๋ฅด๋ฉด
์์คํ ์ ๋ฎ์ ๊ฒฐํฉ๋์ ๋์ ์์ง๋ ฅ์ด๋ผ๋ ๊ฐ์ฒด ์งํฅ ๋ฐฉ๋ฒ๋ก ์ด ์งํฅํ๋ ๋ชฉํ๋ฅผ ์ ์ ๋ก ๋ฌ์ฑํ๋ค.
3. ๋จ์ํ ์ค๊ณ ๊ท์น 2~4 : ๋ฆฌํฉํฐ๋ง
ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ชจ๋ ์์ฑํ๋ค๋ฉด ์ด์ ์ฝ๋๋ฅผ ์ ์ง์ ์ผ๋ก ๋ฆฌํฉํฐ๋ง ํด๋๊ฐ๋ค.
์ฝ๋ ๋ช ์ค์ ์ถ๊ฐํ ๋๋ง๋ค ์ ์ ๋ฉ์ถ๊ณ ์ค๊ณ๋ฅผ ์กฐ๊ฐํ๋ค.
ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ ์ฝ๋๋ฅผ ์ ๋ฆฌํ๋ฉด์ ์์คํ ์ด ๊นจ์ง๊น ๊ฑฑ์ ํ ํ์๋ ์๋ค.
๋ฆฌํฉํฐ๋ง ๋จ๊ณ์์๋ ์ํํธ์จ์ด ์ค๊ณ ํ์ง์ ๋์ด๋ ๊ธฐ๋ฒ์ด๋ผ๋ฉด ๋ฌด์์ด๋ ์ ์ฉํด๋ ๊ด์ฐฎ๋ค.
์์ง๋๋ฅผ ๋์ด๊ณ , ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ , ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๊ณ , ์์คํ ๊ด์ฌ์ฌ๋ฅผ ๋ชจ๋๋ก ๋๋๊ณ ,
ํจ์์ ํด๋์ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ , ๋ ๋์ ์ด๋ฆ์ ์ ํํ๋ ๋ฑ ๋ค์ํ ๊ธฐ๋ฒ์ ๋์ํ๋ค.
4. ์ค๋ณต์ ์์ ๋ผ
์ค๋ณต์ ์ถ๊ฐ ์์ , ์ถ๊ฐ ์ํ, ๋ถํ์ํ ๋ณต์ก๋๋ฅผ ๋ปํ๋ค.
๊ตฌํ ์ค๋ณต๋ ์ค๋ณต์ ํ ํํ์ด๋ค.
int size() {}
boolean isEmpty() {}
// size() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ์ฝ๋๋ฅผ ์ค๋ณตํด ๊ตฌํํ ํ์๊ฐ ์๋ค.
boolean isEmpty(){
return 0 == size();
}
๊น๋ํ ์์คํ ์ ๋ง๋ค๋ ค๋ฉด ๋จ ๋ช ์ค์ด๋ผ๋ ์ค๋ณต์ ์ ๊ฑฐํ๊ฒ ๋ค๋ ์์ง๊ฐ ํ์ํ๋ค.
์๊ท๋ชจ ์ฌ์ฌ์ฉ์ ์์คํ ๋ณต์ก๋๋ฅผ ๊ทน์ ์ผ๋ก ์ค์ฌ์ฃผ๊ณ ์๊ท๋ชจ ์ฌ์ฌ์ฉ์ ์ ๋๋ก ์ตํ์ผ ๋๊ท๋ชจ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
1) Template Method ํจํด
๊ณ ์ฐจ์ ์ค๋ณต์ ์ ๊ฑฐํ ๋ชฉ์ ์ผ๋ก ์์ฃผ ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ด๋ค.
public class VacationPolicy {
public void accrueUSDDivisionVacation() {
// ์ง๊ธ๊น์ง ๊ทผ๋ฌดํ ์๊ฐ์ ๋ฐํ์ผ๋ก ํด๊ฐ ์ผ์๋ฅผ ๊ณ์ฐํ๋ ์ฝ๋
// ...
// ํด๊ฐ ์ผ์๊ฐ ๋ฏธ๊ตญ ์ต์ ๋ฒ์ ์ผ์๋ฅผ ๋ง์กฑํ๋์ง ํ์ธํ๋ ์ฝ๋
// ...
// ํด๊ฐ ์ผ์๋ฅผ ๊ธ์ฌ ๋์ฅ์ ์ ์ฉํ๋ ์ฝ๋
// ...
}
public void accrueEUDivisionVacation() {
// ์ง๊ธ๊น์ง ๊ทผ๋ฌดํ ์๊ฐ์ ๋ฐํ์ผ๋ก ํด๊ฐ ์ผ์๋ฅผ ๊ณ์ฐํ๋ ์ฝ๋
// ...
// ํด๊ฐ ์ผ์๊ฐ ์ ๋ฝ์ฐํฉ ์ต์ ๋ฒ์ ์ผ์๋ฅผ ๋ง์กฑํ๋์ง ํ์ธํ๋ ์ฝ๋
// ...
// ํด๊ฐ ์ผ์๋ฅผ ๊ธ์ฌ ๋์ฅ์ ์ ์ฉํ๋ ์ฝ๋
// ...
}
}
// ์ต์ ๋ฒ์ ์ผ์๋ฅผ ๊ณ์ฐํ๋ ์ฝ๋๋ง ์ ์ธํ๋ฉด ๋ ๋ฉ์๋๋ ๊ฑฐ์ ๋์ผํ๋ค.
// template method ํจํด์ ์ ์ฉํด ์ค๋ณต์ ์ ๊ฑฐํ์
abstract public class VacationPolicy {
public void accrueVacation() {
caculateBseVacationHours();
alterForLegalMinimums();
applyToPayroll();
}
private void calculateBaseVacationHours() { /* ... */ };
abstract protected void alterForLegalMinimums();
private void applyToPayroll() { /* ... */ };
}
public class USVacationPolicy extends VacationPolicy {
@Override protected void alterForLegalMinimums() {
// ๋ฏธ๊ตญ ์ต์ ๋ฒ์ ์ผ์๋ฅผ ์ฌ์ฉํ๋ค.
}
}
public class EUVacationPolicy extends VacationPolicy {
@Override protected void alterForLegalMinimums() {
// ์ ๋ฝ์ฐํฉ ์ต์ ๋ฒ์ ์ผ์๋ฅผ ์ฌ์ฉํ๋ค.
}
}
5. ํํํ๋ผ
์์ ์ด ์ดํดํ๋ ์ฝ๋๋ฅผ ์ง๊ธฐ๋ ์ฝ๋ค.
ํ์ง๋ง ๋์ค์ ์ฝ๋๋ฅผ ์ ์ง ๋ณด์ํ ์ฌ๋์ด ์ฝ๋๋ฅผ ์ง๋ ์ฌ๋๋งํผ์ด๋ ๋ฌธ์ ๋ฅผ ๊น์ด ์ดํดํ ๊ฐ๋ฅ์ฑ์ ํฌ๋ฐํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ฝ๋๋ ๊ฐ๋ฐ์์ ์๋๋ฅผ ๋ถ๋ช ํ ํํํด์ผ ํ๋ค.
๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ๋ช ๋ฐฑํ๊ฒ ์งค์๋ก ๋ค๋ฅธ ์ฌ๋์ด ๊ทธ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฌ์์ง๋ค.
๊ทธ๋์ผ ๊ฒฐํจ์ด ์ค์ด๋ค๊ณ ์ ์ง๋ณด์ ๋น์ฉ์ด ์ ๊ฒ ๋ ๋ค.
- ์ข์ ์ด๋ฆ: ํด๋์ค๋ ํจ์์ ์ด๋ฆ์ด ๊ธฐ๋ฅ๊ณผ ์์ ๋ดํ์ด๋ฉด ์ ๋๋ค.
- ์์ ํฌ๊ธฐ์ ํด๋์ค์ ํจ์: ์์ ํด๋์ค์ ํจ์๋ ์ด๋ฆ ์ง๊ธฐ๋ ์ฝ๊ณ ๊ตฌํํ๊ธฐ๋ ์ฝ๊ณ ์ดํดํ๊ธฐ๋ ์ฝ๋ค.
- ํ์ค ๋ช ์นญ ์ฌ์ฉ: ๋์์ธ ํจํด์ ์์ฌ์ํต๊ณผ ํํ๋ ฅ ๊ฐํ๊ฐ ๋ชฉ์ ์ด๋ค. ํด๋์ค๊ฐ Command๋ Visitor์ ๊ฐ์ ํ์ค ํจํด์ ์ฌ์ฉํด ๊ตฌํ๋๋ค๋ฉด ํด๋์ค ์ด๋ฆ์ ํจํด ์ด๋ฆ์ ๋ฃ์ด์ค๋ค.
- ๋จ์ ํ ์คํธ ์ผ์ด์ค ์์ฑ: ํ ์คํธ ์ผ์ด์ค๋ ์์ ๋ก ๋ณด์ฌ์ฃผ๋ ๋ฌธ์์ด๋ค. ์ ๋ง๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ฝ์ด๋ณด๋ฉด ํด๋์ค ๊ธฐ๋ฅ์ด ํ๋์ ๋ค์ด์จ๋ค.
6. ํด๋์ค์ ๋ฉ์๋ ์๋ฅผ ์ต์๋ก ์ค์ฌ๋ผ
ํด๋์ค์ ๋ฉ์๋ ํฌ๊ธฐ๋ฅผ ์ค์ด์๊ณ ์กฐ๊ทธ๋ง ํด๋์ค์ ๋ฉ์๋๋ฅผ ์์์ด ๋ง๋๋ ์ฌ๋ก๋ ์์ง ์๋ค.
๋๋ก๋ ๋ฌด์๋ฏธํ๊ณ ๋ ๋จ์ ์ธ ์ ์ฑ ํ์ ํด๋์ค์ ๋ฉ์๋ ์๊ฐ ๋์ด๋๊ธฐ๋ ํ๋ค.
- ํด๋์ค๋ง๋ค ๋ฌด์กฐ๊ฑด ์ธํฐํ์ด์ค ์์ฑ
- ์๋ฃ ํด๋์ค์ ๋์ ํด๋์ค๋ ๋ฌด์กฐ๊ฑด ๋ถ๋ฆฌ
๊ฐ๋ฅํ ๋ ๋จ์ ์ธ ๊ฒฌํด๋ ๋ฉ๋ฆฌํ๊ณ ์ค์ฉ์ ์ธ ๋ฐฉ์์ ํํ๋ค.
์ด ๊ท์น์ ๊ฐ๋จํ ์ค๊ณ ๊ท์น ๋ค ๊ฐ ์ค ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋ฎ๋ค.
๋ค์ ๋งํด, ํด๋์ค์ ํจ์ ์๋ฅผ ์ค์ด๋ ์์ ๋ ์ค์ํ์ง๋ง ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋ค๊ณ ์ค๋ณต์ ์ ๊ฑฐํ๊ณ ์๋๋ฅผ ํํํ๋ ์์ ์ด ๋ ์ค์ํ๋ค.