-
[Spring] ๊น์ํ ์คํ๋ง ํต์ฌ์๋ฆฌ <์น์ 1.๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง> ์ ๋ฆฌ
2023. 10. 4.
์น์ 1. ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
์คํ๋ง์ ํ์ (์๋์ ๋ฐฐ๊ฒฝ)
- EJB (Enterprise Java Beans) → ์คํ๋ง+JPA, ์๋ฐ ์ง์ฌ์ ํ์ค ๊ธฐ์
- ์ปจํ ์ด๋ ๊ธฐ์ , ์ค์ ์ ์ํ ํธ๋์ญ์ ๊ด๋ฆฌ,๋ถ์ฐ๊ธฐ์ ์ ์ง์ ๊ฐ์
- Entity Bin ๊ธฐ์ , ORM๊ธฐ์ ๋ ๋ณด์
- But ๊ฐ๊ฒฉ์ด.. ๋น์.. ๋ณต์กํ๊ณ ์ด๋ ค์ ์ง์ ๋ถํ ์ฝ๋
- ORM๊ธฐ์ : ์ฟผ๋ฆฌ ์์ด ์๋ฐ ๊ฐ์ฒด๋ฅผ DB์ ํธํ๊ฒ ์ ์ฅํ๊ณ ๊บผ๋ด๋ ๊ธฐ์ ⇒ NTTB
POJO (Plan Old Java Object) → ์ค๋๋ ๋ฐฉ์์ ์๋ฐ ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํ์๋ ์์ง์๋ ๋ฐ์
⇒ EJB์ ๋์์ด ๋ ์ ์๋ ์คํ์์ค ๊ฐ๋ฐ
⇒ ์คํ๋ง, ํ์ด๋ฒ๋ค์ดํธ(Hibernate) ์ ๋ฑ์ฅ
EJB → Hibernate → JPA (ํ์ด๋ฒ๋ค์ดํธ์ ์ ์ฌ)
๋๋ถ๋ถ ์๋ฐ ์ง์์ ORM์ JPA๊ฐ, ๊ตฌํ์ฒด๋ ํ์ด๋ฒ๋ค์ดํธ๊ฐ ์ฐจ์ง
์คํ๋ง์ ์ญ์ฌ
- 2002๋ ๋ก๋ ์กด์จ์ ์ฑ → EJB ์์ด๋ ์ถฉ๋ถํ ๊ณ ํ์ง์ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์์์ ๋ณด์ฌ์ฃผ๊ณ , ์ผ๋ง๋ผ์ธ ์ด์์ ๊ธฐ๋ฐ ๊ธฐ์ ์ ์์ ์ฝ๋๋ก ์ ๋ณด์
- Juergen Hoeller(์ ๊ฒ ํ ๋ฌ), Yann Caroff(์ ์นด๋กํ)๊ฐ ๋ก๋ ์กด์จ์๊ฒ ์ค ํ์์ค ํ๋ก์ ํธ๋ฅผ ์ ์
- ์คํ๋ง ์ด๋ฆ์ ์ ํต์ ์ธ J2EE(EJB)๋ผ๋ ๊ฒจ์ธ์ ๋์ด ์๋ก์ด ์์์ด๋ผ๋ ๋ป
์คํ๋ง์ด๋?
์คํ๋ง⇒ ํน์ ํ ํ๋์ ๊ธฐ์ ์ด ์๋๋ผ ์ฌ๋ฌ๊ฐ์ง ๊ธฐ์ ๋ค์ ๋ชจ์
- ์คํ๋ง ํ๋ ์์ํฌ - ํต์ฌ
- ์คํ๋ง ๋ถํธ - ์คํ๋ง ๊ธฐ์ ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๋ ๊ธฐ์ .
- ์คํ๋ง ๋ฐ์ดํฐ - DB์ CRUD๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ธฐ์ ex) JPA
- ์คํ๋ง ์ธ์ - ์ธ์ ๊ธฐ๋ฅ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก
- ์คํ๋ง ๋ฐฐ์น - ๋ฐฐ์น ์ฒ๋ฆฌ์ ํนํ๋ ๊ธฐ์
- ์คํ๋ง ์ํ๋ฆฌํฐ - ๋ณด์ ๊ด๋ จ
- ์คํ๋ง Rest Docs - API๋ฌธ์์ ํ ์คํธ๋ฅผ ์ฎ์ด ๋ฌธ์ํ๋ฅผ ํธํ๊ฒ ํด์ฃผ๋ ๊ฒ
- ์คํ๋ง ํด๋ผ์ฐ๋
์คํ๋ง ํ๋ ์์ํฌ
- ํต์ฌ ๊ธฐ์ : ์คํ๋ง DI ์ปจํ ์ด๋, AOP, ์ด๋ฒคํธ, ๊ธฐํ
- ์น ๊ธฐ์ : ์คํ๋ง MVC, ์คํ๋ง WebFlux
- ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ : ํธ๋์ญ์ , JDBC, ORM ์ง์, XML ์ง์
- ๊ธฐ์ ํตํฉ: ์บ์, ์ด๋ฉ์ผ, ์๊ฒฉ์ ๊ทผ, ์ค์ผ์ค๋งํ ์คํธ: ์คํ๋ง ๊ธฐ๋ฐ ํ ์คํธ ์ง์
- ์ธ์ด: ์ฝํ๋ฆฐ, ๊ทธ๋ฃจ๋น
์ต๊ทผ์๋ ์คํ๋ง ๋ถํธ๋ฅผ ํตํด์ ์คํ๋ง ํ๋ ์์ํฌ์ ๊ธฐ์ ๋ค์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ
์คํ๋ง ๋ถํธ
- ์คํ๋ง์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์, ์ต๊ทผ์๋ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ
- ๋จ๋ ์ผ๋ก ์คํํ ์ ์๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ์์ฑ
- Tomcat ๊ฐ์ ์น ์๋ฒ๋ฅผ ๋ด์ฅํด์ ๋ณ๋์ ์น ์๋ฒ๋ฅผ ์ค์นํ์ง ์์๋ ๋จ ⇒ ์ด์ ์๋ ๋น๋/ ์๋ฒ๋ฅผ ๋ณ๋ ์ค์น.. ๋ณต์กํ ๊ณผ์
- ์์ฌ์ด ๋น๋ ๊ตฌ์ฑ์ ์ํ starter ์ข ์์ฑ ์ ๊ณต ⇒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฌถ์ด์ ๊ฐ์ด ๋๊ธธ ์ ์๋๋ก starter๊ฐ ์ ๊ณต
- ์คํ๋ง๊ณผ 3rd party(์ธ๋ถ) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋ ๊ตฌ์ฑ ⇒ ์คํ๋ง ํ๋ ์์ํฌ์ ๋ง๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง์ ํด์ ๋ค์ด๋ก๋ ๋ฐ์ ์ ์๋๋ก
- ๋ฉํธ๋ฆญ, ์ํ ํ์ธ, ์ธ๋ถ ๊ตฌ์ฑ ๊ฐ์ ํ๋ก๋์ ์ค๋น ๊ธฐ๋ฅ ์ ๊ณต ⇒ ์ด์ํ๊ฒฝ์์์ ๋ชจ๋ํฐ๋ง ๋ฑ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํด์ฃผ๋ ๊ธฐ๋ฅ
- ๊ด๋ก์ ์ํ ๊ฐ๊ฒฐํ ์ค์ ⇒ default ์ค์ ๊ณผ ๋ฉ๋ด์ผ ์กด์ฌ. ํ์ํ ๋๋ง custormize
์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ๋ฐ๋์ ์ฌ์ฉํด์ ๋๋จธ์ง ํ์ํ ๊ฒ๋ค์ ๋น๊ฒจ์์ ์ฌ์ฉ์ ๋์์ฃผ๋ ๊ธฐ์
- JUnit test๊ด๋ จ ์ด๋ค ์ฅ์ ์ด ์๋์ง?
- ๋จ์ํ ์คํธ๋?
- Junit์ ์ฌ์ฉํ๋ฉด ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ๋์, ๊ทธ ์์ ์ฌ๋ผ๊ฐ์๋ Bean์ ํ ์คํธ ํ ์ ์๋ค.
- ์ฆ, ํจ์ ๋ฐ ๋ฉ์๋์ ๋ํ ํ ์คํธ๋ฅผ ํ๋ ์์ .
- Java์์ ๋ ๋ฆฝ๋ ๋จ์ํ ์คํธ (Unit test)๋ฅผ ์ง์ํด์ฃผ๋ ํ๋ ์์ํฌ.
์คํ๋ง ๋จ์ด
๋ฌธ๋งฅ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ฌ์ฉ
- ์คํ๋ง DI ์ปจํ ์ด๋ ๊ธฐ์ - ์คํ๋ง ๋น์ ๊ด๋ฆฌํ๋ ๊ธฐ์
- ์คํ๋ง ํ๋ ์์ํฌ ์์ฒด
- ์คํ๋ง ๋ถํธ, ์คํ๋ง ํ๋ ์์ํฌ ๋ฑ์ ๋ชจ๋ ํฌํจํ ์คํ๋ง ์ํ๊ณ
์คํ๋ง์ ํต์ฌ ๊ฐ๋ , ์ปจ์
ํต์ฌ ๊ฐ๋ ๊ณผ ์ปจ์ ์ ์ดํดํด์ผ.. DB ์ ๊ทผ, ์น์๋ฒ ๋์์ฃผ๋ ์ฉ๋ ์ด๋ฐ ๊ฒ์ ๋ค ๊ฒฐ๊ณผ๋ฌผ์ด๊ณ ํต์ฌ์ด ์๋๋ค
- ์คํ๋ง์ ์๋ฐ ์ธ์ด ๊ธฐ๋ฐ์ ํ๋ ์์ํฌ๋ผ๋ ๊ฒ!!!
- ์๋ฐ ์ธ์ด์ ๊ฐ์ฅ ํฐ ํน์ง์ ๊ฐ์ฒด ์งํฅ ์ธ์ด์ด๊ณ , ์คํ๋ง์ ๊ฐ์ฒด ์งํฅ ์ธ์ด๊ฐ ๊ฐ์ง ๊ฐ๋ ฅํ ํน์ง์ ์ด๋ ค๋ด๋ ํ๋ ์์ํฌ
- ์คํ๋ง์ ์ข์ ๊ฐ์ฒด ์งํฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๊ฒ ๋์์ฃผ๋ ํ๋ ์์ํฌ
์ข์ ๊ฐ์ฒด ์งํฅ์ ๋ํ ์ดํด → ์คํ๋ง ํ๋ ์์ํฌ์ ๋ํ ์ฌ๋ฐ๋ฅธ ์ดํด
์ข์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋?
๊ฐ์ฒด ์งํฅ์ ํน์ง
- ์ถ์ํ
- ์บก์ํ
- ์์
- ๋คํ์ฑ
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋?
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ๋ช ๋ น์ด์ ๋ชฉ๋ก์ผ๋ก ๋ณด๋ ์๊ฐ์์ ๋ฒ์ด๋ ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ๋ ๋จ์, ์ฆ **"๊ฐ์ฒด"**๋ค์ ๋ชจ์์ผ๋ก ํ์ ํ๊ณ ์ ํ๋ ๊ฒ
- ํ๋ก๊ทธ๋จ์ ์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๋๋ก ํจ (์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ณ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝ) ⇒ ๊ฐ์ฒด ์งํฅ์ ํต์ฌ์ธ ๋คํ์ฑ(Polymorphism)
๋คํ์ฑ
- ์ญํ (์ธํฐํ์ด์ค)์ ๊ตฌํ(์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด)๋ก ์ธ์์ ๊ตฌ๋ถ
ex) ์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๋ค๋ ๊ฒ์ผ ๋ป ⇒ ์ด์ ์์ ์๋์ฐจ์ ์์
์๋์ฐจ๋ผ๋ ๊ฐ์ ์ญํ ์ ๋ค์ํ ์๋์ฐจ ๊ตฌํ์ฒด๋ค์ด ์ํํจ
์๋์ฐจ๊ฐ ๋ฐ๋์ด๋ ์ด์ ์ํํ ์ํฅ์ ์ฃผ์ง ์๋๋ค!
์ด์ ์๋ ์๋์ฐจ์ ์ธํฐํ์ด์ค๋ง ์๊ณ ์์. ์ ์๋์ฐจ๋ผ๋ ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํ๋๊ฐ? ⇒ ์ด์ ์, ์ฆ ํด๋ผ์ด์ธํธ๋ฅผ ์ํจ์ด๋ค.
๋ค๋ฅธ ๋์์ผ๋ก ๋ณํ์ด ๊ฐ๋ฅํ๊ณ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ ์ญํ ์ ๊ทธ๋๋ก ์ํ๊ฐ๋ฅํ ๊ฒ์ด ์ธํฐํ์ด์ค๋ค! ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ ๊ณต ๊ฐ๋ฅ(์ญํ ๊ณผ ๊ตฌํ์ ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์) ์ค์ํ ๊ฒ์ ์๋์ฐจ ์ฌ๋ฌ๊ฐ๋ฅผ ๊ตฌํํ ์ ์๋ค๋ ๊ฒ์ด ์๋๋ผ ์๋ก์ด ์๋์ฐจ๊ฐ ๋์๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณํจ ์์ด๋ ๋๋ค๋ ๊ฒ์ด๋ค
์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ์ ์ป๋ ์ฅ์ )
ํด๋ผ์ด์ธํธ๋ ๋์ ์ญํ ์ ์ธํฐํ์ด์ค๋ง ์๋ฉด ๋จ, ๊ตฌํ ๋์์ ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค
๊ตฌํ ๋์ ์์ฒด๋ฅผ ๋ณ๊ฒฝํด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค
⇒ ์๋ฐ์ ๋คํ์ฑ์ ํ์ฉํด์ ๋ถ๋ฆฌ
์ญํ = ์ธํฐํ์ด์ค
๊ตฌํ = ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค, ๊ตฌํ ๊ฐ์ฒด ๊ฐ์ฒด๋ฅผ ์ค๊ณํ ๋ ์ญํ ๊ณผ ๊ตฌํ์ ๋ช ํํ ๋ถ๋ฆฌ ๊ฐ์ฒด ์ค๊ณ์ ์ญํ (์ธํฐํ์ด์ค)์ ๋จผ์ ๋ถ์ฌํ๊ณ , ๊ทธ ์ญํ ์ ์ํํ๋ ๊ตฌํ ๊ฐ์ฒด ๋ง๋ค๊ธฐ
์ผ๋ฐ ์์๋ ๋คํ์ฑ์ด ๊ฐ๋ฅํ์ง๋ง ๊ฐ๊ธ์ ์ด๋ฉด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค
๊ตฌํ๋ณด๋ค ์ธํฐํ์ด์ค๊ฐ ๋จผ์ ๋ผ๋ ๊ฒ์ด ํต์ฌ
๊ฐ์ฒด์ ํ๋ ฅ
- ํผ์ ์๋ ๊ฐ์ฒด๋ ์๋ค, ์๋ง์ ๊ฐ์ฒด๋ค์ ์๋ก ํ๋ ฅ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค
- ํด๋ผ์ด์ธํธ → ์์ฒญ, ์๋ฒ → ์๋ต (ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ํ์๋ฅผ ์ํ)
์๋ฐ ์ธ์ด์ ๋คํ์ฑ
- ์๋ฐ์ ๋คํ์ฑ ๊ตฌํ → ์ค๋ฒ๋ผ์ด๋ฉ (๋ฉ์๋, ํด๋์ค ์ฌ์ ์์ ๊ฐ๋ )
- ๋คํ์ฑ์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ์คํ ์์ ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅ
ํด๋ผ์ด์ธํธ๋ memberRepository๋ฅผ ์์กด(์๊ณ ์๋ค๋ ์๋ฏธ)
MemberRepository๋ฅผ Memory์ Jdbc๊ฐ ์์กดํ๋ ๊ฒ๋ ๊ฐ๋ฅ (๋คํ์ฑ)
์ด ๊ทธ๋ฆผ์ ์์์ด ์ ๋๋ค!!๋๋ฐ ์ดํด๊ฐ ์ ์๋จ
- save()ํธ์ถ ์ Jdbc์ save()๊ฐ ํธ์ถ์ด ๋จ.
๋คํ์ฑ์ ๋ณธ์ง
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์คํ ์์ ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
- ๋คํ์ฑ์ ๋ณธ์ง์ ํ๋ ฅ!
- ํด๋ผ์ด์ธํธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์๋ฒ์ ๊ตฌํ ๊ธฐ๋ฅ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค
⇒ ํ์ฅ ๊ฐ๋ฅํ ์ค๊ณ
์ธํฐํ์ด์ค๋ฅผ ์์ ์ ์ผ๋ก ์ค๊ณํด์ผ ํ๋ค!
๋คํ์ฑ์ ํ๊ณ์
- ์ญํ (์ธํฐํ์ด์ค) ์์ฒด๊ฐ ๋ณํ๋ฉด, ํด๋ผ์ด์ธํธ, ์๋ฒ ๋ชจ๋์ ํฐ ๋ณ๊ฒฝ์ด ๋ฐ์ ⇒ ๋ณํ๊ฐ ์๊ณ , ์์ ์ ์ผ๋ก ์ ์ค๊ณํ๋ ๊ฒ์ด ์ค์
์คํ๋ง๊ณผ ๊ฐ์ฒด ์งํฅ
- ๋คํ์ฑ์ด ๊ฐ์ฅ ์ค์, ์ด๋ฅผ ์คํ๋ง์ด ํธ๋ฆฌํ๊ฒ ์ด์ฉํ ์ ์๋๋ก ํจ (IoC, DI๋ฅผ ํตํด)
SOLID ๋ฉด์ ์๋ ๋ง์ด ๋์ค๋ ์ง๋ฌธ!
๋คํ์ฑ+ SOLID๋ฅผ ์์์ผ ์คํ๋ง์ ๋ํ ์ ๋๋ก ๋ ์ดํด๋ฅผ ํ ์ ์๋ค!!
์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น (SOLID)
SOLID
ํด๋ฆฐ์ฝ๋๋ก ์ ๋ช ํ ๋ก๋ฒํธ ๋งํด์ด ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น์ ์ ๋ฆฌ
SRP: ๋จ์ผ ์ฑ ์ ์์น(single responsibility principle) OCP: ๊ฐ๋ฐฉ-ํ์ ์์น (Open/closed principle) LSP: ๋ฆฌ์ค์ฝํ ์นํ ์์น (Liskov substitution principle) ISP: ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น (Interface segregation principle) DIP: ์์กด๊ด๊ณ ์ญ์ ์์น (Dependency inversion principle)
SRP(๋จ์ผ ์ฑ ์ ์์น)
- ํ๋์ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ค
- ์ค์ํ ํ๋จ์ ๊ธฐ์ค์ ๋ณ๊ฒฝ → ๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธ ํจ๊ณผ๊ฐ ์ ์ผ๋ฉด ๋จ์ผ ์ฑ ์ ์์น์ ์ ๋ฐ๋ฅธ ๊ฒ
- ex) UI ํ๋ ๋ณ๊ฒฝํ๋๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค ๊ณ ์ณ์ผ ๋๋ฉด… ๊ทธ๊ฑด ์๋ชป๋ ์ค๊ณ
- ์ ์ ํ ๋ฒ์๋ฅผ ์ ์กฐ์ ํ๋ ๊ฒ์ด ์ค์(๋๋ฌด ์์ง๋ ํฌ์ง๋ ์๊ฒ)
OCP ๊ฐ๋ฐฉ-ํ์ ์์น
- ๊ฐ์ฅ ์ค์ํ ์์น!
- ์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค ์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค
- ํ์ฅ์ ํ๋ฉด ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒ์ด ์๋๊ฐ? ๋คํ์ฑ์ ํ์ฉ. ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ๊ธฐ์กด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ๊ณผ ๋ค๋ฆ
- ํด๋ผ์ด์ธํธ๊ฐ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ฐ์ ⇒ OCP ์์น์ด ๊บ ์ง๋ ๋ฌธ์ ์ด๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋๊ฐ? ๊ฐ์ฒด๋ฅผ ์์ฐํ๊ณ ๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์กฐ๋ฆฝ์ ํด์ฃผ๋ ์ค์ ์๊ฐ ํ์ → ์คํ๋ง์ด ์ด๋ฅผ ๋ด๋นํ๋ค!
LSP ๋ฆฌ์ค์ฝํ ์นํ ์์น
- ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค
- ๋จ์ํ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋์ง ์๋ ๊ฒ์ด ์๋๋ผ, ์๋ฅผ ๋ค์ด ๊ตฌํ์ฒด์ ํด๋น๋๋ ์์ ์ ๋ฌด์กฐ๊ฑด ์์ผ๋ก ๊ฐ์ผ ๋๋ค๋ ๊ฒ์ฒ๋ผ ์ธํฐํ์ด์ค ๊ท์ฝ์ ๋ง์ถ๋ ๊ฒ
ISP ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
- ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค
- ๊ธฐ๋ฅ์ ์ ๋นํ ํฌ๊ธฐ๋ก ์ ์ชผ๊ฐ ๋ค
DIP ์์กด๊ด๊ณ ์ญ์ ์์น
- ํ๋ก๊ทธ๋๋จธ๋ “์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค.” ์์กด์ฑ ์ฃผ์ ์ ์ด ์์น์ ๋ฐ๋ฅด๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ค.
- ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ๊ตฌํ ํด๋์ค๊ฐ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์์กดํด์ผ ํ๋ค๋ ๋ป ⇒ ์ญํ ์ ์์กดํ๋ ๊ฒ๊ณผ ๋์ผํ ์ด์ผ๊ธฐ, ๊ตฌํ์ ์์กดํ๋ฉดx
MemberRepository m = new MemoryMemberRepository(); //๋ฉค๋ฒ ์๋น์ค -> MemberRepository์๋ง ์์กดํ๋๋ก ์ค๊ณํด์ผ
- DIP ์๋ฐ ⇒ ์ถ์ํ์ ์์กดํด์ผ์ง ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์ ๋๋๋ฐ, ๊ตฌ์ฒดํ์ธ ๋ฉ๋ชจ๋ฆฌ ๋ฉค๋ฒ ๋ฆฌํ์งํ ๋ฆฌ์ ์์กดํ๊ณ ์์! ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ๋ฌธ์
But, ๋คํ์ฑ ๋ง์ผ๋ก๋ OCP, DIP๋ฅผ ์งํฌ ์๊ฐ ์๋ค! Spring์ ๋ฑ์ฅ!
๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
์คํ๋ง์ ๋ค์ ๊ธฐ์ ๋ก ๋คํ์ฑ + OCP, DIP๋ฅผ ๊ฐ๋ฅํ๊ฒ ์ง์
- DI(Dependency Injection): ์์กด๊ด๊ณ, ์์กด์ฑ ์ฃผ์
- DI ์ปจํ ์ด๋ (์๋ฐ ๊ฐ์ฒด๋ฅผ ์ปจํ ์ด๋ ์์ ๋ฃ์ด๋๊ณ ์ด ์์์ ์์กด๊ด๊ณ๋ฅผ ์๋ก ์ฐ๊ฒฐ, ์ฃผ์ ํด์ฃผ๋ ๊ธฐ๋ฅ๋ค์ ์ ๊ณต) ์ ๊ณต
์ด๋ฅผ ์ด์ฉํ์ฌ ํด๋ผ์ด์ธํธ ์ฝ๋์ ๋ณ๊ฒฝ ์์ด ๊ธฐ๋ฅ์ ํ์ฅ
์ด์์ ์ผ๋ก๋ ์ธํฐํ์ด์ค๋ฅผ ๋จผ์ ๋ง๋ค์ด๋์ผ๋ฉด ํ๋ถ ๊ตฌํ ๊ธฐ์ ์ ๋ํ ์ ํ์ ๋ฏธ๋ฃฐ ์ ์์ด ๋ชจ๋ ์ค๊ณ์ ์ธํฐํ์ด์ค๋ฅผ ๋ถ์ฌํ๋ ๊ฒ์ด ์ข์
๊ทธ๋ฌ๋, ์ถ์ํ๋ผ๋ ๋น์ฉ์ด ๋ฐ์
์ถ์ฒํ๋ ๋ฐฉ๋ฒ) ๊ธฐ๋ฅ์ ํ์ฅํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด, ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ง์ ์ฌ์ฉํ๊ณ , ํฅํ ๊ผญ ํ์ํ ๋ ๋ฆฌํฉํฐ๋งํด์ ์ธํฐํ์ด์ค๋ฅผ ๋์ ํ๋ ๊ฒ
'๐ญ Study > : Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ