๐ Backend/๐ Spring
SOLID ์์น
DevPoong
2022. 7. 2. 13:24
2022.06.29
SOLID ์์น
์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น
- SRP: ๋จ์ผ ์ฑ ์ ์์น(Single Responsibility principle)
- OCP: ๊ฐ๋ฐฉ-ํ์ ์์น(Open/closed principle)
- LSP: ๋ฆฌ์ค์ฝํ ์นํ ์์น(Liskov Substitution principle)
- ISP: ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น(Interface Segregation principle)
- DIP: ์์กด๊ด๊ณ ์ญ์ ์์น(Dependency Inversion Principle )
1. SRP ๋จ์ผ ์ฑ ์ ์์น
- ํ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ง๋ค.
- ํ๋์ ์ฑ ์์ด๋ผ๋ ๊ฒ์ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ํด ์๋ ์๊ณ ์์ ์๋ ์๊ธฐ์ ๋ชจํธํ๋ค.
- ๋ณ๊ฒฝ์ด ์ค์ํ ๊ธฐ์ค์ด๋ค. ๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธํจ๊ณผ๊ฐ ์ ๋ค๋ฉด SRP๋ฅผ ์ ๋ฐ๋ฅธ ๊ฒ์ด๋ค.
2. OCP ๊ฐ๋ฐฉ-ํ์ ์์น
- ์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค ์์ง๋ง ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค.
- ๋คํ์ฑ์ ํ์ฉํ์ฌ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉํฅ์ผ๋ก ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ๋ฅผ ์๊ฐํ๋ฉด ๋๋ค.๋ฌธ์ ์ํฉ
- ๋ฌธ์ ์ํฉ
- MemberService ํด๋์ค
MemberRepository m = new MemoryMemberRepository(); //๊ธฐ์กด
MemberRepository m = new JdbcMemberRepository(); //๋ณ๊ฒฝ
(1) ๋ฌธ์ ์
MemberService๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ์ ํํด์ผ ํ๋ฏ๋ก ๋ณ๊ฒฝ์ด ๋ฐ์ํด์ผ ํ๋ค! => OCP์์น X
(2) ํด๊ฒฐ๋ฐฉ๋ฒ
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์กฐ๋ฆฝ, ์ค์ ์๊ฐ ํ์ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๊ฑฐ๋ฅผ ์คํ๋ง์์๋ Spring Container๊ฐ ๋์ ํด์ฃผ๋ฉฐ OCP ์์น์ ์งํค๊ธฐ ์ํด์ DI, IOC Container๊ฐ ํ์ํ ๊ฒ์.
3. LSP ๋ฆฌ์ค์ฝํ ์นํ ์์น
- ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค.
- ๋คํ์ฑ์์ ํ์ ํด๋์ค๋ ์ธํฐํ์ด์ค์ ๊ท์ฝ์ ๋ฌด์กฐ๊ฑด ์ง์ผ์ผ ํ๋ฉฐ, ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ ๋ฏฟ๊ณ ์ฌ์ฉํ๋ ค๋ฉด ์ด ์์น์ด ํ์ํ๋ค.
4. ISP ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
- ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค.
-
EX) ์๋์ฐจ ์ธํฐํ์ด์ค -> ์ด์ ์ธํฐํ์ด์ค, ์ ๋น ์ธํฐํ์ด์ค๋ฅผ ๋ถ๋ฆฌ
- ์ธํฐํ์ด์ค๋ฅผ ๋ถ๋ฆฌํ์ ๋ ์ธํฐํ์ด์ค ์์ฒด๊ฐ ๋ณํด๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉฐ ์ธํฐํ์ด์ค๊ฐ ๋ช ํํด์ง๊ณ ๋์ฒด ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
5. DIP ์์กด๊ด๊ณ ์ญ์ ์์น
- ํ๋ก๊ทธ๋๋จธ๋ "์ถ์ํ์ ์์กดํด์ผ ํ๋ค. ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค" ์์กด์ฑ ์ฃผ์ ์ ์ด ์์น์ ๋ฐ๋ฅด๋ ๋ฐฉ๋ฒ ์ค ํ๋.
- ๊ตฌํ ํด๋์ค์ ์์กดํ์ง ๋ง๊ณ ์ธํฐํ์ด์ค์ ์์กดํ๋ผ!
- ์ญํ (Role)์ ์์กดํ๊ฒ ํด์ผ ํ๋ค๋ ๊ฒ๊ณผ ๊ฐ์ ๋ง์ด๋ค.
- ์์ OCP์์ ์ค๋ช ํ MemberService๋ ์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค๋ฅผ ๋์์ ์์กดํ๋ค.
MemberRepository m = new MemoryMemberRepository();
- ์์ฒ๋ผ ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ์ ํํ๋ฉด DIP๋ฅผ ์๋ฐํ๊ฒ ๋๋ค.
- ๋ฐ๋ผ์ MemberService๊ฐ MemberRepository ์ธํฐํ์ด์ค์๋ง ์์กดํ๋๋ก ์ค๊ณํด์ผํจ.
6. ์ ๋ฆฌ
- ๊ฐ์ฒด์งํฅ์ ํต์ฌ์ ๋คํ์ฑ์ด๋ค.
- ๋คํ์ฑ ๋ง์ผ๋ก๋ ์ฝ๊ฒ ๋ถํ์ ๊ฐ์ ๋ผ์ฐ๋ฏ์ด ๊ฐ๋ฐํ ์ ์๋ค.
- ๋คํ์ฑ ๋ง์ผ๋ก๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ ํจ๊ป ๋ณ๊ฒฝ๋๋ค.
- ๋คํ์ฑ ๋ง์ผ๋ก๋ OCP, DIP๋ฅผ ์งํฌ ์ ์๋ค.