-
[๋์์ธํจํด] ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น SOLID(feat: Spring)๐ปProgramming/๋์์ธํจํด 2024. 3. 22. 18:45
SOLID ์์น์ ์์์ผ ํ๋ ์ด์
์์คํ ์ ์๋ก์ด ๊ธฐ๋ฅ์ด ํ์ฅ๋๊ฑฐ๋ ๋ณ๊ฒฝ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ ๊ธฐ์กด ๊ธฐ๋ฅ๋ค์ด ์ํฅ์ ์ ๊ฒ ๋ฐ๋ ๊ฒ์ด ์ข์ ์ค๊ณ์ด๊ธฐ ๋๋ฌธ. ์ด ์ข์ ์ค๊ณ๋ฅผ ํ๊ธฐ ์ํด ๋ํ๋ ๋ค์ฏ๊ฐ์ง ์์น์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด SOLID์์น์ด๋ค.
์ด ์์น์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ํ์ฅํ๊ณ , ์ ์ง ๋ณด์ ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ฌ์์ง๋ฉฐ, ๋ถํ์ํ ๋ณต์ก์ฑ์ ์ ๊ฑฐํด ๊ฐ๋ฐ์ ์์ฐ์ฑ์ ๋์ผ ์ ์๋ค.
๋ํ, ๋ฉด์ ๋จ๊ณจ ์ง๋ฌธ์ด๋ผ๊ณ ํ๋ ์ ๊ธฐ์ตํด๋๋ฉด ์ข๊ฒ ๋ค.
1. SRP(Single Responsibility Principle): ๋จ์ผ ์ฑ ์ ์์น
- ํ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผํ๋ค. -> ํ ํด๋์ค๊ฐ ์ฌ๋ฌ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ๋ฉด ์๋๋ค๋ ๊ฒ.
- ๋ง์ฝ ํ ํด๋์ค๊ฐ ์ฌ๋ฌ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ๋ฉด, ๋ณ๊ฒฝ์ด ์ผ์ด๋ฌ์ ๋ ์์ ํด์ผํ ์ฝ๋๊ฐ ์ฆ๊ฐ. ex. A๋ฅผ ์์ ํ์๋๋ B๋ฅผ ์์ ํ๊ณ , C์์ ํด์ผํ๊ณ .. ์ฐ์์ ์ผ๋ก ์์ -> ํ ์ฑ ์์ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ ๋ค๋ฅธ ์ฑ ์์ ๋ณ๊ฒฝ์ผ๋ก์ ์ฐ์ ์์ฉ์ ๊ทน๋ณต ๊ฐ๋ฅ.
- ํ ์ฑ ์์ด๋ผ๋ ๊ธฐ์ค์ด ๋ชจํธํ์ง๋ง, ์ค์ํ ๊ธฐ์ค์ ๋ณ๊ฒฝ์ด๋ค. ๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธ ํจ๊ณผ๊ฐ ์ ๋ค๋ฉด ๋จ์ผ ์ฑ ์ ์์น์ ์ ๋ฐ๋ฅธ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
2. OCP(Open/Closed Principle): ๊ฐ๋ฐฉ ํ์ ์์น
- ํ์ฅ์๋ ์ด๋ ค ์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค. -> ๋คํ์ฑ์ ํ์ฉ
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋ก์ด ํด๋์ค๋ฅผ ํ๋ ๋ง๋ค์ด์ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํ.
- ์๋ฅผ ๋ค์ด ์๋์ฐจ ๊ธฐ๋ฅ์ ๋ช ์ํด๋์ ์ธํฐํ์ด์ค๊ฐ ์๊ณ , ์ด ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ํ ์ฌ๋ผ๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ์ ๋ค์์ค๋ก ๋ฐ๊พธ๊ณ ์ถ๋ค. ๊ทธ๋ฌ๋ฉด ์๋์ฐจ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์ ๋ค์์ค ๊ตฌํ ํด๋์ค๋ฅผ ํ๋ ๋ ๋ง๋ค์ด์ผ์ง ํ ์ฌ๋ผ๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ๊ณ ์ณ์ ์ ๋ค์์ค ํด๋์ค๋ก ๋ฐ๊พธ์ง ๋ง๋ผ๋ ์ด์ผ๊ธฐ์ด๋ค. -> ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ.(์ญํ : ์ธํฐํ์ด์ค, ๊ตฌํ: ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ํด๋์ค)
- ์ ๋ฆฌํ์๋ฉด, ์ถ์ํ ์ฌ์ฉ์ ํตํ ๊ด๊ณ ๊ตฌ์ถ์ ๊ถ์ฅ ์๋ฏธ
OCP(Open/Closed Principle) ๋ฌธ์ ์
MemberService๊ฐ MemberRepository๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ์ ํํ๋ค.
MebmerRepository memberRepository = new MemoryMemberRepository(); // ๊ธฐ์กด MemberRepository memberRepository = new JdbcMemberRepository(); // ๋ณ๊ฒฝ
์ด ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํ๋ค. -> ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์กฐ๋ฆฝ, ์ค์ ์๊ฐ ํ์ํ๋ค.
3. LSP(Liskov Substitution Principle): ๋ฆฌ์ค์ฝํ ์นํ ์์น
- ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผํ๋ค.
- ๋คํ์ฑ์์ ํ์ ํด๋์ค๋ ์ธํฐํ์ด์ค ๊ท์ฝ์ ๋ค ์ง์ผ์ผํ๋ค. ์๋ฅผ ๋ค์ด ์๋์ฐจ ์ธํฐํ์ด์ค์์ ์ฌ์ฉํ๋ ์์ ์ธํฐํ์ด์ค๋ ๋ค๋ก๊ฐ๋ฉด์๋๋ค. ์์ผ๋ก ๊ฐ์ผํ๋ค. ์ค๋ฅ ๋ฐ์ ์ฌ๋ถ์ ๊ธฐ์ค์ด ์๋๋ผ ํ์ ํด๋์ค๊ฐ ์์ ์ธํฐํ์ด์ค์ ๊ท์ฝ์ ๊ผญ ์ง์ผ์ ํ๋ก๊ทธ๋๋ฐ ํ์ฌ์ผ ํ๋ค. -> ์ด๋ฅผ ํตํด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ฅผ ๋ฏฟ๊ณ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ.
4. ISP(Interface Segregation Principle): ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
- ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๊ฐ์ ์ฌ์ฉ์ ๋ง๊ฒ๋ ์ ๋ถ๋ฆฌํด์ผํ๋ค.
- ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค.
- ex. ์๋์ฐจ ์ธํฐํ์ด์ค -> ์ด์ ์ธํฐํ์ด์ค, ์ ๋น ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌ, ์ฌ์ฉ์ ํด๋ผ์ด์ธํธ -> ์ด์ ์ ํด๋ผ์ด์ธํธ, ์ ๋น์ฌ ํด๋ผ์ด์ธํธ๋ก ๋ถ๋ฆฌ
- -> ์ด๋ฅผ ํตํด ์ ๋น ์ธํฐํ์ด์ค ์์ฒด๊ฐ ๋ณํด๋ ์ด์ ์ ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
- ISP ์์น ์ฃผ์์ : ํ ๋ฒ ์ธํฐํ์ด์ค๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ตฌ์ฑํด๋๊ณ , ๋ ๋ถ๋ฆฌํ๋ฉด ์๋จ. -> ์ธํฐํ์ด์ค๋ ํ ๋ฒ ๊ตฌ์ฑํ๋ฉด ์ต๋ํ ๋ณํ๋ฉด ์๋๋ ์ ์ฑ ๊ฐ๋
5. DIP(Dependency Inversion Principle): ์์กด ์ญ์ ์์น
- ํด๋์ค๊ฐ ์๋ ์ธํฐํ์ด์ค์ ์์กดํด๋ผ. <- ์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค.
- ์ด๋ฅผ ํตํด ์ ์ฐํ๊ฒ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝ ๊ฐ๋ฅ. ๊ตฌํ์ฒด์ ์์กด์ ๋ณ๊ฒฝ์ ์ด๋ ต๊ฒ ๋ง๋ฌ.
- ์๊น OCP์์ ์ฌ์ฉํ ์์์ ๊ฐ๋ค.
MebmerRepository memberRepository = new MemoryMemberRepository(); // ๊ธฐ์กด MemberRepository memberRepository = new JdbcMemberRepository(); // ๋ณ๊ฒฝ
์ด๋ ๊ฒ ํ์ง๋ง๋์๊ธฐ. -> DIP ์๋ฐ
์ธํฐํ์ด์ค ๋์ ์ ๋จ์
์ถ์ํ๋ผ๋ ๋น์ฉ ๋ฐ์
-> ๊ธฐ๋ฅ์ ํ์ฅํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด, ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ง์ ์ฌ์ฉํ๊ณ ํฅํ ๊ผญ ํ์ํ ๋ ๋ฆฌํฉํ ๋งํ์ฌ ์ธํฐํ์ด์ค๋ฅผ ๋์ ํ๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด๋ค.
References