์๊ธ: https://blog.cleancoder.com/uncle-bob/2014/05/08/SingleReponsibilityPrinciple.html
๐ ๋ฒ์ญ์ด ํ๋ฆด ์ ์์ผ๋ฉฐ, ์์์ ์ผ๋ก ๋ถํ์ํ๊ฒ ์ฌ๊ฒจ์ง๋ ๋ถ๋ถ์ ์ ์ธํ์ต๋๋ค.
๋ณธ๋ฌธ
1972๋ , David L. Parnas๋ <On the Criteria To Be Used in Decomposing Systems into Modules> ๋ ผ๋ฌธ์ ์ถ๊ฐํ๋ค. ๋ ผ๋ฌธ์ ๋ง์ง๋ง์์ ๊ทธ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๋ก ์ ๋ด๋ฆฐ๋ค.
์ฐ๋ฆฌ๋ ํ๋ก์ฐ์ฐจํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์คํ ์ ๋ชจ๋๋ก ๋ถํดํ๋ ๊ณผ์ ์ ์์ํ๋ ๊ฒ์ด ์๋ชป๋์๋ค๊ณ ์ฃผ์ฅํด์๋ค. ๋์ ์ด๋ ต๊ฑฐ๋ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ์ค๊ณ ๊ฒฐ์ ๋ชฉ๋ก์ผ๋ก๋ถํฐ ์์ํ ๊ฒ์ ์ ์ํ๋ค. ๊ฐ ๋ชจ๋์ ๋ค๋ฅธ ๋ชจ๋๋ก๋ถํฐ ๊ทธ๋ฌํ ๊ฒฐ์ ์ ์จ๊ธฐ๋๋ก ์ค๊ณ๋์ด์ผ ํ๋ค.
๋๋ ๋ง์ง๋ง ๋ ๋ฌธ์ฅ์ ํนํ ๊ณต๊ฐํ๋ค. Parnas๋ ๋ชจ๋์ด ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ๋ถ๋ฆฌ๋์ด์ผ ํ๋ค๊ณ ๋งํ๋ค.
2๋ ์ด ์ง๋๊ณ , Edsger Dijkstra๋ <On the role of scientific thought> ๋ ผ๋ฌธ์ ์ผ์ผ๋ฉฐ ๊ทธ ์์์ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ผ๋ ์ฉ์ด๋ฅผ ์๊ฐํ๋ค. 1970๋ ๋ ๋ฐ 80๋ ๋์๋ ์ํํธ์จ์ด ์ํคํ ์ฒ์ ์์น์ ๋ํด ํ๋ฐํ๊ฒ ์๋ ผ๋๋ ์๊ธฐ์ด๋ค. ๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ๊ณผ ์ค๊ณ๋ ์์ฒญ๋ ์ธ๊ธฐ๋ฅผ ๋์๋ค. ๊ทธ ๋น์ ๊ฒฐํฉ๋์ ์์ง๋์ด๋ผ๋ ๊ฐ๋ ์ Larry Constantine์ ์ํด ์๊ฐ๋์๊ณ , ๋ง์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ์ํด ๋ฐ์ ๋์๋ค.
1990๋ ๋ ํ๋ฐ์, ๋๋ ์ด๋ฌํ ๊ฐ๋ ๋ค์ ํ๋์ ์์น์ผ๋ก ํตํฉํ๊ณ ์ถ์๋ค. ์ด๊ฒ์ด The Single Responsibility Principle(SRP, ๋จ์ผ ์ฑ ์ ์์น)์ด๋ค.
SRP๋ ์ํํธ์จ์ด ๋ชจ๋์ด ๊ฐ๊ฐ ์ค์ง ํ๋์ ๋ณ๊ฒฝํด์ผํ ์ด์ ๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค๊ณ ๋งํ๋ค. ์ด๊ฒ์ Parnas์ ์ฃผ์ฅ๊ณผ๋ ๋ง๋ฌผ๋ฆฌ๋ ์ข์ ์์น์ผ๋ก ๋ณด์ด๋, ํ๋์ ์๋ฌธ์ ์ผ๊ธฐํ๋ค. "๋ฌด์์ด ๋ณ๊ฒฝ์ ์ด์ ๋ฅผ ์ ์ํ๋๊ฐ?"
๋๊ตฐ๊ฐ๋ ๋ฒ๊ทธ ์์ ์ด ๋ณ๊ฒฝ์ ์ด์ ๋ก ๊ฐ์ฃผ๋๋์ง ๊ถ๊ธํดํ๋ค. ๋ค๋ฅธ ๋๊ตฐ๊ฐ๋ ๋ฆฌํฉํ ๋ง์ด ๋ณ๊ฒฝ์ ์ด์ ๊ฐ ๋๋ ์ง ๊ถ๊ธํดํ๋ค. ์ด๋ "๋ณ๊ฒฝํ ์ด์ "์ "์ฑ ์"์ ๋ฌถ์ด ์ค๋ช ํ ์ ์๋ค.
ํ์คํ, ์ฝ๋๋ ๋ฒ๊ทธ ์์ ์ด๋ ๋ฆฌํฉํ ๋ง์ ๋ํ ์ฑ ์์ ์ง์ง ์๋๋ค. ๊ทธ๊ฒ๋ค์ ํ๋ก๊ทธ๋จ์ด ์๋ ๊ฐ๋ฐ์์ ์ฑ ์์ด๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ฌํ ์ํฉ์์ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ง ์ฑ ์์ ๋ฌด์์ธ๊ฐ? ๋ค์ ์๊ธฐํ์๋ฉด, "ํ๋ก๊ทธ๋จ์ ์ค๊ณ๋ ๋๊ตฌ์๊ฒ ์๋ตํด์ผ ํ๋๊ฐ?"
์ผ๋ฐ์ ์ธ ๋น์ฆ๋์ค ์กฐ์ง์ ๋ ์ฌ๋ ค๋ณด์. ๊ผญ๋๊ธฐ์๋ CEO๊ฐ ์๋ค. CEO์๊ฒ ๋ณด๊ณ ํ๋ ๊ฒ์ C-๋ ๋ฒจ์ ์์๋ค(CFO, COO, CTO...)์ด๋ค. CFO๋ ํ์ฌ์ ์ฌ์ ์ ์กฐ์ ํด์ผ ํ ์ฑ ์์ด ์๋ค. COO๋ ํ์ฌ์ ์ด์์ ๊ด๋ฆฌํด์ผ ํ ์ฑ ์์ด ์๋ค. ๊ทธ๋ฆฌ๊ณ CTO๋ ํ์ฌ์ ๊ธฐ์ ์ ์ธํ๋ผ์ ๊ฐ๋ฐ์ ์ฑ ์์ด ์๋ค.
์ด ์ํฉ์ ์๋ฐ ์ฝ๋๋ก ๋ํ๋ด๋ณด์.
public class Employee {
public Money calculatePay();
public void save();
public String reportHours();
}
- calculatePay ๋ฉ์๋๋ ํน์ ์ง์์ ๊ธ์ฌ๋ฅผ ์ผ๋ง๋ ์ง๊ธํ ์ง ๊ทธ ์ฌ๋์ ๊ณ์ฝ, ์ํ, ๊ทผ๋ฌด ์๊ฐ ๋ฑ์ ๋ฐ๋ผ ๊ฒฐ์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ค.
- save ๋ฉ์๋๋ Employee ๊ฐ์ฒด์ ์ํด ๊ด๋ฆฌ๋๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ค.
- reportHours ๋ฉ์๋๋ ์ง์๋ค์ด ์ ์ ํ ๊ทผ๋ฌด ์๊ฐ ๋์ ์ผํ๊ณ ๋ณด์ ๋ํ ์ ์ ํ๊ฒ ๋ฐ๋์ง ํ์ธํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ณด๊ณ ์์ ์ถ๊ฐ๋ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
CEO์๊ฒ ๋ณด๊ณ ํ๋ C-๋ ๋ฒจ์ ์์๋ค ์ค ๋๊ฐ calculatePay ๋ฉ์๋์ ํ๋์ ๋ช ์ํ ์ฑ ์์ด ์๋๊ฐ? ์ด ๋ฉ์๋๊ฐ ์ฌ๊ฐํ๊ฒ ์๋ชป ๋ช ์๋์ด ์์ผ๋ฉด ํด๊ณ ๋ ์์์ด ๋๊ตฌ์ธ๊ฐ? ๋น์ฐํ CFO์ด๋ค. ํ์ฌ ์ง์๋ค์ ๊ธ์ฌ๋ฅผ ๋ช ์ํ๋ ๊ฒ์ ๊ธ์ต์ ์ธ ์ฑ ์์ด๋ค. ๋ง์ฝ ๋ชจ๋ ์ง์๋ค์ด CFO ๋ถ์์ ์ํ ๋๊ตฐ๊ฐ๊ฐ calculatePay ๋ฉ์๋์ ์๋ชป ๋ช ์ํ ๊ท์น์ผ๋ก ์ธํด ๋ ๋ฐฐ์ ์ฐ๋ด์ ๋ฐ์๋ค๋ฉด, CFO๋ ํด๊ณ ๋ ๊ฒ์ด๋ค.
๋ค๋ฅธ C-๋ ๋ฒจ ์์์ reportHours ๋ฉ์๋์์ ๋ฐํ๋๋ ๋ฌธ์์ด์ ๋ด์ฉ๊ณผ ํ์์ ๋ช ์ํ ์ฑ ์์ด ์๋ค. ํด๋น ์์์ ๊ฐ์ฌ์๊ณผ ๊ฒํ ์๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์ด๊ฒ์ ์ด์ ์ฑ ์์ด๋ค. ๋ฐ๋ผ์ ๋ณด๊ณ ์์ ์ฌ๊ฐํ๊ฒ ์๋ชป ๋ช ์๋ ๋ด์ฉ์ด ์๋ค๋ฉด COO๋ ํด๊ณ ๋ ๊ฒ์ด๋ค.
๋ง์ง๋ง์ผ๋ก save ๋ฉ์๋์ ์ฌ๊ฐํ๊ฒ ์๋ชป๋ ๋ด์ฉ์ด ์์ผ๋ฉด ์ด๋ ํ C-๋ ๋ฒจ ์์์ด ํด๊ณ ๋ ์ง๋ ๋ช ๋ฐฑํ๋ค. ๋ง์ฝ ๊ธฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋์ฐํ๊ฒ๋ ์ด ๋๋ฌธ์ ์์๋๋ค๋ฉด CTO๋ ํด๊ณ ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ calcuatePay ๋ฉ์๋ ๋ด๋ถ์ ์๊ณ ๋ฆฌ์ฆ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด, ๊ทธ๋ฐ ๋ณ๊ฒฝ์ ๋ํ ์์ฒญ์ CFO๊ฐ ์ด๋๋ ๋ถ์์์ ์ผ์ด๋ ๊ฒ์ด๋ค. COO์ CTO๊ฐ ์ด๋๋ ๋ถ์์์๋ ๋น์ทํ๊ฒ reportHours์ save ๋ฉ์๋์ ๋ณ๊ฒฝ์ ๋ํ ์์ฒญ์ด ์ผ์ด๋ ๊ฒ์ด๋ค.
์ด ๋ SRP์ ํต์ฌ์ผ๋ก ๋ค๊ฐ๊ฐ๋ค. ์ด ์์น์ ์ฌ๋์ ๊ดํ ๊ฒ์ด๋ค.
๋น์ ์ ์ํํธ์จ์ด ๋ชจ๋์ ๊ฐ๋ฐํ ๋ ๋ณํ๊ฐ ์ผ์ด๋๋ฉด ๊ทธ ๋ณํ๋ ์ค์ง ํ๋์ ์ฌ๋, ํน์ ํ๋์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋ ์กฐ์ง์์๋ง ์ผ์ด๋๊ธฐ๋ฅผ ์ํ๋ค. ๋น์ ์ ๋ชจ๋์ ์กฐ์ง ์ ์ฒด์ ๋ณต์ก์ฑ์์ ๋ถ๋ฆฌ์ํค๊ณ , ๊ฐ์์ ๋ชจ๋์ด ๊ทธ์ ํ๋์ ๋น์ฆ๋์ค ๊ธฐ๋ฅ์ ๋ํ ์๊ตฌ์๋ง ์ฑ ์์ ์ง๋๋ก ์์คํ ์ ์ค๊ณํ๊ธฐ๋ฅผ ์ํ๋ค.
์๋๊ณ ? ์ฐ๋ฆฌ๋ CTO๊ฐ ์๊ตฌํ ๋ณ๊ฒฝ ์ฌํญ ๋๋ฌธ์ COO๊ฐ ํด๊ณ ๋๋ ์ผ์ ๋ง๊ณ ์ถ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฐ๋ฆฌ์ ๊ณ ๊ฐ๊ณผ ๋งค๋์ ๋ค ๊ด์ ์์, ๊ทธ๋ค์ด ์์ฒญํ ๋ณ๊ฒฝ ์ฌํญ๊ณผ๋ ์์ ํ ๊ด๊ณ ์๋ ๊ณณ์์ ํ๋ก๊ทธ๋จ์ด ๊ณ ์ฅ๋ฌ๋ค๋ ๊ฑธ ๋ฐ๊ฒฌํ๋ ๊ฒ๋ณด๋ค ๋ฌด์์ด ๊ฒ ์๋ค. ๋ง์ฝ ๋น์ ์ด calculatePay ๋ฉ์๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด์ ์ฐ์ฐํ reportHours ๋ฉ์๋๋ฅผ ๋ง๊ฐํธ๋ฆฐ๋ค๋ฉด, COO๋ ๋น์ ์๊ฒ ์ ๋๋ก calculatePay ๋ฉ์๋๋ฅผ ๋ค์๋ ๋ณ๊ฒฝํ์ง ๋ง ๊ฒ์ ์๊ตฌํ ๊ฒ์ด๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ JSP ํ์ผ์ SQL์ ๋ฃ์ง ์๋ ์ด์ ๋ค. ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ฐํ๋ ๋ชจ๋์ HTML ์ฝ๋๋ฅผ ์์ฑํ์ง ์๋ ์ด์ ๋ฉฐ, ๋น์ฆ๋์ค ๊ท์น์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ๋ชฐ๋ผ์ผ ํ๋ ์ด์ ๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๋ ์ด์ ๋ค.
SRP๋ฅผ ๋ค๋ฅด๊ฒ ์ ์ํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๊ฐ์ ์ด์ ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ๋ค์ ํ๋๋ก ๋ชจ์๋ผ. ๋ค๋ฅธ ์ด์ ๋ก ๋ณ๊ฒฝ๋ ๊ฒ๋ค์ ๋๋์ด๋ผ.
๋น์ ์ ์ด์ SRP๊ฐ ๊ทธ์ ์์ง๋๊ณผ ๊ฒฐํฉ๋๋ฅผ ์ ์ํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด๋ผ๋ ๊ฒ์ ๊นจ๋ฌ์์ ๊ฒ์ด๋ค. ์ฐ๋ฆฌ๋ ๊ฐ์ ์ด์ ๋ก ์ธํด ๋ณ๊ฒฝ๋๋ ๊ฒ๋ค ์ฌ์ด์ ์์ง๋๋ฅผ ๋์ด๊ณ ์ถ์ดํ๋ฉฐ, ๋ค๋ฅธ ์ด์ ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ๋ค ์ฌ์ด์ ๊ฒฐํฉ๋๋ ๋ฎ์ถ๊ณ ์ถ์ดํ๋ค.
ํ์ง๋ง ๋น์ ์ด ์ด ์์น์ ๋ํด ์๊ฐํ ๋, ๋ณ๊ฒฝ๋๋ ์ด์ ๋ ์ฌ๋์ด๋ผ๋ ๊ฑธ ๊ธฐ์ตํด๋ผ. ๋ณ๊ฒฝ์ ์์ฒญํ๋ ๊ฑด ์ฌ๋์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ ๋ง์ ์ฌ๋๋ค์ด ๋ค๋ฅธ ์ด์ ๋ค๋ก ๊ด์ฌ์ ๊ฐ๋ ์ฝ๋๋ฅผ ํ๋๋ก ์์ด, ๊ทธ ์ฌ๋๋ค ํน์ ์์ ์ ํผ๋์ค๋ฝ๊ฒ ๋ง๋ค๊ณ ์ถ์ง ์๋๋ค.