๐ ๊น์ํ ๋์ "์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ" ๊ฐ์ ๋ฃ๊ณ ์ ๋ฆฌ
๋ชฉ์ฐจ
Section 1 . ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
์คํ๋ง์ด๋?
โ๏ธ ์คํ๋ง ์ํ๊ณ
โญ ํ์!
- ์คํ๋ง ํ๋ ์์ํฌ
- ์คํ๋ง ๋ถํธ : ์คํ๋ง ๊ธฐ์ ๋ค์ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ ์ฃผ๋ ๊ธฐ์
๐ ์ ํ
- ์คํ๋ง ๋ฐ์ดํฐ : ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋์์ ์ฃผ๋ ๊ธฐ์ (๊ฐ์ฅ ๋ง์ด ์ฐ๋๊ฒ Spring Data JPA)
- ์คํ๋ง ์ธ์ : ์ธ์ ๊ธฐ๋ฅ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ ์ฃผ๋ ๊ธฐ์
- ์คํ๋ง ์ํ๋ฆฌํฐ : ๋ณด์
- ์คํ๋ง Rest Docs : API ๋ฌธ์์ ํ ์คํธ๋ฅผ ์ฎ์ด ํธ๋ฆฌํ๊ฒ ๋์์ ์ฃผ๋ ๊ธฐ์
- ์คํ๋ง ๋ฐฐ์น : ๋ฐฐ์น ์ฒ๋ฆฌ์ ํนํ๋ ๊ธฐ์
- ์คํ๋ง ํด๋ผ์ฐ๋ : ํด๋ผ์ฐ๋์ ํนํ๋ ๊ธฐ์
- ๋ฑ๋ฑ
โ๏ธ ์คํ๋ง ํ๋ ์ ์ํฌ
- ํต์ฌ ๊ธฐ์ : ์คํ๋ง DI ์ปจํ ์ด๋, AOP, ์ด๋ฒคํธ, ๊ธฐํ (๊ฐ์์ ์ด์ !!)
- ์น ๊ธฐ์ : ์คํ๋ง MVC, ์คํ๋ง WebFlux
- ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ : ํธ๋์ญ์ , JDBC, ORM ๊ธฐ์, XML ์ง์
- ๊ธฐ์ ํตํฉ: ์บ์, ์ด๋ฉ์ผ, ์๊ฒฉ์ ๊ทผ, ์ค์ผ์ฅด๋ง
- ํ ์คํธ: ์คํ๋ง ๊ธฐ๋ฐ ํ ์คํธ ์ง์
- ์ธ์ด: ์ฝํ๋ฆฐ, ๊ทธ๋ฃจ๋น
- ์ต๊ทผ์๋ ์คํ๋ง ๋ถํธ๋ฅผ ํตํด์ ์คํ๋ง ํ๋ ์์ํฌ์ ๊ธฐ์ ๋ค์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ
โ๏ธ ์คํ๋ง ๋ถํธ
- ์คํ๋ง์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์, ์ต๊ทผ์๋ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ
- ๋จ๋ ์ผ๋ก ์คํํ ์ ์๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ์์ฑ
- Tomcat ๊ฐ์ ์น ์๋ฒ๋ฅผ ๋ด์ฅํด์ ๋ณ๋์ ์น ์๋ฒ๋ฅผ ์ค์นํ์ง ์์๋ ๋จ
- ์์ฌ์ด ๋น๋ ๊ตฌ์ฑ์ ์ํ starter ์ข ์์ฑ ์ ๊ณต
- ์คํ๋ง๊ณผ 3rd party(์ธ๋ถ) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋ ๊ตฌ์ฑ, ์์กด์ฑ ๋ฒ์ ๊ด๋ฆฌ
- ๋ฉํธ๋ฆญ, ์ํ ํ์ธ, ์ธ๋ถ ๊ตฌ์ฑ ๊ฐ์ ํ๋ก๋์ ์ค๋น ๊ธฐ๋ฅ ์ ๊ณต (๋ชจ๋ํฐ๋ง ์ ๊ณต)
- ๊ด๋ก์ ์ํ ๊ฐ๊ฒฐํ ์ค์
- ์คํ๋ง ๋ถํธ๋ ์คํ๋ง๊ณผ ๋ณ๋๋ก ์ฌ์ฉ๊ฐ๋ฅํ ๊ฒ์ด ์๋๋ค! ์คํ๋ง ํ๋ ์์ํฌ ์์์ ํธ๋ฆฌํ๊ฒ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ๋๋๋ค!
โ๏ธ ์คํ๋ง ๋จ์ด?
์คํ๋ง์ด๋ผ๋ ๋จ์ด๋ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ฌ์ฉ๋๋ค.
- ์คํ๋ง DI ์ปจํ ์ด๋ ๊ธฐ์
- ์คํ๋ง ํ๋ ์์ํฌ
- ์คํ๋ง ๋ถํธ, ์คํ๋ง ํ๋ ์์ํฌ ๋ฑ์ ๋ชจ๋ ํฌํจํ ์คํ๋ง ์ํ๊ณ
โ๏ธ ์คํ๋ง ์ ๋ง๋ค์๋์?
ํต์ฌ ๊ฐ๋ : ์ด ๊ธฐ์ ์ ์ ๋ง๋ค์๋๊ฐ? ์ด ๊ธฐ์ ์ ํต์ฌ ์ปจ์ ์? (๋ก๋์กด์จ์ด๋ ์ ๊ฒ ํ๋ฌ๊ฐ ์ ๋ง๋ค์์๊น!?!?!)
โ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ง๋ค๊ณ , DB ์ ๊ทผ ํธ๋ฆฌํ๊ฒ ํด์ฃผ๋ ๊ธฐ์ ?
โ์ ์์ ๋ถ ํ๋ ์์ํฌ?
โ์น ์๋ฒ๋ ์๋์ผ๋ก ๋์์ฃผ๊ณ ?
โํด๋ผ์ฐ๋, ๋ง์ดํฌ๋ก ์๋น์ค?
์ธ๊ฑธ๊น?? โ ์ด๊ฑด ๋ค ๊ฒฐ๊ณผ๋ฌผ์ผ ๋ฟ์ด๋ค
* ์คํ๋ง์ ์ง์ง ํต์ฌ
- ์คํ๋ง์ ์๋ฐ ์ธ์ด ๊ธฐ๋ฐ์ ํ๋ ์์ํฌ
- ์๋ฐ ์ธ์ด์ ๊ฐ์ฅ ํฐ ํน์ง - ๊ฐ์ฒด ์งํฅ ์ธ์ด
- ์คํ๋ง์ ๊ฐ์ฒด ์งํฅ ์ธ์ด๊ฐ ๊ฐ์ง ๊ฐ๋ ฅํ ํน์ง์ ์ด๋ ค๋ด๋ ํ๋ ์์ํฌ
- ์คํ๋ง์ ์ข์ ๊ฐ์ฒด ์งํฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๊ฒ ๋์์ฃผ๋ ํ๋ ์์ํฌ
์ฌ๋๋ค์ด ์คํ๋ง ๋ฑ์ฅ์ ์ด๊ดํ๋ ๊ฑด ์คํ๋ง ์ด์ ์ EJB๋ ๊ฐ์ฒด ์งํฅ์ ์ฅ์ ์ ๋ง์น๋ ๊ธฐ์ ์ด์๊ธฐ ๋๋ฌธ์ ์ด๊ฑธ ์ด๋ฆด ์ ์์๋ ๊ธฐ์ ์ ์ด๊ดํ๋ ๊ฑฐ๋ค!!
์ข์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋?
โ๏ธ ๊ฐ์ฒด ์งํฅ ํน์ง
- ์ถ์ํ
- ์บก์ํ
- ์์
- ๋คํ์ฑ
โ๏ธ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ๋ช
๋ น์ด์ ๋ชฉ๋ก์ผ๋ก ๋ณด๋ ์๊ฐ์์ ๋ฒ์ด๋ ์ฌ๋ฌ๊ฐ์ ๋
๋ฆฝ๋ ๋จ์,
์ฆ "๊ฐ์ฒด"๋ค์ ๋ชจ์์ผ๋ก ํ์ ํ๊ณ ์ ํ๋ ๊ฒ์ด๋ค. ๊ฐ์์ ๊ฐ์ฒด๋ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค. (ํ๋ ฅ)- ํผ์ ์๋ ๊ฐ์ฒด๋ ์๋ค.
- ๊ฐ์ฒด๋ผ๋ฆฌ ๋ฟ๋ง ์๋๋ผ ์๋ง์ ๊ฐ์ฒด ํด๋ผ์ด์ธํธ์ ๊ฐ์ฒด ์๋ฒ๋ ์๋ก ํ๋ ฅ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค. (์์ฒญ๊ณผ ์๋ตํ๋ฉด์)
- ์๋ฒ๋ผ๋ฆฌ๋, ์์คํ ๋ผ๋ฆฌ๋!
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก๊ทธ๋จ์ ์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋๊ท๋ชจ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋ง์ด ์ฌ์ฉ๋๋ค.
์ ์ฐํ๊ณ , ๋ณ๊ฒฝ์ด ์ฉ์ดํ๋ค?
๊ฐ์ฒด ๋จ์๋ก ๊ฐ๋ฐํ๊ธฐ ๋๋ฌธ์
- ๋ ๊ณ ๋ธ๋ญ ์กฐ๋ฆฝ, ํค๋ณด๋ ๋ง์ฐ์ค ๊ต์ฒด, ์ปดํจํฐ ๋ถํ ๊ต์ฒด ์ฒ๋ผ
- ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ณ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ๋ฉด์ ๊ฐ๋ฐํ ์ ์๋ ๋ฐฉ๋ฒ
์ด๋ฐ ๊ถ๊ทน์ ์ ์ฐํจ์ ๊ฐ์ง ์ ์๊ฒ ํ๋ ๊ฐ์ฒด ์งํฅ์ ํต์ฌ! ๋คํ์ฑ(Polymorphism) ์ด๋ค.
โ๏ธ ๋คํ์ฑ(Polymorphism)
์๋์ฐจ๋ผ๋ ์ญํ ์ด ์กด์ฌํ๊ณ ์ด ์๋์ฐจ ์ญํ ์ ๊ทธ ์ด๋ค ์ข ๋ฅ์ ์๋์ฐจ๊ฐ ๊ตฌํ(K3๋ , ์๋ฐ๋ผ๋ , ํ ์ฌ๋ผ๋ ) ๋์ด๋ ์ด์ ์๋ ์๋์ฐจ๋ฅผ ์ด์ ํ ์ ์๋ค. ์ด์ ์๋ ์๋์ฐจ ์ญํ ์ด๋ผ๋ ์ธํฐํ์ด์ค์ ์์กดํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ด ์ด๋ค๊ฒ ์๋ ์๊ด์๋ค.
์ด๋ ์ด์ ์๋ฅผ ์ํ ๊ฒ์ด๋ค.
์๋์ฐจ ๋ด๋ถ ๋์ ๋ฐฉ์์ด ๋ฐ๋์ด๋ ์ด์ ์์๊ฒ๋ ์ํฅ์ด ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ ๋ฐฉ์ ๊ทธ๋๋ก ์ธ ์ ์๋ค. ์ด์ ์๋ ์๋ก ๋ญ๊ฐ๋ฅผ ๋ฐฐ์ธ ํ์๊ฐ ์๋ค. ๋ํ ๊ตฌํ์ฒด๋ฅผ ๋ฐ๊ฟ๋ฒ๋ ค๋ ์ด์ ์ด ๊ทธ๋๋ก ๊ฐ๋ฅํ๋๊น ์๋์ฐจ ์ญํ ๋ง ์งํค๋ฉด ์๋ก์ด ๊ตฌํ์ฒด๋ ๋ค์ด์ฌ ์ ์์ด ํ์ฅ์ฑ์ด ์๊ธด๋ค.
์ด๊ฒ ๊ฐ๋ฅํ ๊ฒ์ด ์ญํ ๊ณผ ๊ตฌํ์ ๋๋ ๋จ๊ธฐ ๋๋ฌธ์ด๋ค. (์ฐ๊ทน์์ ํ๋์ ์ญํ ์ ์ฌ๋ฌ์ฌ๋์ด ํ ์ ์๋ ๊ฒ๋)
โ๏ธ ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ
- ์ญํ ๊ณผ ๊ตฌํ์ผ๋ก ๊ตฌ๋ถํ๋ฉด ์ธ์์ด ๋จ์ํด์ง๊ณ , ์ ์ฐํด์ง๋ฉฐ ๋ณ๊ฒฝ๋ ํธ๋ฆฌ
- ์ฅ์
- ํด๋ผ์ด์ธํธ๋ ๋์์ ์ญํ (์ธํฐํ์ด์ค)๋ง ์์กด
- ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋ด๋ถ ๋ชฐ๋ผ๋ ๋๋ค. ๋ณ๊ฒฝ๋ ๋ชฐ๋ผ๋ ๋๋ฉฐ, ์ฌ์ง์ด ๊ตฌํ ๋์ ์์ฒด๊ฐ ๋ฐ๋์ด๋ ์ํฅ X
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ์ด๋ฌํ ์ฅ์ ์ ๋ฐ์๋ค์ด๊ฒ ๋๋ค.
โ๏ธ ์๋ฐ ์ธ์ด์์๋ ์ด๊ฑธ ์ด๋ป๊ฒ ๋ฐ์๋ค์์ ๊น?
์๋ฐ ์ธ์ด์ ๋คํ์ฑ์ ํ์ฉํ ๋ฐฉ์์ ๊ฐ์ฒด ์ค๊ณ์ ์ญํ ๊ณผ ๊ตฌํ์ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํ๋ค.
๊ฐ์ฒด ์ค๊ณ์ ์ญํ (์ธํฐํ์ด์ค)์ ๋จผ์ ๋ถ์ฌํ๊ณ , ๊ทธ ์ญํ ์ ์ํํ๋ ๊ตฌํ ๊ฐ์ฒด ๋ง๋๋ ๋ฐฉ์์ผ๋ก ์ฐจ์ฉ
- ์ญํ = ์ธํฐํ์ด์ค
- ๊ตฌํ = ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค, ๊ตฌํ ๊ฐ์ฒด
์ญํ > ๊ตฌํ. ์ญํ ์ด ๋ ์ค์ํ๋ค
์ค๋ฒ๋ผ์ด๋ฉ ๋ ๋ฉ์๋๊ฐ ์คํ๋ ๋ ๋คํ์ฑ์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ์คํ ์์ ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝ ํ ์ ์๋ค.
์์ ๊ด๊ณ์์๋ ๋คํ์ฑ, ์ค๋ฒ๋ผ์ด๋ฉ ์ ์ฉ ๊ฐ๋ฅ
โ๏ธ ๋คํ์ฑ์ ๋ณธ์ง
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์คํ ์์ ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝ ํ ์ ์๋ค.
- ๋คํ์ฑ์ ๋ณธ์ง์ ์ดํดํ๋ ค๋ฉด ํ๋ ฅ์ด๋ผ๋ ๊ฐ์ฒด์ฌ์ด์ ๊ด๊ณ์์ ์์ํด์ผํ๋ค.
- ํด๋ผ์ด์ธํธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ์๋ฒ์ ๊ตฌํ ๊ธฐ๋ฅ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
โ๏ธ ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ : ์ ๋ฆฌ
- ์ญํ ๊ณผ ๊ตฌํ์ด๋ผ๋ ์ปจ์ ์ ๋คํ์ฑ์ ํตํด ๊ฐ์ฒดํ ํ ์ ์๋ค.
- ์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ด
- ํ์ฅ ๊ฐ๋ฅ
- ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์๋ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅ
๋ฐ๋ผ์, ์ธํฐํ์ด์ค๋ฅผ ์์ ์ ์ผ๋ก ์ ์ค๊ณํ๋ ๊ฒ์ด ์ค์ํ๋ค.
โ๏ธ ํ์ง๋ง ํ๊ณ๋ ์๋ค
์ญํ (์ธํฐํ์ด์ค)์ด ๋ณํ๋ฉด ํด๋ผ์ด์ธํธ, ์๋ฒ ๋ชจ๋ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ค. ๊ทธ๋์ ๋๋์ฑ ์์ ์ ์ธ ์ธํฐํ์ด์ค๊ฐ ํ์ํ๋ค.
โ๏ธ ์คํ๋ง๊ณผ ๊ฐ์ฒด ์งํฅ
๊ฐ์ฒด์งํฅ์ ๊ฝ์ ๋คํ์ฑ
์คํ๋ง์ ์ด๋ฐ ๋คํ์ฑ์ ๊ทน๋ํํด์ ์ด์ฉ์ด ๊ฐ๋ฅํ๊ฒ ํ๋ค.
์คํ๋ง์์ ๋งํ๋ ์ ์ด์ ์ญ์ (IoC), ์์กด๊ด๊ณ ์ฃผ์ (DI)์ ๋คํ์ฑ์ ํ์ฉํด์ ์ญํ ๊ณผ ๊ตฌํ์ ํธ๋ฆฌํ๊ฒ ๋ค๋ฃฐ ์ ์๋๋ก ์ง์ํด์ฃผ๋ ์ญํ ์ ํด์ค๋ค!
๊ทธ๋์ ๊ฒฐ๋ก ! ์คํ๋ง์ ์ฌ์ฉํ๋ฉด ๋ธ๋ญ ์กฐ๋ฆฝํ๋ ๊ตฌํ์ ํธ๋ฆฌํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค!
๋คํ์ฑ์ด ์คํ๋ง์ ๊ต์ฅํ ์ค์ํ๋ฐ ์ฌ๊ธฐ์ ํ๊ฐ์ง๊ฐ ๋ ์์ด์ผ ์์ ํ ์คํ๋ง์ ์ค๋ช ํ ์ ์๋ค.
๊ทธ๊ฒ ๋ฐ๋ก ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น, ์์ SOLID ๋ผ๊ณ ๋ถ๋ฆฌ๋ ์์น์ด๋ค.
์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น (SOLID)
โ๏ธ SRP (๋จ์ผ ์ฑ ์์ ์์น / Single reponsibility principle)
ํ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ค๋ ์์น. ํ์ง๋ง ํ๋์ ์ฑ ์์ด๋ผ๋ ๊ฒ ๋ชจํธํ๊ณ ๋ฌธ๋งฅ๊ณผ ์ํฉ๋ฐ๋ผ ๋ค๋ฅผ ์ ์๋ ๊ฑฐ๋ผ ์ค์ํ๊ฑด ๋ณ๊ฒฝ์ ๊ธฐ์ค์ผ๋ก ํ๋ค. ๋ณ๊ฒฝ์ ์ด์ ๋ฅผ ํ๋๋ง ๊ฐ์ง ๊ฒ ๋ณ๊ฒฝ์ ์ด์ ๊ฐ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๊ฒผ๋ค๋ฉด ํ๊ฐ์ง ์ด์์ ์ฑ ์์ ๋งก๊ณ ์๋ ๊ฒ์ด๋ค. ๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธ ํจ๊ณผ๊ฐ ์ ์ผ๋ฉด ๋จ์ผ ์ฑ ์ ์์น์ ์ ๋ฐ๋ฅธ ๊ฒ์ด๋ค.
โ๏ธ OCP (๊ฐ๋ฐฉ-ํ์ ์์น / Open-Closed principle)
์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค์๊ณ , ๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผ ํ๋ค.
๋คํ์ฑ์ ํ์ฉํด ์ด ์์น์ ์งํฌ์๊ฐ ์๋ค. ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋ค์ด ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด ํ์ฅ์๋ ์ด๋ ค์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ณํ๊ฐ ์ธ๋ถ์ ๊ธฐ์กด ์ฝ๋์ ๋ณ๊ฒฝ์ ์ฃผ์ง ์๋๋ค. ๋ณ๊ฒฝ์๋ ๋ซํ์๋ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ, ๊ฐ๋ฐ ํ์ ์์น์ ๋ฌธ์ ์ ์ด ์๋ค.
๋ง์ฝ MemberRepository m = new MemoryMemberRepository(); ๋ฅผ
MemberRepository m = new JdbcMemberRepository();๋ก ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ
ํด๋ผ์ด์ธํธ๊ฐ ์ฝ๋์์ ๋ณ๊ฒฝ์ ํด์ผํ๋ค. ๋คํ์ฑ์ ์ฌ์ฉํ์ผ๋ OCP ์์น์ ์งํฌ ์ ์๋๋ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์กฐ๋ฆฝ, ์ค์ ์๊ฐ ํ์ํ๋ค.
์ด ์ญํ ์ ์คํ๋ง์ ์ปจํ ์ด๋๊ฐ ํด์ค๋ค! ์ด ์์น์ ์งํค๊ธฐ์ํด IoC(์ ์ด์ ์ญ์ )๋ DI(์์กด์ฑ ์ฃผ์ )๋ ํ์ํ ๊ฒ!
โ๏ธ LSP (๋ฆฌ์ค์ฝํ ์นํ ์์น / Liskov Substitution principle)
ํ๋ก๊ทธ๋จ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค.
์ด๊ฒ์ ๋จ์ํ ์ฝ๋์ ์์ ํ์ ์ด ํ์ํ์ ์ ์ธ์คํด์ค๋ก ๊ต์ฒด๋ฅผ ์ฑ๊ณตํ์ฌ ์ปดํ์ผ์ด ์ฑ๊ณตํ๋ ๊ฑธ ์๋ฏธํ์ง ์๋๋ค.
์์ ํ์ ์ ๊ฐ์ฒด๋ฅผ ํ์ ํ์ ์ ๊ฐ์ฒด๋ก ์นํํ๋ค๊ณ ํ๋๋ผ๋ ์์ ํ์ ์ผ๋ก ๋์ํ๋ ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ์ ์์ ์ผ๋ก ๋์ํด์ผํ๋ ์์น์ด๋ค. ์์์ ์์ ๊ธฐ๋ฅ์ด ํ์ ํ์ ์ผ๋ก ๊ต์ฒดํ์ ๋ ํ์ง ๊ธฐ๋ฅ์ด ๋๋ฒ๋ฆฌ๋ฉด ๋ฆฌ์ค์ฝํ ์นํ ์์น์ ์๋ฐฐ๋ ๊ฒ์ด๋ค. ํ์ ํด๋์ค๋ ์ธํฐํ์ด์ค ๊ท์ฝ์ ๋ค ์ง์ผ์ผํ๋ค. ๊ทธ๋์ ๋คํ์ฑ์ ์ง์ํ๊ธฐ ์ํด ํ์ํ ์์น์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ฅผ ๋ฏฟ๊ณ ์ฌ์ฉํ๋ ค๋ฉด ์ด ์์น์ด ํ์ํ๋ค.
โ๏ธ ISP (์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น / Interface segregation principle)
ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค.
์๋์ฐจ ์ธํฐํ์ด์ค > ์ด์ ์ธํฐํ์ด์ค, ์ ๋น ์ธํฐํ์ด์ค ๋ก ๋ถ๋ฆฌ
์ฌ์ฉ์ ํด๋ผ์ด์ธํธ > ์ด์ ์ ํด๋ผ์ด์ธํธ, ์ ๋น์ฌ ํด๋ผ์ด์ธํธ๋ก ๋ถ๋ฆฌ
์ด๋ฐ์์ผ๋ก ๋ถ๋ฆฌํ๋ฉด ์ ๋น ์ธํฐํ์ด์ค๋ฅผ ๋ณ๊ฒฝํด๋ ์ ๋น์ฌ ํด๋ผ์ด์ธํธ๋ง ์ํฅ์ ์ฃผ์ง ์ด์ ์ ํด๋ผ์ด์ธํธ๋ ์ํฅ์ ์ฃผ์ง์๋๋ค. ๊ธฐ๋ฅ์ ์ ๋นํ ํฌ๊ธฐ๋ก ์๋ฅด๋ ๊ฒ์ด ์ค์. ์ธํฐํ์ด์ค(์ญํ )์ด ๋ช ํํด์ง๊ณ , ํ๋์ ํฐ ์ญํ ์ด ์๋ ๋ณด๋ค ์์ ์ญํ ๋ค๋ก ์๋ผ๋ธ ๊ฒ์ด๋ผ ๋์ฒด ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
โ๏ธ DIP (์์กด๊ด๊ณ ์ญ์ ์์น / Dependency inversion principle)
๊ตฌ์ฒดํ์ ์์กดํ์ง ๋ง๊ณ ์ถ์ํ์ ์์กดํด๋ผ! = ๊ตฌํ ํด๋์ค์ ์์กดํ์ง ๋ง๊ณ , ์ธํฐํ์ด์ค์ ์์กดํ๋ผ๋ ๋ป
SOLID์์ ํนํ ์ค์ํ ์์น์ด OCP์ DIP
์์ ์ด์ผ๊ธฐํ ์ญํ ์ ์์กดํด์ผํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ผ๊ธฐ! ํด๋ผ์ด์ธํธ๊ฐ ์ธํฐํ์ด์ค๋ฅผ ์์กดํด์ผ ์ ์ฐํ๊ฒ ๊ตฌํ์ฒด๋ฅผ ๋ฐ๊ฟ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ฝ MemberRepository m = new MemoryMemberRepository(); ๋ฅผ
MemberRepository m = new JdbcMemberRepository();๋ก ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ
์ด ์์๋ฅผ ๋ณด๋ฉด ์ธํฐํ์ด์ค๋ฅผ ์์กดํ๋ฉด์๋ ๊ตฌํ ํด๋์ค์๋ ๊ฒฐ๊ตญ ๊ฐ์ด ์์กดํ๊ณ ์์ด ๊ฒฐ๊ตญ ๊ตฌํ์ฒด ๋ณ๊ฒฝ์ ์ฝ๋๊น์ง ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒ์ด๋ค. (DIP ์๋ฐ)
๊ทธ๋ผ ์ด๋ป๊ฒ ํ๋ผ๋ ๊ฑฐ์ง?
โ๏ธ ์ ๋ฆฌ
๊ฐ์ฒด ์งํฅ์ ํต์ฌ์ ๋คํ์ฑ์ด์ง๋ง ๋คํ์ฑ๋ง์ผ๋ก๋ ์ฝ๊ฒ ๋ถํ์ ๊ฐ์ ๋ผ์ฐ๋ฏ์ด ๊ฐ๋ฐํ ์ ์๋ค.
๊ฒฐ๊ตญ ๊ตฌํ ๊ฐ์ฒด ๋ณ๊ฒฝ์ ํด๋ผ์ด์ธํธ ์ฝ๋ ๋ํ ๋ณ๊ฒฝํด์ผํ๊ธฐ ๋๋ฌธ์ OCP, DIP๋ฅผ ์งํฌ์ ์๋ค.
์ด๊ฑธ ์งํค๊ธฐ ์ํด ๋ฌด์ธ๊ฐ๊ฐ ํ์ํ๋ฐ ๊ทธ๊ฑธ ์งํค๊ธฐ ์ํด ํ์ํ๊ฒ ์คํ๋ง์ด๋ค!
๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
โ๏ธ ์คํ๋ง ์ด์ผ๊ธฐ๊ฐ ๊ฐ์ฒด ์งํฅ์์ ๋์ค๋ ์ด์ ?
์คํ๋ง์ ์๋ ๊ธฐ์ ๋ก ๋คํ์ฑ + OCP, DIP๋ฅผ ๊ฐ๋ฅํ๊ฒ ์ง์ํ๋ค
- DI(Dependency Injection) : ์์กด๊ด๊ณ, ์์กด์ฑ ์ฃผ์
- DI ์ปจํ ์ด๋ ์ ๊ณต
์ด ๊ธฐ์ ๋ค๋ก ํด๋ผ์ด์ธํธ ์ฝ๋ ๋ณ๊ฒฝ ์์ด ๊ธฐ๋ฅ์ ํ์ฅ์ด ๊ฐ๋ฅํ๊ฒ ํ๊ณ ๋ถํ ๊ต์ฒดํ๋ฏ ๋์ฒด๋ ๊ฐ๋ฅํ๋ค.
โ๏ธ ์ ๋ฆฌ
- ๋ชจ๋ ์ค๊ณ์ ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ (์์์๋ ์๋์ฐจ์ ์ฐ๊ทน์ ์ญ์ ์๊ฐํด!)
- ์ ํ๋ฆฌ์ผ์ด์ ์ค๊ณ๋ ์ธํฐํ์ด์ค(์ญํ )์ ๋ง๋ค์ด๋๊ณ ์ธ์ ๋ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ๋ค. (> ์ด๊ฑธ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ด ์คํ๋ง ์ปจํ ์ด๋)
์ด์์ ์ผ๋ก๋ ๋ชจ๋ ์ค๊ณ์ ์ธํฐํ์ด์ค ๋ถ์ฌ ํ์ง๋ง ์ด๊ฑธ ๋์ ํ๋ ค๋ฉด ์ถ์ํ๋ผ๋ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ ๊ธฐ๋ฅ์ ํ์ฅํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ง์ ์ฌ์ฉํ๊ณ , ํ์ ๋ฆฌํฉํ ๋ง์ ํตํด ์ธํฐํ์ด์ค๋ฅผ ๋์ ํ๋ ๊ฒ๋ ๋ฐฉ
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
QueryDSL ์ ์ฉ ๋ฐฉ๋ฒ (0) | 2023.04.01 |
---|---|
WebRTC ์๊ทธ๋๋ง ์๋ฒ (Spring Boot๋ก ๊ตฌํ) (1) | 2023.01.12 |
Query DSL (0) | 2022.12.15 |
์คํ๋ง ๋ถํธ(Spring Boot) ๋ค์ด ๊ทธ๋ ์ด๋ (0) | 2022.12.07 |
ORM / JPA / Hibernate / Spring Data JPA (0) | 2022.12.05 |