SOLID๋?
์์น์ ๊ฐ์น๋ฅผ ์งํค๊ธฐ์ํด์ ์กด์ฌํ๋ค๊ณ ํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ํํธ์จ์ด์ ๊ฐ์น์๋ ๋ฌด์์ด ์์๊น?
์ฒซ๋ฒ์งธ๋ก๋ ๊ฐ๋ ์ฑ์ด ์ข์ ์ฝ๋๋ผ๊ณ ํ ์ ์๋ค. ๊ฐ๋ฐ์๋ ์ฝ๋๋ฅผ ํตํ ์ปค๋ฎค๋์ผ์ด์ ์ ํ๋ฉฐ, ์ฝ๊ณ ์ดํดํ ์ ์๋ ์ฝ๋๋ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋๋ฒ์งธ๋ก๋ ๋จ์ํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ ์ปค๋ฎค๋์ผ์ด์ ์ ๋์์ด ๋๊ณ , ๋ฒ๊ทธ์ ๊ฐ๋ฅ์ฑ์ด ์ ์ด์ง๋ฉฐ, ์ถํ ์ฝ๋์ ์์ ์ ๋์์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ง๋ง์ผ๋ก๋ ์ฝ๋๋ ์ ์ฐํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ๊ฒฝ์ง๋ ์ฝ๋๋ ์ ์ง ๋ณด์๋ฅผ ์ด๋ ต๊ฒ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์์ ์ธ๊ธํ ์คํํธ์จ์ด์ ๊ฐ์น๋ค์ ์งํค๊ธฐ ์ํด์๋ ์์น์ด ํ์ํ๋ค. ์ด๋ ์ด๋ฌํ ๊ฐ์น๋ค์ ์งํค๊ธฐ ์ํด ๋์จ๊ฒ์ด SOLID์์น์ด๋ค
S: Single Responsiblity Principle (๋จ์ผ ์ฑ
์ ์์น)
O: Open-Closed Principle (๊ฐ๋ฐฉ-ํจ์ ์์น)
L: Liskov Substitution Principle (๋ฆฌ์ค์ฝํ ์นํ ์์น)
I: Interface Segregation Principle (์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น)
D: Dependency Inversion Principle (์์กด ์ญ์ ์์น)
Single Responsiblity Principle (๋จ์ผ ์ฑ ์ ์์น)
ํ๋์ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง์ ๊ฐ์ ธ์ผ ํ๋ค๋ ๋ป์ด๋ค. ๊ฐ๊ฐ์ ํด๋์ค๋ค์ด ์ฌ๋ฌ ๊ฐ์ง์ ์ฑ ์์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ์์ ๊ณผ์ ์ ์์ด์ ํ๋์ ์์ ์ด ๋ ๋ค๋ฅธ ์์ ์ ์ฐ์์ ์ผ๋ก ์ผ๊ธฐํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๊ธฐ ๋๋ฌธ์ด๋ค(ํด๋์ค๊ฐ ๊ฒฐํฉ๋๊ฐ ๋๊ณ , ์์ง๋๊ฐ ๋ฎ๊ธฐ ๋๋ฌธ์). ์ด๋ ๊ฒฐ๊ตญ ์ ์ง๋ณด์์ ๋น์ฉ์ด ์ฆ๊ฐํ๋ค๋ ๊ฒ์ ๋ปํ๋ฏ๋ก ๊ฐ๊ฐ์ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง์ ๊ฐ์ง ํ์๊ฐ ์๋ค.
์์ง๋ : ๊ด๋ จ์ฑ ์๋ ์ฝ๋๋ค์ด ์ผ๋ง๋ ์์งํด ์๋๊ฐ
๊ฒฐํฉ๋ : ๋ถํ์ํ ์์กด์ฑ์ด ์กด์ฌํ๋๊ฐ
- ์ฝ๋ ์์
๊ทธ๋ฆผ 1
์์ ์๋ฅผ ๋ณด๋ฉด ์ฅฌ์ค๋ง๋ค๊ธฐ ๋ผ๋ class ๊ณผ์ผ์ค๋น(), ์ฅฌ์ค๋ง๋ค๊ธฐ(), ์ฅฌ์ค๋ฅผ์ค๋ค()์ ๋ง์ ์ญํ ์ ์ค๊ตฌ๋๋ฐฉ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์ ์ ์๋ค.
๊ทธ๋ฆผ 2
1๋ฒ ์์ ๋น๊ตํด์ ๊ฐ๊ฐ์ ๊ณผ์ผ์ค๋น(), ์ฅฌ์ค๋ง๋ค๊ธฐ(), ์ฅฌ์ค๋ฅผ์ค๋ค() ์ญํ ์ ํ๋ ํ๋กํ ์ฝ์ ๋ง๋ค์ด์ฃผ๊ณ ๊ฐ์์ ์ญํ ๋งํ๋ ๋ฉ์๋๋ง์ ๊ตฌํํ๊ฒ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฅฌ์ค๋ง๋ค๊ธฐ์์๋ ์ด ํ๋กํ ์ฝ๋ค์ ํ์ฉํด์ ์ํจ์์ฉ๋ง์ ํ๊ณ ์๋ค.
๊ทธ๋ก ์ธํด ๊ฐ๊ฐ์ ํ๋กํ ์ฝ๋ค์ ํ์ฉํด์ ๋ก๊ทธ์ธ์ ๊ดํ ์ฑ ์๋ง์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
Open-Closed Principle (๊ฐ๋ฐฉ-ํจ์ ์์น)
ํ์ฅ์๋ ์ด๋ ค์๊ณ ๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผ ํ๋ค๋ ๋ป์ด๋ค. ๋ค์ ๋งํด ํ์ฅ์ ํ ๋๋ ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์ต๋ํ ๊ฑด๋๋ฆฌ์ง ์๊ณ ํ์ฅํ๊ณ , ๋ง์ฝ ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์์ ํ๊ฒ ๋๋ค๋ฉด ์ฐ์์ ์ธ ์์ ์ ํ์ง ์์ ์ ์๊ฒ ํ์๋ ๊ฒ์ด๋ค(๋ณ๊ฒฝ์ด ๊ธฐ์กด ์ฝ๋์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฉด์ ์๋ก์ด ์ฝ๋๋ฅผ ์ถ๊ฐํ ์ ์๋ ๊ตฌ์กฐ ์งํฅ).
- ์ฝ๋ ์์
๊ทธ๋ฆผ 1
๊ทธ๋ฆผ 2
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ๊ตํต์๋จ์ ๊ฐ๊ฐ enum(๊ทธ๋ฆผ 1)๊ณผ protocol(๊ทธ๋ฆผ 2)๋ก ๊ตฌํ์ ํ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ตฌ์ฒด์ ์ธ ๊ตํต์๋จ์ ์ข ๋ฅ๋ฅผ case์ struct๋ก ํํํ์๋ค. ์ด ๋์ ์์ ๊ณผ์ ์์ ์ฐจ์ด๋ฅผ ๊ฐ์ง๋ค.
๊ทธ๋ฆผ 3
๊ทธ๋ฆผ 4
๋ง์ฝ ์ธ๋ฐ ์์ ๊ฑฐ๋ผ๋ ๊ตํต์๋จ์ ์ถ๊ฐํ๋ ค ํ๋ค๋ฉด enumํ์ ์ ๊ฒฝ์ฐ๋ ์ ๋ฐ์ ์ธ ์์ ์ ์๊ตฌํ๋ค(๊ทธ๋ฆผ 3). ๊ทธ๋ฌ๋ protocol์ ๊ฒฝ์ฐ ์ธ๋ฐ์์ ๊ฑฐ struct๋ง ์ถ๊ฐํด์ฃผ๋ฉด ๋์ด์ ํ์ฅ๋ง ์ค์ํ๋ฉด ๋๋ค(๊ทธ๋ฆผ 4).
Liskov Substitution Principle (๋ฆฌ์ค์ฝํ ์นํ ์์น)
๋ถ๋ชจ ํด๋์ค๋ก ์๋ ํ๋ ๊ธฐ๋ฅ์ ์์ํด๋์ค๋ก ๋์ฒด ํ์ฌ๋ ๋์์ด ๊ฐ๋ฅ ํด์ผ ํ๋ค๋ ๋ป์ด๋ค.
- ์ฝ๋ ์์
๊ทธ๋ฆผ 1
๊ทธ๋ฆผ 2
๊ทธ๋ฆผ 3
์ ์ฌ๊ฐํ์ ์ง์ฌ๊ฐํ์ด๊ธฐ๋ ํ๋ค. ๊ทธ๋์ ์ง์ฌ๊ฐํ ํด๋์ค๋ฅผ ์์ ๋ฐ๊ณ ์๋ค. ํ์ง๋ง ์ ์ฌ๊ฐํ์ ์๋ณ์ ๊ธธ์ด๊ฐ ๋๊ฐ๋ค๋ ์์ ๋ง์ ์ฑ์ง์ ๊ฐ์ง๊ธฐ ์ํด ์ง์ฌ๊ฐํ์ ๋ฉ์๋๋ฅผ override ํด์ฃผ์๊ณ , ์ด๋ก ์ธํด ์ง์ฌ๊ฐํ์ ์ฑ์ง์ ๊ทธ๋๋ก ์์ํ๋ ๊ฒ์ ๊ฑฐ๋ถํ๊ณ ์์ ๋ง์ ์ฑ์ง์ ๊ฐ์ง๊ฒ ๋๋ค.(ํดํ ํจ์)
์ ์ฒ๋ผ LSP์์น์ ๊นจ์ง ์๊ธฐ ์ํด ์์์ ํ ๋๋ ๋ณด๋ค ์ ์คํด์ผ ํ ํ์๊ฐ ์์ผ๋, ๋ชจ๋ ์ฝ๋์์ LSP๋ฅผ ์งํค๊ธฐ๋ ์ด๋ ค์์ด ๋ฐ๋ฅธ๋ค. ๊ฒฐ๊ตญ ์ ์ ์ ์์ ํํ์ ๋ณด๋ ๊ฒ๋ ํ๋์ ๋ฐฉ๋ฒ์ด ๋ ์ ์๋ค.
Interface Segregation Principle (์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น)
์ธํฐํ์ด์ค์ ๊ท๋ชจ๋ฅผ ๋๋ฌด ํฌ๊ฒ ๊ตฌํํ์ฌ ๊ตฌํํ ๊ฐ์ฒด๊ฐ ์ธ๋ฐ ์๋ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ๋ง ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ง๋ค์ง ๋ง๊ณ , ์ธํฐํ์ด์ค๋ฅผ ์ข๋ ์ธ๋ถํ ํ์ฌ ๊ตฌํํ๋ผ๋ ๋ป์ด๋ค.
- ์ฝ๋ ์์
์์ด์ ๊ฒฝ์ฐ ๋๋ฌผ ํ๋กํ ์ฝ์ ์ฑํํ์์๋ ๋ฉ์๋ ๋๊ฐ๋ ๊ตฌํํ์ง ์๊ฒ ๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ 3๊ฐ์ ์ธํฐํ์ด์ค(ํ๋กํ ์ฝ)๋ฅผ ๋ง๋ค์ด ๊ฐ๊ฐ ํ์ํ ํ๋กํ ์ฝ๋ง ์ฑํํ๋ ๊ฒ์ด๋ค.
ํน์ฑ ๋ณ๋ก ํ๋กํ ์ฝ์ ์ ๋ฆฌํ ๊ฒฝ์ฐ ๊ฐ๊ฐ ํ์ํ ํ๋กํ ์ฝ๋ง ์ด์ฉ๊ฐ๋ฅํ๋ค.
Dependency Inversion Principle (์์กด ์ญ์ ์์น)
๊ฐ์ฒด๋ ๊ฐ์ฒด(์ ์์ค ๋ชจ๋)๋ณด๋ค ์ธํฐํ์ด์ค(๊ณ ์์ค ๋ชจ๋)์ ์์กดํด์ผ ํ๋ค.
๊ณ ์์ค ๋ชจ๋ - ์ธํฐํ์ด์ค ๊ฐ์ ์ถ์์ ๊ฐ๋
์ ์์ค ๋ชจ๋ - ๊ตฌํ๋ ๊ฐ์ฒด
์๋์ฐจ๋ฅผ ๋ง๋ค๋ ํ๋์ ํ์ด์ด(์ ์์ค ๋ชจ๋) ์ข ๋ฅ๋ง ์์กดํ์ฌ ๋ฐํด๋ฅผ ๋ง๋ค ๊ฒฝ์ฐ ์ดํ์ ๋ฐํด๋ฅผ ๊ต์ฒดํ ๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค. ์ด๋ฅผ ํด๊ฒฐํด ์ฃผ๊ธฐ์ํด์๋ ๋ชจ๋ ํ์ด์ด ์ข ๋ฅ์ ํธํ๋ ์ ์๋ ๋ฐํด(๊ณ ์์ค ๋ชจ๋)๋ฅผ ๋ง๋ค์ด ํ์ด์ด๋ฅผ ๊ทธ ๋ฐํด์ ์์กด ์์ผ ์ฃผ๋ฉด๋๋ค.
- ์ฝ๋ ์์
๊ทธ๋ฆผ 1
๊ทธ๋ฆผ 2
๋ง์ฝ ์๋์ฐจ์ ํ๊ตญํ์ด์ด์ ์์กดํ์ฌ ํ ๊ฐ์ง ํ์ด์ด๋ง ํธํ๋๋๋ก ํ๋ค๋ฉด ๊ทธ๋ฆผ 2์ฒ๋ผ ๋ค๋ฅธ ํ์ด์ด๋ก ๊ต์ฒด๋ฅผ ํ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๊ทธ๋ฌ๋ ํ์ด๋ธ๋ฆฌ๋๋ฐํด ํ๋กํ ์ฝ์ ์์กดํ์ฌ ํ์ด์ด๋ฅผ ์์ฐํ ๊ฒฝ์ฐ ํ์ด์ด๋ฅผ ๋ณ๊ฒฝํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
'๐ etc' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[UML] ์ํ์ค ๋ค์ด์ด๊ทธ๋จ (Sequense Diagram) (0) | 2022.05.18 |
---|---|
[UML] ํด๋์ค ๋ค์ด์ด ๊ทธ๋จ (Class Diagram) (0) | 2022.05.18 |
์์ฃผ์ฐ๋ git ๋ช ๋ น์ด (0) | 2022.04.12 |
Git ๊ฐ๋ / ์ฉ์ด ์ ๋ฆฌ (0) | 2022.04.11 |