์ ๋ ๋ฉด์ ๊ด์๊ฒ ๊ฑธ๋ฆฌ๋ฉด ๋ฌผ์ด๋ณผ ์๋ ์๋ค๋
์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น SOLID๋ฅผ ์์๋ณด์...
SRP ๋จ์ผ ์ฑ ์ ์์น ( single responsibilty principle )
- ํ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ค.
- ํ๋์ ์ฑ ์์ด๋ผ๋ ๊ฒ์ ๋ชจํธํ๋ค.
- ํด ์ ์๊ณ , ์์ ์ ์๋ค.
- ๋ฌธ๋งฅ๊ณผ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
- ์ค์ํ ๊ธฐ์ค์ ๋ณ๊ฒฝ์ด๋ค. ๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธ ํจ๊ณผ๊ฐ ์ ์ผ๋ฉด ๋จ์ผ ์ฑ ์ ์์น์ ์ ๋ฐ๋ฅธ ๊ฒ์ด๋ค.
OCP ๊ฐ๋ฐฉ-ํ์ ์์น ( open/closed principle )
- ์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผ ํ๋ค.
" ์ด๋ป๊ฒ ์ฝ๋์ ๋ณ๊ฒฝ ์์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์๊น? "
- ๋คํ์ฑ์ ํ์ฉํด ๋ณด์
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋ก์ด ํด๋์ค๋ฅผ ํ๋ ๋ง๋ค์ด์(๊ธฐ์กด ์ฝ๋ ๋ณ๊ฒฝ์ด ์๋) ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํ(ํ์ฅ)
- ์ง๊ธ๊น์ง ๋ฐฐ์ด ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ๋ฅผ ์๊ฐํด ๋ณด์
๋ฌธ์ ์
๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค.
MemberService ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ์ ํํด์ผ ํ๋ค.
๋คํ์ฑ์ ์ฌ์ฉํ์ง๋ง OCP ์์น์ ์งํฌ ์ ์๋ค.
-> ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์กฐ๋ฆฝ, ์ค์ ์๊ฐ ํ์ํ๋ค
-> ์ด ๋ฌธ์ ๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ํด๊ฒฐํด ์ค๋ค
LSP ๋ฆฌ์ค์ฝํ ์นํ ์์น ( Liskov substitution principle )
- ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ ๋๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค.
- ๋คํ์ฑ์์ ํ์ ํด๋์ค๋ ์ธํฐํ์ด์ค ๊ท์ฝ์ ๋ค ์ง์ผ์ผ ํ๋ค๋ ๊ฒ,
๋คํ์ฑ์ ์ง์ํ๊ธฐ ์ํ ์์น, ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ ๋ฏฟ๊ณ ์ฌ์ฉํ๋ ค๋ฉด ์ด ์์น์ด ํ์ํ๋ค.
ex) ์๋์ฐจ ์ธํฐํ์ด์ค์ ์์ ์ ์์ผ๋ก ๊ฐ๋ผ๋ ๊ธฐ๋ฅ, ๋ค๋ก ๊ฐ๊ฒ ๊ตฌํํ๋ฉด LSP ์๋ฐ
ISP ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น ( Interface segregation principle )
- ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค.
์๋์ฐจ ์ธํฐํ์ด์ค -> ์ด์ ์ธํฐํ์ด์ค, ์ ๋น ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌ
์ฌ์ฉ์ ํด๋ผ์ด์ธํธ -> ์ด์ ์ ํด๋ผ์ด์ธํธ, ์ ๋น์ฌ ํด๋ผ์ด์ธํธ๋ก ๋ถ๋ฆฌ
๋ถ๋ฆฌํ๋ฉด ์ ๋น ์ธํฐํ์ด์ค ์์ฒด๊ฐ ๋ณํด๋ ์ด์ ์ฌ ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์์
์ธํฐํ์ด์ค๊ฐ ๋ช ํํด์ง๊ณ , ๋์ฒด ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
DIP ์์กด๊ด๊ณ ์ญ์ ์์น ( Dependency inversion principle )
" ์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์ ๋๋ค. "
- ๊ตฌํ ํด๋์ค์ ์์กดํ์ง ๋ง๊ณ , ์ธํฐํ์ด์ค์ ์์กดํ๋ผ๋ ๋ป์ด๋ค.
์ญํ (Role)์ ์์กดํ๊ฒ ํด์ผ ํ๋ค๋ ๊ฒ๊ณผ ๊ฐ๋ค.
๊ฐ์ฒด ์ธ์๋ ํด๋ผ์ด์ธํธ๊ฐ ์ธํฐํ์ด์ค์ ์์กดํด์ผ ์ ์ฐํ๊ฒ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค!
๊ตฌํ์ฒด์ ์์กดํ๊ฒ ๋๋ฉด ๋ณ๊ฒฝ์ด ์์ฃผ ์ด๋ ค์์ง๋ค.
DIP ์๋ฐ
๊ทธ๋ฐ๋ฐ OCP์์ ์ค๋ช ํ MemberService๋ ์ธํฐํ์ด์ค์ ์์กดํ์ง๋ง , ๊ตฌํ ํด๋์ค๋ ๋์์ ์์กดํ๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
-> MemberService๋ MemberRepository ์ธํฐํ์ด์ค์๋ง ์์กดํ๋๋ก ์ค๊ณ๋ฅผ ํด์ผ ํ๋ค.
์ ๋ฆฌ
- ๊ฐ์ฒด ์งํฅ์ ํต์ฌ์ ๋คํ์ฑ
- ๋คํ์ฑ ๋ง์ผ๋ก๋ ์ฝ๊ฒ ๋ถํ์ ๊ฐ์ ๋ผ์ฐ๋ฏ์ด ๊ฐ๋ฐํ ์ ์๋ค.
- ๋คํ์ฑ ๋ง์ผ๋ก๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ ํจ๊ป ๋ณ๊ฒฝ๋๋ค.
- ๋คํ์ฑ ๋ง์ผ๋ก๋ OCP, DIP๋ฅผ ์งํฌ ์ ์๋ค.
๋ญ๊ฐ ๋ ํ์ํ๋ค.
--> Spring!!!
๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
์คํ๋ง์ ๋ค์ ๊ธฐ์ ๋ก ๋คํ์ฑ + OCP, DIP๋ฅผ ๊ฐ๋ฅํ๊ฒ ์ง์ํ๋ค.
- DI(Denpendency Injection) : ์์กด๊ด๊ณ, ์์กด์ฑ ์ฃผ์
- DI ์ปจํ ์ด๋ ์ ๊ณต
์๋ฐ์ ๊ฐ์ฒด๋ค์ ์ปจํ ์ด๋์ ๋ฃ์ด๋๊ณ ์ด ์์์ ์์กด๊ด๊ณ๋ฅผ ์๋ก ์ฐ๊ฒฐํด ์ฃผ๊ณ ์ฃผ์ ํด ์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณต
์ด๋ฐ ๊ธฐ๋ฅ๋ค์ด ์์ด์ผ ํด๋ผ์ด์ธํธ ์ฝ๋์ ๋ณ๊ฒฝ ์์ด ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋ค.
์ฝ๊ฒ ๋ถํ์ ๊ต์ฒดํ๋ฏ์ด ๊ฐ๋ฐ์ ํ ์ ์๋ค
์ ๋ฆฌ
- ๋ชจ๋ ์ค๊ณ์ ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํ์.
( ์๋์ฐจ, ๊ณต์ฐ์ ์๋ฅผ ๋ ์ฌ๋ ค๋ณด์.)
- ์ ํ๋ฆฌ์ผ์ด์ ์ค๊ณ๋ ๊ณต์ฐ์ ์ค๊ณํ๋ฏ์ด ๋ฐฐ์ญ(์ญํ , ์ธํฐํ์ด์ค)๋ง ๋ง๋ค์ด๋๊ณ ,
๋ฐฐ์ฐ๋ ์ธ์ ๋ ์ง ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ด ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ๋ค.
์ด์์ ์ผ๋ก๋ ๋ชจ๋ ์ค๊ณ์ ์ธํฐํ์ด์ค๋ฅผ ๋ถ์ฌํ์.
ํ์ง๋ง ์ธํฐํ์ด์ค๋ฅผ ๋์ ํ๋ฉด ์ถ์ํ๋ผ๋ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
(์ฝ๋๋ฅผ ์ด๋ฉด ์ธํฐํ์ด์ค๋ง ๋ณด์ด๊ธฐ ๋๋ฌธ์ " ๊ตฌํ ํด๋์ค๊ฐ ๋ญ์ง? " ํ ๋ฒ ๋ ๋ค์ด๊ฐ์ ๋ด์ผ ํ๋ ๋จ์ )
๊ธฐ๋ฅ์ ํ์ฅํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด , ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ง์ ์ฌ์ฉํ๊ณ
ํฅํ ๊ผญ ํ์ํ ๋ ๋ฆฌํฉํฐ๋งํด์ ์ธํฐํ์ด์ค๋ฅผ ๋์ ํ๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด๋ค.