[Programming] SOLID - ๊ฐ์ฒด ์งํฅ 5๋ ์ค๊ณ ์์น
์ด๋ฒ ํฌ์คํธ์์๋ ํน์ ์ธ์ด์ ๋ํ ํ์ต์ด ์๋ ํ๋ก๊ทธ๋๋ฐ ์คํฌ์ ๋ํด ์ ์ด๋ณด๊ณ ์ ํฉ๋๋ค.
๋ ์ ์ฌ๋ฌ๋ถ๋ค ์ค Java, C#, Python๊ณผ ๊ฐ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ์๊ณ ๊ณ์ ๋ค๋ฉด OOP(๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ)์ด๋ผ๋ ๋จ์ด๋ฅผ ์ฝ๊ฒ ์ ํด๋ณด์ จ์ ๊ฒ์ ๋๋ค.
OOP (Object Oriented Programming)
OOP๋ ์ฐ๋ฆฌ ๋ง๋ก ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๋ ๋ป์ ๋๋ค. ์ด ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ํค์์ ๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
์ฝ๊ฒ ์๊ธฐํ์๋ฉด ์ฐ๋ฆฌ๊ฐ C ์ธ์ด๋ก ์์ฑ๋์๋ ๋ช ๋ น ํ์์ ์ ์ฐจ ์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ๋ ๋ฌ๋ฆฌ OOP๋ ๊ฐ์ฒด๋ผ๋ ๋ ๋ฆฝ๋ ๋จ์๋ก ํ๋ก๊ทธ๋จ์ ํ์ฑ์ํค๋ ์คํฌ์ ๋๋ค.
์ ์ฐจ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ '์ ์ฐจ'๋ ํจ์๋ฅผ ์๋ฏธํ๋ฉฐ, ๋ฐ๋ณต๋๋ ๋์์ ํจ์ ๋ฐ ํ๋ก์์ ํํ๋ก ๋ชจ๋ํํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ํ๋ก์์ ๋, return ๊ฐ์ด ์๋ ์ฆ, void ํจ์๋ฅผ ์๋ฏธํ๋ฉฐ ๋ํ์ ์ธ ์์๋ก printf๊ฐ ์์ต๋๋ค.
๋ฐ๋ณต๋ ๋์์ ๋ชจ๋ํํ์ฌ ์ฝ๋๋ฅผ ์ค์ผ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ฆ ํ๊ธฐ์ ์ด๊ธด ํ๋, ํ๋ก์์ ์์ฒด๋ก๋ ๊ต์ฅํ ์ถ์์ ์ ๋๋ค. ์๋ฅผ ๋ค๋ฉด, ์ํ์ ๋ฑ๋กํ๊ณ ๊ด๋ฆฌํ๋ ์ฌ๊ณ ๊ด๋ฆฌ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ค๊ณ ์๊ฐํด๋ด ์๋ค.
- '์ํ' ์ด๋ผ๋ ์๋ฃํ์ ๊ตฌํํด์ผ ํจ.
(์ข ๋ฅ๊ฐ ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ์์ฑ์ด ํ์ํ์ง๋ง ํ๋์ ์ํ์ด๋ผ๊ณ ๋ง ์๊ฐํด๋์.) - '์ํ'์ ๋ํ ํจ์๋ฅผ ๊ตฌํํด์ผ ํจ.
(๋ฑ๋ก, ์ญ์ , ์์ ๋ฑ)
์์ ๋ํ ์๊ตฌ์ฌํญ์ ์๊ฐํด๋ดค์ ๋, ์ ์ฐจ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ๋ณด๋ฉด ๊ตฌํํ์ง ๋ชปํ๋ ๊ฒ์ ์๋๋๋ค. ํ์ง๋ง ๋ง์ฝ ๊ตฌํ์ ํด์ผํ๋ค๊ณ ํ๋ค๋ฉด ์ ๋ ์ฌํญ์ ๋ณ๋๋ก ์๊ฐํด์ผ ํ๋ฉฐ ์ํ์ ์ํ์ด๊ณ , ์ํ์ ๋ํ ํจ์๋ ๋ณ๋๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์์ค ์ฝ๋ ๋ด์ ์๋ค ํ๋๋ผ๋ ์ด ์๋ฃํ๊ณผ ํจ์๊ฐ ์ฐ๊ด ๊ด๊ณ๊ฐ ์๋ค๋ผ๋ ๊ฑธ ๋ณด์ฆํ๊ธฐ ์ด๋ ต์ต๋๋ค.
์ฆ, ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ฌถ์ฌ์์ ์ ์๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๋์์ด ์ถ์์ ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํจ๋ฌ๋ค์์ผ๋ก OOP๊ฐ ๋ฑ์ฅํ ๊ฒ์ ๋๋ค.
๊ฐ์ฒด ์งํฅ ์ค๊ณ
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ์๊ตฌ์ฌํญ์ ๋ฐ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์ต๋ํ ์ฅ์ ์ ์ด๋์ด๋ด๊ธฐ ์ํด ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํด์ผ ํ๋ค๋ฉด ์ด๋ป๊ฒ ์ค๊ณํ๋ ๊ฒ์ด ์ข์๊น์?
- ๋จผ์ ์๊ตฌ์ฌํญ(์ ๊ณตํด์ผ ํ ๊ธฐ๋ฅ)์ ์ธ๋ถํ ํฉ๋๋ค.
๊ธฐํ์๋ก๋ถํฐ ๋ฐ์ ์๊ตฌ์ฌํญ์ ์ต๋ํ ์์ธํ๊ฒ ์ ์ ๋ฐ๊ณ ์ด๋ฅผ ์ธ๋ถํ ํ์ฌ ์ ๋ฆฌํด๋์ต๋๋ค. - 1๋ฒ์์ ์ธ๋ถํํ ๋ด์ฉ์ Class Diagram ๋ฑ์ผ๋ก ๊ตฌํํด ๋์ต๋๋ค.
Class Diagram์ ์ฐ๋ฆฌ๊ฐ ์๊ตฌ์ฌํญ์ ๊ฐ์ฒด๋ก ํํํ๊ธฐ ์ํด ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ค๊ณ๋์ ๋๋ค. - ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด์ ์ถ๊ฐํฉ๋๋ค.
Class Diagram์ ๋ค์ด๊ฐ ํ๋ ๋ฑ์ ์ถ๊ฐํ๋ ์์ ์ ์งํํฉ๋๋ค. ํ์์ ๋ฐ๋ผ ์์ ๋กญ๊ฒ ์ถ๊ฐ/์ญ์ ํ ๊ฒ์ ๋๋ค. - 3๋ฒ์์ ์ค๊ณํ ๊ฐ์ฒด๋ค์ ํ๋(ํจ์)์ ๊ตฌํํฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด, ์ํ ์ฌ๊ณ ๊ด๋ฆฌ ํ๋ก๊ทธ๋จ์์๋ ์ํ ์ถ๊ฐ, ์ ๊ฑฐ, ์์ ๋ฑ์ด ์์ ๊ฒ์ ๋๋ค. - ๊ฐ์ฒด ๊ฐ ๋ฉ์๋ ํธ์ถ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค.
์ํ ๊ฐ์ฒด์ ์๋ ๋ฉ์๋๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด์์ ํธ์ถํด์ผ ํ๋ค๋ฉด ๊ทธ ์ ๊ทผ์ ์ด๋ป๊ฒ ํด์ผ ํ ์ง ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
๊ฐ์ฒด ์งํฅ ์ค๊ณ๋ ์ด๋ ๊ฒ ์๊ตฌ์ฌํญ๋ค์ ๊ฐ์ฒด๋ก ์ ์ํ์ฌ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ๊ณ ๊ฐ ๊ฐ์ฒด ์ฌ์ด์ ๊ด๊ณ๋ค์ ๋ช ์ธํ์ฌ ํจ์๋ค์ ๋ํ ์ ๊ทผ๊น์ง๋ฅผ ์ ํ๋ฉด ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ฅ์ ์ ์ต๋ํ ํ์ฉํ ์ ์์ต๋๋ค.
SOLID
SOLID๋ ์ด๋ฌํ ๊ฐ์ฒด ์งํฅ ์ค๊ณ ์์น์ ๋ก๋ฒํธ ๋งํด์ด 5๊ฐ์ง๋ก ์ ์ํ ์์น์ ์ํ๋ฒณ์ ๋ด ๊ฒ์ ๋๋ค.
ํด๋น ์์น์ ๊ฐ์ฅ ํฐ ๋ชฉ์ ์ ์๊ฐ์ด ์ง๋๋ ์ ์ง ๋ณด์์ ํ์ฅ์ด ์ฌ์ด ์์คํ ์ค๊ณ๋ฅผ ํ๊ธฐ ์ํจ์ธ๋ฐ, ์ด๋ ํ ๊ฒ์ธ์ง ์๋์ง ํ๋์ฉ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
SRP (Single Responsibility, ๋จ์ผ ์ฑ ์์ ์์น)
-> ๋ชจ๋ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง์ ๋ถ์ฌ๋ฐ์ผ๋ฉฐ, ๋จ ํ๋์ ์ด์ ๋ง์ ๋ฐํ์ผ๋ก ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค.
์ฐ๋ฆฌ๋ ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํฉ๋๋ค. ์ด ํด๋์ค๊ฐ ์ ๊ณตํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ํด๋์ค๊ฐ ๋ถ์ฌ๋ฐ์ ์ฑ ์์ ๊ธฐ๋ฐํ์ฌ ์์ฑ๋์ด์ผ ํ๋๋ฐ, ์ฌ๊ธฐ์ ์ฑ ์์ด๋ ๋ง์ด ์กฐ๊ธ ๋ชจํธํฉ๋๋ค.
์ฌ๊ธฐ์ ๋งํ๋ ์ฑ ์์ด๋, ํ ํด๋์ค๊ฐ ์ํํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.
๋ง์ฝ ํ๋์ ํด๋์ค๊ฐ ์ํํ ์ ์๋ ๊ธฐ๋ฅ์ด ์ฌ๋ฌ ๊ฐ์ง๋ผ๋ฉด ํด๋์ค ๋ด๋ถ ํจ์๋ผ๋ฆฌ ๊ฐ๊ฒฐํฉ์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ๊ฐ๊ฒฐํฉ์ด ๋ฐ์ํ๋ฉด, ์๋ก์ด ์๊ตฌ ์ฌํญ์ด๋ ํ๋ก๊ทธ๋จ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ํด๋์ค ๋ด๋ถ์ ๋์๋ค์ด ์ฐ์์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ ๋์ฐธ์ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋์ด, ์ ์ง๋ณด์๊ฐ ๋์ฑ ์ด๋ ค์์ง๋๋ค.
์ฝ๋๋ก ์์๋ฅผ ๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
register ํจ์๋ก ์ธํด RegisterService ํด๋์ค๋ ์ํ์ ๋ฑ๋กํ๋ ์ฑ ์(๊ธฐ๋ฅ) ๋ฟ๋ง ์๋๋ผ ์ํ ๋ฑ๋ก์ ํ์ํ ์ํ ์ด๋ฏธ์ง๋ ์ด๋ฆ ๋ฑ์ ๊ฒ์ฆํ๋ ์ฑ ์๋ ์ํํฉ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ํ์ ๋ฑ๋กํ๋ ์ ์ฐจ๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์์ ํด์ผ ๋๊ณ , ์ด๋ฆ ๊ฒ์ฆ ๋ฐฉ๋ฒ์ด๋ ์ด๋ฏธ์ง ๊ฒ์ฆ ๋ฐฉ๋ฒ๋ ๋ฐ๋๋ฉด ์ด ์ญ์ ๊ฐ์ ๊ธฐ๋ฅ์ ์์ ํ๊ฒ ๋๋๋ฐ, ์๋ชป ์์ ํ๋ฉด ๋ฉ์ฉกํ๊ฒ ๋์ํ๋ ๊ธฐ๋ฅ๊น์ง ๋ฌด๋ ฅํ ๋๋ฒ๋ฆฌ๋ ์ํ์ฑ๋ ๋ด์ฌ๋๊ธฐ ๋๋ฌธ์ ๋จ์ผ ์ฑ ์ ์์น์ ์๋ฐ๋ฉ๋๋ค.
๊ฐ ํ๋ผ๋ฏธํฐ์ ๋ํ ๊ฒ์ฆ ์ฑ ์์ ๊ฐ ํ๋ผ๋ฏธํฐ๋ณ ์๋น์ค ํด๋์ค์ ์์ํ๊ณ ์ํ ๋ฑ๋ก์ ์ค์ง ์ํ์ ๋ฑ๋กํ๋ ๊ฒ์๋ง ์ฑ ์์ ์ง๋๋ก ๋ฆฌํฉํ ๋งํ๋ฉด ๋จ์ผ ์ฑ ์์ ์์น์ ์ ์งํฌ ์ ์์ต๋๋ค.
๋ค๋ง ์ฃผ์ํด์ผ ํ ์ ์ด ๋ช ๊ฐ์ง ์์ต๋๋ค.
- ๋จ์ผ ์ฑ ์ ์์น์ ํต์ฌ์ ํด๋์ค์ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ํ๊ธ ํจ๊ณผ๋ฅผ ์ต์ํ ํ๋ ๊ฒ
- ์ ์ฌํญ์ ๋๋ฌด ์ง์ฐฉํ์ฌ ์๊ฒฉํ๊ฒ ์์น์ ์ค์ํ๋ ๊ฑธ ๊ฐ์ํ๋ ๊ฒ์ ์ข์ ๋ฐฉ๋ฒ์ด ์๋.
- ํ์์ ๋ฐ๋ผ ์๋งํ๊ฒ ์ฌ์ฉํ์ฌ ํ์ ์ ๊นจ๋จ๋ฆฌ์ง ์๋ ์กฐ๊ฑด์ ์ค์ํ๋ฉฐ ์ฌ์ฉ์ ๊ถ์ฅ.
OCP (Open/Closed, ๊ฐ๋ฐฉ ํ์์ ์์น)
-> ๊ธฐ๋ฅ์ ํ์ฅ ๊ฐ๋ฅ์ฑ์ ์ด์ด๋ ๋, ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ๋ซ์๋์.
์ฆ, ๊ธฐ์กด์ ์ฝ๋๋ฅผ ๊ฐ๋ฅํํ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ ์ ์๋๋ก ๊ตฌํํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ฒ ์ฏค ํด๋ดค๋ค๋ฉด, ๊ทธ๋ฆฌ๊ณ ์ ์ง๋ณด์๋ฅผ ํด ๋ณธ ๊ฒฝํ์ด ์๋ค๋ฉด, ๊ธฐ์กด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ฐ๋ฐ์์๊ฒ ์์ด์ ๋งค์ฐ ํฐ ๋ถ๋ด์ผ ๊ฒ์ ๋๋ค. ์ ๋์ํ๋ ์ฝ๋๋ฅผ ๊ฑด๋๋ ค์ ๊ดํ ๋ฒ๊ทธ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ ์๋์ง, ๊ธฐ์กด์ ๋์ํ ์ฝ๋์ ์ดํด๋ฅผ 100% ๋ณด์ฅํ๊ธฐ ์ด๋ ต๋ค๋ ์ ์์ ๋์ค๋ ๋ฌธ์ ์ ๋๋ค.
๋ฐ๋ผ์ ๊ธฐ์กด์ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝ์ด๋ ํ์ฅ์ด ํ์ํ ๊ฒฝ์ฐ์๋ ๊ธฐ์กด ํด๋์ค๋ฅผ ์์, ์ฆ ๊ธฐ์กด ์ฝ๋๋ฅผ ์ ์งํ๋ฉด์ ์๊ตฌ์ฌํญ์ ๋ง์กฑ์ํค๋ ๊ฒ์ด ๊ฐ์ฅ ์์ ํฉ๋๋ค.
์ ์ ์ ํ์ ์ทจ๊ธํ๊ธฐ ์ํด ๊ธฐ์กด์ ์ํ์์ ์ ์กฐ ์ผ์์ ์ ํต ๊ธฐํ์ ์ถ๊ฐํ ์ฝ๋์ ๋๋ค.
์ ์ ์ ํ์ด ์๋ ์ ํ๊ตฐ์์๋ ์ ํต ๊ธฐํ๊ณผ ์ ์กฐ ์ผ์๊ฐ ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ๋ ๊ฒ์ ๋งค๋ฒ ์ถ๊ฐ๋๋ ์ํ ์ข ๋ฅ ์๊ตฌ์ฌํญ์ ๋ฐ์ํ๊ธฐ ์ํด ๋งค๋ฒ ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ ๋ถํธํจ์ ์ด๋ํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ Open/Closed ์์น์ ์งํค๊ธฐ ์ํด OOP ํน์ง์ธ ์์์ ์ด์ฉํด์ ์ฝ๋๋ฅผ ๊ตฌํํ๋ฉด,
์ด๋ ๊ฒ Product ๋ผ๋ ๊ณตํต์ ์ํ์ ์์ ํด๋์ค๋ก ๋๊ณ , ํ์ ํด๋์ค๋ค์ด ์์ํ์ฌ ์ฌ์ฉํ ์ ์๋๋กํ์ฌ ๊ธฐ์กด์ ์ํ ํด๋์ค๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์๋ก์ด ์ ํ์ ์ํ์ ๋ํ ์ถ๊ฐ ์๊ตฌ ์ฌํญ์ ํ์ฅํ ์ ์๋๋ก ํฉ๋๋ค.
์ฌ๊ธฐ์๋ ์ฃผ์์ ์ด ์์ต๋๋ค.
- ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ๋ ๋ฐ ์ฌ์ด ๋ฌธ์ ์์ ์ด ์์น์ ์ ์ฉํ์ง ๋ง ๊ฒ.
- ์ถ์ ํด๋์ค, ์ธํฐํ์ด์ค๋ก๋ ์ด ์์น์ ์งํฌ ์ ์๋ค. ์ํฉ์ ๋ง๊ฒ ์ ์ฉํ์.
LSP (Liskov Substituation, ๋ฆฌ์ค์ฝํ ์นํ ์์น)
-> ์์ ํด๋์ค๋ฅผ ๋ถ๋ชจ ํด๋์ค์ฒ๋ผ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณํ์ฌ์ผ ํ๋ค.
์ด ์์น์ ์ฐ๋ฆฌ๊ฐ ์์์ ์ฌ์ฉํ ์์๊ณผ ๊ด๋ จ์ด ์๋ ์์น์ ๋๋ค. ๋ง์ฝ, ์์ ํด๋์ค๊ฐ ๋ถ๋ชจ ํด๋์ค์์ ๊ธฐ๋ํ๋ ๋์๊ณผ ๋ค๋ฅด๊ฒ ๋์ํ๋ค๋ฉด, ๊ฐ์ ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์ํ๋๋ผ๋ ์์ ํด๋์ค๋ง๋ค ๊ธฐ๋ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์์ ํ๋๋ฐ, ์ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์์๋ณด์ฃ .
์ด ์ฝ๋๋ Circle-Ellipse Problem ์ํค์ ์๋ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ ๊ฒ์ ๋๋ค. ๋จผ์ ํ์์ด๋ผ๋ ๋ถ๋ชจ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค. ํ์์ผ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ง๋ฆ์ด ๋ค๋ฅธ ์์ ๋๋ค.
๊ทธ๋ฐ ๋ค์ ์์ ํด๋์ค์ธ ์ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค. ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ฐ์ง๋ฆ์ ๊ธธ์ด๊ฐ ๊ฐ๊ธฐ ๋๋ฌธ์ ํ๋์ ๋ฐ์ง๋ฆ์ ๊ธธ์ด๋ง setter ํ ์ ์๋๋ก ๊ตฌํํ๋ค๋ฉด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ main ํจ์๋ฅผ ๋ณด๋ฉด ๋ฒ๊ทธ๋ฅผ ๋ฐ์ํ๋ ์ผ์ด์ค๊ฐ ์์ต๋๋ค. ๋ฐ๋ก ๋ค๋ฅธ ๋ฐ์ง๋ฆ์ 4๋ก ์ค์ ํด๋ฒ๋ฆฌ๋ฉด Circle ํด๋์ค๋ Circle์ ๋์ด๊ฐ ์๋ Ellipse์ ๋์ด๊ฐ ๊ตฌํด์ง๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง ์ด๋ฐ ๊ฒฝ์ฐ์๋ ์ถ์ ํด๋์ค๋ฅผ ์ด์ฉํด ํ์ด๋ณผ ์ ์์ต๋๋ค.
ํ๋์ด ์๋ ๋ชจ์ต์ด ๋น์ทํ ๋ถ๋ถ์ด๋ผ๋ฉด ์ถ์์ ํตํด์ ํฐ ํ์ ๋ง๋ค๊ณ , ์ด๋ค์ ์๋ก ๊ตฌํํ๋ ๊ฒ ๋ฐฉ๋ฒ์ผ๋ก ๋์๊ฐ๋ค๋ฉด ์ํ๋ ์๊ตฌ ์ฌํญ์ ๋ณด๋ค ์ ํํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
์ ๋ณด๋ฉด, ๋ฆฌ์ค์ฝํ ์นํ ์์น์ ์งํค์ง ์์์ ๋ ๊ฒฐ๊ตญ์๋ ๊ฐ๋ฐฉ ํ์ ์์น๋ ์ง์ผ์ง์ง ์๋ ํ๊ธ ํจ๊ณผ๊ฐ ๋ํ๋๊ฒ ๋ฉ๋๋ค. ๊ธฐ๋ฅ ํ์ฅ์ ์ํด ์ฌ๋ฌ ๋ฒ ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ ์ผ์ด ์ฆ์์ง๊ฒ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์์ ๊ด๊ณ์์๋ ๋ฐ๋์ ์ผ๋ฐํ ๊ด๊ณ๊ฐ ์ฑ๋ฆฝ๋์ด์ผ ํจ.
- ๋จ์ํ ์ฌ์ฌ์ฉ ๋ชฉ์ ์ ์ํ ์ฉ๋๋ก ์ค๊ณํ์ง ๋ง์์ผ ํจ.
- ์ฒ์๋ถํฐ ๋ชจ๋ ๊ฒ์ ์๋ฒฝํ๊ฒ ์ค๊ณํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ์ฒ์์๋ ๊ตฌ์ฒดํ ๋ณด๋ค๋ ์ถ์ํ์ ์์กดํ์.
- ์ถ์ํ ๋ ๋ฒจ์ ๊ฐ๊ธ์ ๋จ์ํ๊ฒ ํ์.
ํนํ ๋ง์ง๋ง ์ฌํญ์ ์ฒ์ OOPํ์๋ ๋ถ๋ค์ด ๋ง์ด ์ค์ํ๋ ๋ถ๋ถ์ธ๋ฐ, ์ถ์ํ๋ฅผ ํตํด ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ํ๋ ๊ฒ์ด ๋ชฉ์ ์ด ์๋๋ผ ํ์ฅ์ด ์ฉ์ดํ๊ณ ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์ด๋ฆฌ๊ธฐ ์ํ ๋ชฉ์ ์ด ํฌ๋ฏ๋ก ์ถ์ํ๋ฅผ ๋ง์ด ํ๊ฒ ๋๋ฉด ์คํ๋ ค ๋ถ์์ด ์ด๋ ค์ฐ์ง ์ ์์ผ๋ ๋๋ฌด ์ถ์ํ์ ์์กดํ๋ ๊ฒ์ ์์ ํ๋๋ก ํฉ๋๋ค.
ISP (Interface Segregation, ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ๋ฒ์น)
-> ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ ํ์ํ ํจ์๋ง ๊ตฌํํ ์ ์๋๋ก ์ค๊ณํ์
์ธํฐํ์ด์ค๋ ๋ง๊ทธ๋๋ก ๊ตฌํํด์ผ ํ ๋ฉ์๋๋ฅผ ์ ์ํ๊ธฐ ์ํ ์ปดํฌ๋ํธ์ ๋๋ค. ์์น ๊ทธ๋๋ก ์ธํฐํ์ด์ค๋ ์ต์ํ์ ํฌ๊ธฐ๋ก๋ง ๊ตฌํํ๋ฉฐ ๊ทธ๋ ๊ฒ ํด์ผ๋ง ํด๋์ค๊ฐ ์ด๋ค ํด๋์ค์ธ์ง ์ ํํ๊ฒ ๋ฌ์ฌํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ ์๋น์ค๊ฐ ์์ ์ฌ์ฉํ๋ ์ ์ ์ ํ ๋ฟ์๋๋ผ ํจ์ ์ ํ๊น์ง ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋๋ฆฌ๊ธฐ ์ํด ์๋ฅ ์ํ์ ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ, ์๋ฅ ์ํ์ ์์, ํ์๋ง์ ๊ณ ๋ คํ์ฌ ํ๋ฆฌ ์ฌ์ด์ฆ(waistSize)๋ฅผ ๋ฃ์๋๋ฐ, ์๊ฐํด๋ณด๋ ๋ชจ์, ์ ๋ฐ ๋ฑ์๋ ํ์์๋ ํญ๋ชฉ์ ๋๋ค.
์ด์ฒ๋ผ ์ธํฐํ์ด์ค๋ ๊ตฌํํด์ผ ํ๋ ๋ถ๋ถ๋ง ์ ์ํด์ผ ํ์ฅ์ด ์ฉ์ดํด์ง๋๋ค. ๊ตฌํํ์ง ์์๋ ๋ ๋ถ๋ถ๊น์ง ์ถ๊ฐํด๋ฒ๋ฆฌ๋ฉด ์ฐจํ ํ์ฅ์ ๊ธฐ์กด ์ธํฐํ์ด์ค๋ฅผ ์์ ํด์ผ ํ๋ ์ํฅ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฒฐํฉ์ด ์๊น๋๋ค.
์์ ๊ฐ์ด ์๋ฅ ์ ํ์ ๋ํ ์ต์ํ์ ํ๋๋ฅผ ๋๊ณ ๋ฐ์ง, ๊ฒ์ท, ๋ชจ์, ์ ๋ฐ ๋ฑ ๊ฐ์ ๋ถ๋ฅ์ ๋ฃ์ด ํ์ฅํ๊ธฐ ์ฉ์ดํ๋๋ก ์ค๊ณํฉ๋๋ค.
- ์ธํฐํ์ด์ค์ ์ต์ํ๋ ํ๋์ ์ธํฐํ์ด์ค์ ๋ฐ๋์ ํ์ํ ๊ธฐ๋ฅ๋ง์ ๊ตฌํํด๋์.
- ์ ์ฌํญ์ ์ด์ฉํด class <-> interface๊ฐ 1:1์ด ๋ ์ค๊ณ๊ฐ ๋์ง ์๋๋ก ํ์.
DIP (Dependency Inversion, ์์กด ์ญ์ ์์น)
-> ์์ ๋ชจ๋๊ณผ ํ์ ๋ชจ๋์ ์ถ์์ ์ธ ์ฝ์์ ๊ธฐ๋ฐ์ผ๋ก ์ํตํด์ผ ํ๋ค. ์์ธํ ๊ตฌํ์ ์ถ์์ ์ธ ๊ฐ๋ ์ ๊ธฐ๋ฐํด์ผ ํ๋ค.
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋๋ ๊ตฌ์ฒด์ ์ธ ํด๋์ค๊ฐ ์๋ ์ถ์ ํด๋์ค๋ ์ธํฐํ์ด์ค์ ์์กดํด์ผ ํ๋ค๋ ์์น์ ๋๋ค.
๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ํต์ฌ์ธ ๋ชจ๋ ๊ฐ ์์กด ๊ด๊ณ ํด์๋ฅผ ๊ฐ์กฐํ๋ ์์น์ธ๋ฐ, ๋ชจ๋ ๊ฐ์ ์์กด ๊ด๊ณ๊ฐ ๋ฎ์์ ธ์ผ๋ง ๋ชจ๋ ์ธ๋ถ ์ฌํญ์ ๋ณ๊ฒฝํ๋๋ผ๋, ์ ์ฒด ์ฝ๋์ ๋ฏธ์น๋ ์ํฅ์ด ์ ๊ณ , ์ ์ ์์ ์ฝ๋ ๋ณ๊ฒฝ์ผ๋ก ์ต๋ ํจ๊ณผ๋ฅผ ๋๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ์ฝ๋๋ ์ด๋ฉ์ผ๊ณผ SMS๋ฅผ ๋ณด๋ด๊ณ ๋ ๋ค, ์ฌ์ฉ์์๊ฒ ์๋ฆผ์ ๋ฐ์์ํค๋ ์ฝ๋ ๊ตฌํ ์ค ์ผ๋ถ์ ๋๋ค. ์ฌ์ฉ์์๊ฒ ์๋ฆผ์ ๋ด๋นํ๋ Notification ํด๋์ค๋ Email์ ์ ์กํ๋ Email ํด๋์ค์ SMS ํด๋์ค๋ฅผ ์ง์ ํธ์ถํ๋๋ฐ, ์ด๋ ๊ฒ ๋๋ฉด Email ํด๋์ค๋ SMS ํด๋์ค์ send ๋ฉ์๋ ์ด๋ฆ์ด ๋ณ๊ฒฝ๋๊ฑฐ๋ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ด ๋ณ๊ฒฝ๋๋ ๋ฑ ์ด๋ ํ๋์ ํด๋์ค๋ผ๋ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด Notification ํด๋์ค๋ ๊ฐ์ด ๋ณ๊ฒฝํด์ผ๋ง ํฉ๋๋ค.
์ด๋ฌํ ๊ฐ๊ฒฐํฉ์ ํด๊ฒฐํ๊ธฐ ์ํด์๋ interface๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์์ ๋ชจ๋๊ณผ ํ์ ๋ชจ๋์ ๊ฒฐํฉ์ ๋์จํ๊ฒ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋์ด ์๋ก ๊ท์ฝํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ค๊ฐ์ ํ๋ ์ฌ์ฉํ์ฌ ๋ ํด๋์ค๊ฐ ์๋ก ๊ฐํ๊ฒ ๊ฒฐํฉํ์ง ์๋๋ก ์ค๊ฐ ๋ค๋ฆฌ๋ฅผ ํ๋ ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ํ์ ๋ชจ๋์ด ์ถ๊ฐ๋ก ๋ ์๊ธฐ๋๋ผ๋ IMessage ๋ผ๋ ์ธํฐํ์ด์ค ๊ท์ฝ๋ง ์ง์ผ์ง๋ฉด ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
- ์ด ์์น์ ํต์ฌ์ ํ์ ๋ชจ๋์ด ์์ ๋ชจ๋์์ ์ ์ํ ์ถ์ ํ์ ์ ์์กดํ๋ค๋ ๊ฒ์.
- ๋ฐ๋ผ์ ํ์ ๋ชจ๋์ด ๋ณ๊ฒฝ ๋๋๋ผ๋ ์์ ๋ชจ๋์ ์ ํ ์ ๊ฒฝ์ฐ์ง ์์.
- ์ด ์์น์ ๊ทธ์ ์์น์ผ๋ก๋ง ์ฌ๊ฒจ์ง ์ ์๋ค. ํ์ง๋ง OOP๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์์ฐ์ฑ์ ์ฌ๋ฆฌ๊ธฐ ์ํจ, ์ ๋ ์์น์ ๊ฐ์ํ์ง ์๊ณ , ๋ ผ๋ฆฌ์ ์ผ๋ก ์ค๋ํ๋ผ.
ํนํ ๋ง์ง๋ง ์ฃผ์ ์ฌํญ์์ ๋ ผ๋ฆฌ์ ์ธ ์ค๋์๋ ๋ช ํํ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํ์ฌ ์ค๋ํ๋ ๊ฒ์ด ์์ต๋๋ค. ๋ฌด์์ SOLID ์์น์ด ์ข๋ค๊ณ ํด์ ๋๋ฃ๋ค์๊ฒ ์์น์ ๊ฐ์ํ๋ ์ปค๋ฎค๋์ผ์ด์ ์ด ๋๋ค๋ฉด ๊ทธ ์ํํธ์จ์ด๋ ์์ฐ์ฑ์ด ๋ฐ๋ฅ์ผ๋ก ๋จ์ด์ง ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ...
SOLID ์์น์ด๋ผ๋ ํ๋ก๊ทธ๋๋ฐ์ ์ค์ํ ๊ฐ๋ ์ ์ ์ด๋ดค์ต๋๋ค. ์ข ๊ธด ๋ด์ฉ์ด๋ ์ ๋ฆฌํด๋ณด์๋ฉด...
- SRP์ ISP์ ํต์ฌ์ ๋ฌด๋ถ๋ณํ ๊ฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ๋ง์์ค.
-> ํ๋์ ํด๋์ค ํน์ ์ธํฐํ์ด์ค์์ ํ์ ์ด์์ ์ฝ๋๋ฅผ ์ ์ง ์๋๋ก ํจ์ผ๋ก์จ ๊ด์ ์ ํ๋ฆฌ์ง ์์ ํ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ๊ณณ๊น์ง ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ํ์ฌ ์ ์ง๋ณด์์ฑ์ ์ข๊ฒ ํฉ๋๋ค. - LSP์ DIP๋ OCP๋ฅผ ์ง์ํ๋ ์ญํ
-> OCP๋ ์์ฃผ ๋ณํํ๋ ๋ถ๋ถ์ ์ถ์ํํ๊ณ , ๋คํ์ฑ์ ์ด์ฉํ์ฌ ๊ธฐ๋ฅ ํ์ฅ์ ์ฉ์ดํ๊ฒ ํ๋, ๊ธฐ์กด ์ฝ๋์๋ ๋ณด์์ ์ด๋๋ก ํฉ๋๋ค. (๋ณํํ๋ ๋ถ๋ถ์ ์ถ์ํ ํ๋ ๊ฒ: DIP, ๋คํ์ฑ ๊ตฌํ์ ๋์์ฃผ๋ ๊ฒ: LSP)
๋ ํ๋, ์์ ๋ง์๋๋ฆฌ๋ ๊ฒ์ฒ๋ผ ์ค๊ณ ์์น์ ์ฐ๋ฆฌ๊ฐ ์ด๋ค ํ๋์ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํด ์ ํ๋ ์ผ์ข ์ ๊ท์น์ ๋๋ค. ๊ฐ์ด ๊ฐ๋ฐํ๋ ๋๋ฃ๋ค๊ณผ ๊ณต๊ฐ๋๋ฅผ ํ์ฑํ๋ ๊ฒ์ด ์ฐ์ ์ผ ๊ฒ์ด๋ฉฐ, ์ด๋ฅผ ์ง๋์น๋ ์์น์ ๊ฐ์๊ฐ ๋๊ณ , ์ด๋ ์ํํธ์จ์ด์ ์์ฐ์ฑ์ ์ ํดํ๋ ์์ธ์ด ๋ฉ๋๋ค.