[Spring] OOP 5๊ฐ์ง ์ค๊ณ์์น
by rlaehddnd04221. ์คํ๋ง์ด๋?
- ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ๋ง์ด๋ผ๊ณ ํจ์ ์คํ๋ง ๋ถํธ, ์คํ๋ง ํ๋ ์์ํฌ ๋ฑ์ ๋ชจ๋ ํฌํจํ ์คํ๋ง ์ํ๊ณ๋ก, ์ข์ ๊ฐ์ฒด ์งํฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๊ฒ ๋์์ฃผ๋ ํ๋ ์์ํฌ์ ๋๋ค.
์คํ๋ง ํ๋ ์์ํฌ
- ํต์ฌ ๊ธฐ์ : ์คํ๋ง DI ์ปจํ ์ด๋, AOP, ์ด๋ฒคํธ, ๊ธฐํ
- ์น ๊ธฐ์ : ์คํ๋ง MVC, ์คํ๋ง WebFlux
- ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ : ํธ๋์ญ์ , JDBC, ORM ์ง์, XML ์ง์
- ๊ธฐ์ ํตํฉ : ์บ์, ์ด๋ฉ์ผ, ์๊ฒฉ์ ๊ทผ, ์ค์ผ์ฅด๋ง
- ํ ์คํธ : ์คํ๋ง ๊ธฐ๋ฐ ํ ์คํธ ์ง์
- ์ธ์ด : ์ฝํ๋ฆฐ, ๊ทธ๋ฃจ๋น
์คํ๋ง ๋ถํธ
- ์คํ๋ง์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์, ์ต๊ทผ์๋ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ
- ๋จ๋ ์ผ๋ก ์คํํ ์ ์๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ์์ฑ
- ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ๋ฉด ํฐ์บฃ ๊ฐ์ ์น์๋ฒ๋ฅผ ๋ด์ฅํด์ ๋ณ๋์ ์น์๋ฒ๋ฅผ ์ค์นํ ํ์๊ฐ ์์
- ์์ฌ์ด ๋น๋ ๊ตฌ์ฑ์ ์ํ ์คํํฐ ์ข ์์ฑ ์ ๊ณต
2. ์ข์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋?
๊ฐ์ฒด ์งํฅ ํน์ง
- ์ถ์ํ
- ์บก์ํ
- ์์
- ๋คํ์ฑ
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก๊ทธ๋จ์ ์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋๊ท๋ชจ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋ง์ด ์ฌ์ฉ๋๋ค.
๋คํ์ฑ(Polymorphism)
์ญํ ๊ณผ ๊ตฌํ์ผ๋ก ๊ตฌ๋ถํ๋ฉด ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค.
ํด๋ผ์ด์ธํธ(์ด์ ์)๋ ๋์์ ์ญํ (์ธํฐํ์ด์ค)๋ง ์๊ณ , ๊ตฌํ ๋์(๊ฐ์ฒด)์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ ํ์ ์์!
๊ทธ๋ฆฌ๊ณ ๊ตฌํ ๋์์ ๋ด๋ถ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ํด๋ผ์ด์ธํธ๋ ์ํฅ์ ๋ฐ์ง ์์.
+ ๊ตฌํ๋์ ์์ฒด๋ฅผ ๋ณ๊ฒฝํด๋ ์ํฅ์ ๋ฐ์ง ์์. ex) K3 -> Tesla
โ๏ธ ๊ฐ์ฒด ์ค๊ณ์ ์ญํ (์ธํฐํ์ด์ค)์ ๋จผ์ ๋ถ์ฌํ๊ณ , ๊ทธ ์ญํ ์ ์ํํ๋ ๊ตฌํ ๊ฐ์ฒด ๋ง๋ค๊ธฐ!
์ฅ์
- ๋คํ์ฑ์ ์ด์ฉํ๋ฉด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์คํ ์์ ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ์๋ฒ์ ๊ตฌํ ๊ธฐ๋ฅ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
ํ๊ณ
- ๋ง์ฝ ์ธํฐํ์ด์ค ์์ฒด๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ, ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋์ ํฐ ๋ณ๊ฒฝ์ด ๋ฐ์ํฉ๋๋ค.
๋ฐ๋ผ์ ์ธํฐํ์ด์ค๋ฅผ ์์ ์ ์ผ๋ก ์ ์ค๊ณํ๋ ๊ฒ์ด ์ค์ํ๋ค.
์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น (SOLID)
1. SRP (Single Responsibility Principle) / ๋จ์ผ ์ฑ ์ ์์น
- ํ ํด๋์ค๋ ํ๋์ ์ฑ ์(๋ชฉ์ )๋ง ๊ฐ์ ธ์ผ ํ๋ฉฐ ๋ณ๊ฒฝ๋๋ ์ด์ ๋ ํ๋์ฌ์ผ ํ๋ค.
- ์ฝ๊ฒ๋งํด, ๊ฐ์ฒด๊ฐ ๋ด๋นํ๋ ๋์์ด ๋ง์์ง์๋ก ํด๋น ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์ํฅ๋์ ์๊ณผ ๋ฒ์๊ฐ ๋งค์ฐ ์ปค์ง๊ธฐ ๋๋ฌธ์ ํน์ ๊ฐ์ฒด์ ์ฑ ์ ์์กด์ฑ ๊ณผ์ค์ ์ต๋ํ ์ง์ํ์๋ ์์น
2. OCP (Open/Closed Principle) / ๊ฐ๋ฐฉ-ํ์ ์์น
- ๋ณ๊ฒฝ์๋ ๋ซํ์๊ณ ํ์ฅ์๋ ์ด๋ ค์์ด์ผ ํ๋ค.
- ๊ตฌํ์ฒด์ ์์กดํ๊ธฐ๋ณด๋ค ์ ์ํ ์ถ์ํ์ ์์กดํ๋๋ก ์ฝ๋๋ฅผ ์์ฑ ํ๋ค.
- ๊ฐ๋ฐฉ-ํ์ ์์น์ ๋ฐ๋ฅด์ง ์๋๋ค๊ณ ํด์ ๊ฐ์ฒด ์งํฅ ์ธ์ด(Java, C++ ๋ฑ)์ ๊ตฌํ์ด ๋ถ๊ฐ๋ฅํ ๊ฒ์ ์๋์ง๋ง ์ด ์์น์ ๋ฌด์ํ๊ณ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค๋ฉด, ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ธ ์ ์ฐ์ฑ, ์ฌ์ฌ์ฉ์ฑ, ์ ์ง๋ณด์์ฑ ๋ฑ์ ๊ฒฐ์ฝ ์ป์ ์ ์๋ค.
๋ฌธ์ ์
MemberRepository m = new MemoryMemberRepository(); //๊ธฐ์กด ์ฝ๋
MemberRepository m = new JdbcMemberRepository(); //๋ณ๊ฒฝ ์ฝ๋
๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค.
๋ถ๋ช
๋คํ์ฑ์ ์ฌ์ฉํ์ง๋ง OCP ์์น์ ์งํฌ ์ ์๋ค. (๋ณ๊ฒฝใดใด ํ์ฅ ใฑใฑ)
์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ํ ๊น?
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์กฐ๋ฆฝ, ์ค์ ์๊ฐ ํ์ํ๋ค.
3. LSP (Liskov substitution principle) / ๋ฆฌ์ค์ฝํ ์นํ ์์น
- ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค
- ๋คํ์ฑ์์ ํ์ ํด๋์ค๋ ์ธํฐํ์ด์ค ๊ท์ฝ์ ๋ค ์ง์ผ์ผ ํ๋ค๋ ๊ฒ, ๋คํ์ฑ์ ์ง์ํ๊ธฐ ์ํ ์์น, ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ ๋ฏฟ๊ณ ์ฌ์ฉํ๋ ค๋ฉด, ์ด ์์น์ด ํ์ํ๋ค.
์) ์๋์ฐจ ์ธํฐํ์ด์ค์ ์์ ์ ์์ผ๋ก ๊ฐ๋ผ๋ ๊ธฐ๋ฅ, ๋ค๋ก ๊ฐ๊ฒ ๊ตฌํํ๋ฉด LSP ์๋ฐ, ๋๋ฆฌ๋๋ผ๋ ์์ผ๋ก ๊ฐ์ผํจ
4. ISP (Interface Segregation Principle) / ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
- ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ ๊ฐ ๋ณด๋ค ๋ซ๋ค๋ ์์น
- ์๋์ฐจ ์ธํฐํ์ด์ค -> ์ด์ , ์ ๋น ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌ
- ์ฌ์ฉ์ ํด๋ผ์ด์ธํธ -> ์ด์ ์, ์ ๋น์ฌ ํด๋ผ์ด์ธํธ๋ก ๋ถ๋ฆฌ
- ์ด๋ ๊ฒ ๋ถ๋ฆฌํ๋ฉด ์ ๋น ์ธํฐํ์ด์ค ์์ฒด๊ฐ ๋ณํด๋ ์ด์ ์ ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์์
-> ์ธํฐํ์ด์ค๊ฐ ๋ช ํํด์ง๊ณ ๋์ฒด ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
5. DIP (Dependency Inversion Principle) / ์์กด๊ด๊ณ ์ญ์ ์์น
- ํ๋ก๊ทธ๋๋จธ๋ ์ถ์ํ์ ์์กดํ๊ณ , ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค๋ ์์น
- ์ฝ๊ฒ๋งํด, ๊ตฌํ ํด๋์ค์ ์์กดํ์ง ๋ง๊ณ , ์ธํฐํ์ด์ค์ ์์กดํ๋ผ๋ ๋ป
- ์์ ์ด์ผ๊ธฐํ ์ญํ ์ ์์กดํ๊ฒ ํด์ผํ๋ค๋ ๊ฒ๊ณผ ๊ฐ๋ค. ์ธํฐํ์ด์ค์ ์์กดํด์ผ ์ ์ฐํ๊ฒ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
- ๊ตฌํ์ฒด์ ์์กดํ๊ฒ ๋๋ฉด ๋ณ๊ฒฝ์ด ์ด๋ ค์์ง.
๋ฌธ์ ์
๊ทธ๋ฐ๋ฐ OCP์์ ์ค๋ช ํ MemberService๋ ์ธํฐํ์ด์ค์ ์์กดํ์ง๋ง, ๊ตฌํ ํด๋์ค๋ ๋์์ ์์กดํ๋ค.
MemberService ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ์ ํ.
MemberRepository m = new MemoryMemberRepository(); DIP ์๋ฐ
์ ๋ฆฌํ์๋ฉด,
๊ฐ์ฒด ์งํฅ์ ํต์ฌ์ ๋คํ์ฑ์ธ๋ฐ,
> ๋คํ์ฑ ๋ง์ผ๋ก๋ ์ฝ๊ฒ ๋ถํ์ ๊ฐ์ ๋ผ์ฐ๋ฏ์ด ๊ฐ๋ฐ์ ํ ์ ์๊ณ , ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ ํจ๊ป ๋ณ๊ฒฝ๋๋ค.
> ์ฆ, ๋คํ์ฑ ๋ง์ผ๋ก๋ OCP, DIP๋ฅผ ์งํฌ ์ ์๋ค.
> ๋ฌด์ธ๊ฐ ๋ ํ์ํ ์ํฉ.
๋ค์ ์คํ๋ง์ผ๋ก ๊ฐ๋ด ์๋ค.
์คํ๋ง์ ๋ค์ ๊ธฐ์ ๋ก ๋คํ์ฑ + OCP, DIP๋ฅผ ๊ฐ๋ฅํ๊ฒ ์ง์ํด์ค๋๋ค.
- DI : ์์กด๊ด๊ณ, ์์กด์ฑ ์ฃผ์
- DI ์ปจํ ์ด๋ ์ ๊ณต
๋ฒ์ธ๋ก DI ๊ฐ๋ ์ ๋ง๋ก ์ค๋ช ํด๋ ์ดํด๊ฐ ์ ์๋๋ค. ์ฝ๋๋ก ์ง๋ด์ผ ํ์์ฑ์ ์๊ฒ ๋๋ค.
- ํด๋ผ์ด์ธํธ ์ฝ๋์ ๋ณ๊ฒฝ ์์ด ๊ธฐ๋ฅ ํ์ฅ
์ค๋ฌด์์๋
- ๋ชจ๋ ์ค๊ณ์ ์ญํ (์ธํฐํ์ด์ค)๊ณผ ๊ตฌํ(๊ฐ์ฒด)๋ฅผ ๋ถ๋ฆฌํ์.
- ํ์ง๋ง ์ธํฐํ์ด์ค๋ฅผ ๋์ ํ๋ฉด ์ถ์ํ๋ผ๋ ๋น์ฉ์ด ๋ฐ์ํ๋ค. ๋ง์ฝ์ ๊ธฐ๋ฅ์ ํ์ฅํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด, ๊ตฌํ์ฒด ํด๋์ค๋ฅผ ์ง์ ์ฌ์ฉํ๊ณ , ํฅํ ๊ผญ ํ์ํ ๋ ๋ฆฌํํฐ๋งํด์ ์ธํฐํ์ด์ค๋ฅผ ๋์ ํ๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring / AppConfig๋ฅผ ์ด์ฉํ ๊ธฐ์กด์ OCP, DIP ๋ฌธ์ ํด๊ฒฐ (1) | 2023.01.26 |
---|---|
Spring / ์์ ์๋ฐ๊ธฐ๋ฐ ์์ ( spring framework no use ) (0) | 2023.01.24 |
Spring ์ ๋ฌธ / 7. AOP (0) | 2023.01.19 |
Spring ์ ๋ฌธ / 6. DB ์ ๊ทผ ๊ธฐ์ (0) | 2023.01.19 |
Spring ์ ๋ฌธ / 5. ํ์ ๊ด๋ฆฌ ์์ - ์น MVC ๊ฐ๋ฐ (1) | 2023.01.17 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422