[Spring ๊ธฐ๋ณธ] 1. ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
์๋ ํ์ธ์!
HTTP๋ฅผ ๋ค ๋๋ด๊ณ Spring์ผ๋ก ๋์์์ต๋๋ค!
๋ณธ๊ฒฉ์ ์ผ๋ก ์คํ๋ง์ ๋ฐฐ์ฐ๋ ค๋ฉด ์คํ๋ง์ ๊ฐ๋ ์ ์ธ ๋ถ๋ถ๋ถํฐ ์์์ผ๊ฒ ์ฃ ?
๊ณ ๊ณ !

1. ์คํ๋ง์ด๋? (์คํ๋ง ์ํ๊ณ)
1-1. ์คํ๋ง์ ๊ตฌ์ฑ
์คํ๋ง์ ํ์์ ์ธ ๊ธฐ์ ์ ์ํ๋ ์คํ๋ง ํ๋ ์์ํฌ์ ์คํ๋ง ๋ถํธ, ๊ทธ๋ฆฌ๊ณ ์ ํ์ ์ธ ๊ธฐ์ ์ ์ํ๋ ์คํ๋ง ๋ฐ์ดํฐ, ์คํ๋ง ์ธ์ , ์คํ๋ง ์ํ๋ฆฌํฐ, ์คํ๋ง Rest Docs, ์คํ๋ง ๋ฐฐ์น, ์คํ๋ง ํด๋ผ์ฐ๋๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
ํต์ฌ์ ์ธ ๋ถ๋ถ์ธ ์คํ๋ง ํ๋ ์์ํฌ์ ์คํ๋ง ๋ถํธ๋ ๋ค์์ ๋ ์์ธํ ์ค๋ช ํ ๊ฑฐ๊ตฌ์.
๋จผ์ ์ ํ์ ์ธ ๊ธฐ์ ๋ค๋ถํฐ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์คํ๋ง ๋ฐ์ดํฐ๋, CRUD ๋ฑ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๋๋ก ๋์์ ์ฃผ๋ ๊ธฐ์ ์ ๋๋ค. ์ ์ผ ๋ง์ด ์ฐ๋ ๊ฒ์ ์คํ๋ง ๋ฐ์ดํฐ JPA ์ ๋๋ค.
์คํ๋ง ์ธ์ ์ด๋, ์ธ์ ๊ธฐ๋ฅ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๋๋ก ๋์์ ์ฃผ๋ ๊ธฐ์ ์ ๋๋ค.
์คํ๋ง ์ํ๋ฆฌํฐ๋ ๋ณด์๊ณผ ๊ด๋ จ๋ ๊ธฐ์ ์ ๋๋ค.
์คํ๋ง Rest Docs๋ API ๋ฌธ์ํ๋ฅผ ํธ๋ฆฌํ๊ฒ ํด์ฃผ๋ ๊ธฐ์ ์ ๋๋ค.
์คํ๋ง ๋ฐฐ์น๋ ๋ฐฐ์น ์ฒ๋ฆฌ์ ํนํ๋ ๊ธฐ์ ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์คํ๋ง ํด๋ผ์ฐ๋๋ ํด๋ผ์ฐ๋ ๊ธฐ์ ์ ํนํ๋ ๊ธฐ์ ์ ๋๋ค.
์ด ์ธ์๋ ๋ง์ ๊ธฐ์ ๋ค์ด ์์ต๋๋ค.
1-2. ์คํ๋ง ํ๋ ์์ํฌ
์ฌ์ค ์ด๊ฒ ์ ์ผ ์ค์ํ ๊ฑฐ์์.
- ํต์ฌ ๊ธฐ์ : ์คํ๋ง DI ์ปจํ ์ด๋, AOP, ์ด๋ฒคํธ, ๊ธฐํ
- ์น ๊ธฐ์ : ์คํ๋ง MVC, ์คํ๋ง WebFlux
- ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ : ํธ๋์ ์ , JDBC, ORM ์ง์, XML ์ง์
- ๊ธฐ์ ํตํฉ: ์บ์, ์ด๋ฉ์ผ, ์๊ฒฉ์ ๊ทผ, ์ค์ผ์ค๋ง
- ํ ์คํธ: ์คํ๋ง ๊ธฐ๋ฐ ํ ์คํธ ์ง์
- ์ธ์ด: ์ฝํ๋ฆฐ, ๊ทธ๋ฃจ๋น
์ด๊ฒ๋ค์ ๋ค ํฉํด์ ์คํ๋ง ํ๋ ์์ํฌ๋ผ๊ณ ํฉ๋๋ค.
์ต๊ทผ์๋ ์คํ๋ง ๋ถํธ๋ฅผ ํตํด์ ์คํ๋ง ํ๋ ์์ํฌ์ ๊ธฐ์ ๋ค์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์คํ๋ง ๋ถํธ๊ฐ ๋ญ๊น์?
๋ ์คํ๋ง ๋ถํธ์ ์ฅ์ ์ ๋ญ๊น์?
๊ทธ๊ฑด ๋ฐ์์ ๋ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
1-3. ์คํ๋ง ๋ถํธ์ ๊ฐ๋ ๊ณผ ์ฅ์
์คํ๋ง ๋ถํธ๋, ์คํ๋ง์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๋๋ก ์ง์ํ๋ ๊ธฐ์ ์ ๋ปํฉ๋๋ค.
์ต๊ทผ์๋ ๊ธฐ๋ณธ์ผ๋ก ๋ค ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ฅ์ ์ ์์ธํ ์ค๋ช ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
- ๋จ๋
์ผ๋ก ์คํํ ์ ์๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์
์ ์ฝ๊ฒ ์์ฑํฉ๋๋ค.
- ์์ ์๋ Tomcat ๊น๋ ๋ฑ.. ๊ณผ์ ์ด ๊ต์ฅํ ๋ณต์กํ์ต๋๋ค.
์ง๊ธ์ ์คํ๋ง ๋ถํธ ๋ช ์ค ์น๊ณ ๋์~
- ์์ ์๋ Tomcat ๊น๋ ๋ฑ.. ๊ณผ์ ์ด ๊ต์ฅํ ๋ณต์กํ์ต๋๋ค.
- Tomcat ๊ฐ์ ์น ์๋ฒ๋ฅผ ๋ด์ฅํด์ ๋ณ๋์ ์น ์๋ฒ๋ฅผ ์ค์นํ๋ ์์๋ ๋ฉ๋๋ค.
- ์์ฌ์ด ๋น๋ ๊ตฌ์ฑ์ ์ํ starter ์ข
์์ฑ์ ์ ๊ณตํฉ๋๋ค.
- ์์ ์๋ ์ด๊ฒ์ ๊ฒ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๊ต์ฅํ ์ด๋ ค์ ์ต๋๋ค.
์ง๊ธ์ springboot.ooostarter ๋ฑ ์ฌ๋ฌ๊ฐ ์ ๋ก๊ฒจ์ค๊ณ ํธ๋ฆฌํ๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
- ์์ ์๋ ์ด๊ฒ์ ๊ฒ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๊ต์ฅํ ์ด๋ ค์ ์ต๋๋ค.
- ์คํ๋ง๊ณผ 3rd party(์ธ๋ถ) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ตฌ์ฑํฉ๋๋ค.
- ์์ ๊ณผ ๋ฌ๋ฆฌ ์์ฆ์ ์คํ๋ง๋ถํธ๊ฐ ์ ๋ช ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์์์ ํ ์คํธํ๊ณ , ๋ฒ์ ๋ ๋ค ์ง์ ์ง์ ํด์ ๋ค์ด๋ก๋ ํด์ค๋๋ค.
- ๋ฉํธ๋ฆญ, ์ํ ํ์ธ, ์ธ๋ถ ๊ตฌ์ฑ๊ณผ ๊ฐ์ ํ๋ก๋์
์ค๋น ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ์ด์ ํ๊ฒฝ์์ ๋ชจ๋ํฐ๋ง์ ์ค์ํ๋ฐ ๊ทธ๋ฐ ๊ฒ๋ค์ ์คํ๋ง ๋ถํธ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํฉ๋๋ค.
- ๊ด๋ก์ ์ํ ์ค์ ์ด ๊ฐ๊ฒฐํฉ๋๋ค.
- ์๋ ์ ์คํ๋ง ํ๋ ์์ํฌ๋ง ์ฌ์ฉํ ๋์๋ ์ค์ ํ๋ ๊ฒ์ด ํ๋ค์์ต๋๋ค.
์์ฆ์ ์คํ๋ง ๋ถํธ๋ก ๊ฐ๊ฒฐํด์ก๋๋ฐ, ์คํ๋ง ๋ถํธ๋ ์ ๋งํ ๊ฒ์ ๋ํดํธ ์ค์ ์ด ๋ฉ๋ด์ผ์ ๋์์์ต๋๋ค. ๊ฑฐ๊ธฐ์ ๋ณด๊ณ ํ์ํ๋ฉด ๋๋ถ๋ถ ๊ด๋ก์ ๋ฐ๋ผ ์ค์ ํ๋ฉด ๋๊ณ , ์ผ๋ถ๋ ์กฐ๊ธ๋ง ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
- ์๋ ์ ์คํ๋ง ํ๋ ์์ํฌ๋ง ์ฌ์ฉํ ๋์๋ ์ค์ ํ๋ ๊ฒ์ด ํ๋ค์์ต๋๋ค.
1-4. ์คํ๋ง ๋จ์ด?
์คํ๋ง์ด๋ผ๋ ๋จ์ด๋ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
๋จผ์ , ์คํ๋ง DI ์ปจํ ์ด๋ ๊ธฐ์ (ํต์ฌ์ธ bean ๊ด๋ฆฌ) ๋ก๋ ์ฌ์ฉ๋๊ณ , ์คํ๋ง ํ๋ ์์ํฌ ์์ฒด๋ก๋ ์ฌ์ฉ๋ฉ๋๋ค.
๋ํ, ์คํ๋ง ๋ถํธ, ์คํ๋ง ํ๋ ์์ํฌ ๋ฑ์ ๋ชจ๋ ํฌํจํ ์คํ๋ง ์ํ๊ณ๋ก๋ ์ฌ์ฉ๋ฉ๋๋ค.
1-5. ์คํ๋ง์ ํต์ฌ ๊ฐ๋ , ์ปจ์
์คํ๋ง์ ํต์ฌ ๊ฐ๋ , ์ปจ์ ์ ๋ญ๊น์?
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ณ , DB ์ ๊ทผ์ ํธ๋ฆฌํ๊ฒ ํด์ฃผ๋ ๊ธฐ์ ์ผ๊น์?
์ ์ ์ ๋ถ ํ๋ ์์ํฌ์ผ๊น์?
์น ์๋ฒ๋ ์๋์ผ๋ก ๋์์ค๊น์?
ํด๋ผ์ฐ๋, ๋ง์ดํฌ๋ก์๋น์ค์ผ๊น์?
๋ค ํต์ฌ์ด ์๋๋๋ค. ๊ฒฐ๊ณผ๋ฌผ์ผ ๋ฟ์ด์ง...
์คํ๋ง์ ์ง์ง ํต์ฌ์ ์ด๋ ๊ฒ 4๊ฐ์ง ์ ๋๋ค.
- ์คํ๋ง์ ์๋ฐ ์ธ์ด ๊ธฐ๋ฐ์ ํ๋ ์์ํฌ
- ์๋ฐ ์ธ์ด์ ๊ฐ์ฅ ํฐ ํน์ง์ธ ๊ฐ์ฒด ์งํฅ ์ธ์ด
- ์คํ๋ง์ ๊ฐ์ฒด ์งํฅ ์ธ์ด๊ฐ ๊ฐ์ง ๊ฐ๋ ฅํ ํน์ง์ ์ด๋ ค๋ด๋ ํ๋ ์์ํฌ์ ๋๋ค.
- ์คํ๋ง์ ์ข์ ๊ฐ์ฒด ์งํฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๊ฒ ๋์์ฃผ๋ ํ๋ ์์ํฌ์ ๋๋ค.

2. ์ข์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋?
์ฐ์ ๊ฐ์ฒด ์งํฅ ํน์ง์ 4๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ์ถ์ํ
- ์บก์ํ
- ์์
- ๋คํ์ฑ
ํน์ง์ ๋ํด์ ์ค๋ช ํ๊ธฐ ์ ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด ๋ญ์ง ์์์ผ ๊ฒ ์ฃ ?
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ "๊ฐ์ฒด"๋ค์ ๋ชจ์์ผ๋ก ํ์ ํ๊ณ ์ ํ๋ ๊ฒ์ด๊ณ , ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. (ํ๋ ฅ)
๋ํ, ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก๊ทธ๋จ์ ์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋๊ท๋ชจ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋ง์ด ์ฌ์ฉ๋๋ค.
์ ์ฐํ๊ณ , ๋ณ๊ฒฝ์ด ์ฉ์ดํ๋ค?
์ด๊ฒ์ ๋คํ์ฑ์ด๋ผ๊ณ ํฉ๋๋ค.
์ง๊ธ๋ถํฐ ๋คํ์ฑ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
3. ๋คํ์ฑ
3-1. ๋คํ์ฑ์ ์ค์ธ๊ณ ๋น์
- ์ค์ธ๊ณ์ ๊ฐ์ฒด ์งํฅ์ 1:1๋ก ๋งค์นญํ ์๋ ์์ง๋ง, ๊ทธ๋๋ ์ค์ธ๊ณ์ ๋น์ ๋ก ์ดํดํ๊ธฐ์๋ ์ข์ต๋๋ค.
- ์ญํ ๊ณผ ๊ตฌํ์ผ๋ก ์ธ์์ ๊ตฌ๋ถํฉ๋๋ค.
- ์ญํ : ์ธํฐํ์ด์ค
๊ตฌํ: ์ธํฐํ์ด์ค ๊ตฌํํ ๊ฐ์ฒด
- ์ญํ : ์ธํฐํ์ด์ค
์์๋ฅผ ํ ๋ฒ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.

ํฌ๊ฒ ์ด์ ์ ์ญํ ๊ณผ ์๋์ฐจ ์ญํ ์ด ์๊ณ , ์๋์ฐจ ์ญํ ์์ ์๋์ฐจ ๊ตฌํ์ด ์์ต๋๋ค.
์๋์ฐจ ์ญํ ์ 3๊ฐ์ ๋ค๋ฅธ ์๋์ฐจ๊ฐ ๊ตฌํํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ์๋ K3๋ฅผ ํ๋ค๊ฐ ์๋ฐ๋ผ๋ก ์ฐจ๋ฅผ ๋ฐ๊พธ๋ฉด ์ด์ ํ ์ ์์๊น์?
์ ๋ต์ Yes!
์๋ํ๋ฉด ์๋์ฐจ ์ญํ ์ ๋ํ ๊ตฌํ๋ง ๋ฐ๋์์ ๋ฟ์ด๋๊น์ฃ ~
๊ทธ๋์ ์๋์ฐจ๊ฐ ๋ฐ๋์ด๋ ์ด์ ์์๊ฒ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค,
์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๋ค๋ ๊ฒ์ด์ฃ .
์ด์ ๋ฅผ ์์ธํ ์์๋ณผ๊น์?
์๋์ฐจ ์ญํ ์ ์ธํฐํ์ด์ค๋ฅผ ๋ค ๋ฐ๋ผ์ ์๋์ฐจ๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด์ ์๋ ์๋์ฐจ ์ธํฐํ์ด์ค๋ง ์๊ณ ์ญํ ์ ๋ํด์๋ง ์์กดํฉ๋๋ค.
๊ทผ๋ฐ ์ค์ํ๊ฑด ์๋์ฐจ ์ญํ ์ ๋ง๋ค๊ณ ๊ตฌํ์ ๋ถ๋ฆฌํ ๊ฒ์ ์ด์ ์๋ฅผ ์ํด์ ํ ๊ฒ์ ๋๋ค.
์ด์ ์๋ฅผ ํด๋ผ์ด์ธํธ๋ผ๊ณ ์ง์ ํด๋ณด๊ฒ ์ต๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์๋์ฐจ์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋ ๋์ฃ ?
๊ทธ๋ฌ๋ฉด ๊ตฌํ์ด ๋ด๋ถ์ ์ผ๋ก ๋ฐ๋๋๋ผ๋ ์๋์ฐจ ์ญํ ๋ง ์ ๋๋ก ํ๋ฉด ์ด์ ์์๊ฒ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
๊ทธ๋์ ํด๋ผ์ด์ธํธ์๊ฒ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค.
์ด๊ฑด ๊ตฌํ์ผ๋ก ์ธ์์ ๊ตฌ๋ถํ๊ธฐ์ ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
๋ค๋ฅธ ์์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.

๋ก๋ฏธ์ค์ ์ค๋ฆฌ์ฃ ๊ณต์ฐ ๋ฌด๋๊ฐ ์์ต๋๋ค.
์ด ์์๋ ๋ก๋ฏธ์ค๋ผ๋ ์ญํ ๊ณผ ์ค๋ฆฌ์ฃ์ด๋ ์ญํ ์ด ์์ต๋๋ค.
๋ก๋ฏธ์ค๋ ์ญํ ์ ๋ณ์ฐ์์ด ํ ์๋ ์๊ณ ์๊ฐ์ค์ด ํ ์๋ ์๊ณ ์์์ด ๋ฐ๋ ค์์ ํ ์๋ ์๊ฒ ์ฃ .
๋ง์ฐฌ๊ฐ์ง๋ก ์ค๋ฆฌ์ฃ์ด๋ ์ญํ ๋ ๊น์ ์ ์ด ํ ์๋ ์๊ณ ํ์ํฌ๊ฐ ํ ์๋ ์๊ณ ๋จ์ญ๋ฐฐ์ฐ๊ฐ ์์ ํ ์๋ ์๊ณ ์ ๋ชปํ๋ ์ ๊ฐ ์์ ํ ์๋ ์๊ฒ ์ฃ .
๋ญ๊ฐ ๋๋ ๋ฐฐ์ฐ๋ ๋์ฒด๊ฐ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
๊ณต์ฐ์ ์ ๋ผ์ผ ํ๋๊น!
์ด๊ฒ์ด ๋ฐ๋ก ์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๋ค๋ ๊ฒ์ ๋๋ค.
๋ก๋ฏธ์ค๋ฅผ ํด๋ผ์ด์ธํธ, ์ค๋ฆฌ์ฃ์ ์๋ฒ๋ผ๊ณ ํ๋ฉด ์ค๋ฆฌ์ฃ(์๋ฒ)์ด ๋ฐ๋๋ค๊ณ ๋ก๋ฏธ์ค(ํด๋ผ์ด์ธํธ)์ ์ํฅ์ ์ฃผ์ง ์์ฃ .
์ด๊ฒ์ด ๋คํ์ฑ ์ ๋๋ค.
3-2. ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ - ์ฅ์
์ญํ ๊ณผ ๊ตฌํ์ผ๋ก ๊ตฌ๋ถํ๋ฉด ์ธ์์ด ๋จ์ํด์ง๊ณ , ์ ์ฐํด์ง๋ฉฐ ๋ณ๊ฒฝ๋ ํธ๋ฆฌํด์ง๋๋ค.
<์ฅ์ >
- ํด๋ผ์ด์ธํธ๋ ๋์์ ์ญํ (์ธํฐํ์ด์ค)๋ง ์๋ฉด ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋์์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋ ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋์์ ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋์ ์์ฒด๋ฅผ ๋ณ๊ฒฝํด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
ํต์ฌ์ ํด๋ผ์ด์ธํธ!
3-3. ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ - ์๋ฐ ์ธ์ด
- ์๋ฐ ์ธ์ด์ ๋คํ์ฑ์ ํ์ฉํฉ๋๋ค.
- ์ญํ = ์ธํฐํ์ด์ค
- ๊ตฌํ = ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค, ๊ตฌํ ๊ฐ์ฒด
- ๊ฐ์ฒด๋ฅผ ์ค๊ณํ ๋ ์ญํ ๊ณผ ๊ตฌํ์ ๋ช ํํ ๋ถ๋ฆฌํ๋๋ค.
- ๊ฐ์ฒด ์ค๊ณ์ ์ญํ (์ธํฐํ์ด์ค)์ ๋จผ์ ๋ถ์ฌํ๊ณ , ๊ทธ ์ญํ ์ ์ํํ๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค.
- ํต์ฌ์ ๊ตฌํ(๊ฐ์ฒด)๋ณด๋ค ์ธํฐํ์ด์ค(์ญํ )๊ฐ ๋จผ์ !
- ์๋ง์ ๊ฐ์ฒด ํด๋ผ์ด์ธํธ์ ๊ฐ์ฒด ์๋ฒ๋ ์๋ก ํ๋ ฅ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค!
3-4. ์๋ฐ ์ธ์ด์ ๋คํ์ฑ

์ค๋ฒ๋ผ์ด๋ฉ์ ๋ ์ฌ๋ ค๋ด ์๋ค.
๋ ์ฌ๋ฆฌ๊ธฐ ์ ์ ์ค๋ฒ๋ผ์ด๋ฉ๊ณผ ์ค๋ฒ๋ก๋ฉ์ด ๋ญ์ง๋ถํฐ ์์๋ณผ๊น์?
- ์ค๋ฒ๋ผ์ด๋ฉ: ์์ ๊ด๊ณ์ ์๋ ํด๋์ค์์ ์์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ํ์ ํด๋์ค์์ ์ฌ์ ์ํ๋ ๊ฒ
- ์ค๋ฒ๋ก๋ฉ: ๋ฉ์๋๋ฅผ ๋ง์ด ์ด๊ณผ ์ ์ํ์ฌ ๋ก๋ฉํ๋ ๊ฒ
์ด ๊ทธ๋ฆผ์ ์ค๋ฒ๋ผ์ด๋ฉ ๋ ๋ฉ์๋๊ฐ ์คํ๋์์ต๋๋ค.
์๋ฐ ์ธ์ด์ ๋คํ์ฑ ์ฅ์ ์ ์๊ธฐํ์๋ฉด ๋คํ์ฑ์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ์คํ ์์ ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋ชฐ๋ก ํด๋์ค ์์ ๊ด๊ณ๋ ๋คํ์ฑ, ์ค๋ฒ๋ผ์ด๋ฉ ์ ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.


ํด๋ผ์ด์ธํธ๋ MemberRepository๋ฅผ ์์กดํ๊ณ ์์ต๋๋ค.
์๊ณ ์๋ค๋ ๋ป์ ๋๋ค.

๋คํ์ฑ์ด๊ธฐ์ ๋ถ๋ชจ ํ์ ์ผ๋ก ํ ๋น ๊ฐ๋ฅํฉ๋๋ค.
public class MemberService {
private MemberRepository memberRepository = new MemoryMemberRepository();
}
public class MemberService {
private MemberRepository memberRepository = new JdbcMemberRepository();
}
MemoryMemberRepository์ JdbcMemberRepository๋ ๊ฐ๊ฐ ๋ค๋ฅธ ํด๋์ค์ด์ง๋ง, MemberRepository๋ผ๋ ๋์ผํ ๋ถ๋ชจ ํด๋์ค๋ฅผ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ ํด๋์ค ํ์ ์ ๊ฐ๋๋ก ์ ์ธ์ ํ ์ ์์ต๋๋ค.

MemberRepository ์ธํฐํ์ด์ค๋ ๋ถ๋ชจ์ ์ ํ ๊ด๊ณ ์๋ ํด๋์ค๋ ํ ๋น ๋ถ๊ฐ๋ฅํฉ๋๋ค.

MemberService๋ผ๋ ํด๋ผ์ด์ธํธ์ MemberRepository๋ผ๋ ์ธํฐํ์ด์ค๊ฐ ์๋๋ฐ ์ฌ๊ธฐ์ MemoryMemberRepository๋ฅผ ๋ฃ์ผ๋ฉด 2๋ฒ์งธ ๊ทธ๋ฆผ์ด ๋๋ ๊ฑฐ๊ณ , JdbcMemberRepository๋ฅผ ๋ฃ์ผ๋ฉด 3๋ฒ์งธ ๊ทธ๋ฆผ์ด ๋๋ ๊ฒ์ ๋๋ค.
3-5. ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ - ํ๊ณ
- ์ญํ (์ธํฐํ์ด์ค) ์์ฒด๊ฐ ๋ณํ๋ฉด ํด๋ผ์ด์ธํธ, ์๋ฒ ๋ชจ๋์ ํฐ ๋ณ๊ฒฝ์ด ๋ฐ์ํฉ๋๋ค.
- ์๋์ฐจ๋ฅผ ๋นํ๊ธฐ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค๋ฉด? ๋๋ณธ ์์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด? USB ์ธํฐํ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด? ๋ค ๋ฏ์ด๊ณ ์ณ์ผํ๊ณ , ๊ธฐ์กด ๊ฒ์ ๋ ์ด์ ๋ชป ์๋๋ค.
- ์ธํฐํ์ด์ค๋ฅผ ์์ ์ ์ผ๋ก ์ ์ค๊ณํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค!!\
- ์ธํฐํ์ด์ค๊ฐ ๊นจ์ง๋ฉด ๋..ใทใท
3-6. ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ - ์ ๋ฆฌ
- ๋คํ์ฑ์ ๋ณธ์ง
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์คํ ์์ ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ๋คํ์ฑ์ ๋ณธ์ง์ ์ดํดํ๋ ค๋ฉด ํ๋ ฅ์ด๋ผ๋ ๊ฐ์ฒด ์ฌ์ด์ ๊ด๊ณ์์ ์์ํด์ผ ํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ์๋ฒ์ ๊ตฌํ ๊ธฐ๋ฅ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค!!
- ์ค์ธ๊ณ์ ์ญํ ๊ณผ ๊ตฌํ์ด๋ผ๋ ํธ๋ฆฌํ ์ปจ์ ์ ๋คํ์ฑ์ ํตํด ๊ฐ์ฒด ์ธ์์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
- ์ ์ฐํ๊ณ , ๋ณ๊ฒฝ์ด ์ฉ์ดํ๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ์ค๊ณ์ ๋๋ค.
- ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์๋ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํฉ๋๋ค.
3-7. ์คํ๋ง๊ณผ ๊ฐ์ฒด ์งํฅ
- ๋คํ์ฑ์ด ๊ฐ์ฅ ์ค์!! ๊ฐ์ฒด ์งํฅ์ ๊ฝ๐ธ
- ์คํ๋ง์ ๋คํ์ฑ์ ๊ทน๋ํํด์ ์ด์ฉํ ์ ์๊ฒ ๋์์ค๋๋ค.
- ์คํ๋ง์์ ์ด์ผ๊ธฐํ๋ ์ ์ด์ ์ญ์ (IoC), ์์กด๊ด๊ณ ์ฃผ์
(DI)์ ๋คํ์ฑ์ ํ์ฉํด์ ์ญํ ๊ณผ ๊ตฌํ์ ํธ๋ฆฌํ๊ฒ ๋ค๋ฃฐ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
- ์คํ๋ง ์ปจํ ์ด๋๋ ๋คํ์ฑ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
์คํ๋ง์ ์ ๋๋ก ์ดํดํ๋ ค๋ฉด ๋คํ์ฑ ์ธ์ ๋ ์์์ผ ํ ๊ฒ์ด ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋ฐ๋ก SOLID!!

4. ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น (SOLID)
ํด๋ฆฐ์ฝ๋๋ก ์ ๋ช ํ ๋ก๋ฒํธ ๋งํด์ด ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น์ ์ ๋ฆฌ
์ด๊ฑฐ ๋๊ฒ ๋ฉด์ ์๋ ์ ๋์์!! ์ค์!!
SOLID๋ ์ด 5๊ฐ์ง ์์น์ ์๊ธ์๋ฅผ ๋ด ๊ฒ์ ๋๋ค.
- SRP: ๋จ์ผ ์ฑ ์ ์์น (single responsibility principle)
- OCP: ๊ฐ๋ฐฉ-ํ์ ์์น (Open/closed principle)
- LSP: ๋ฆฌ์ค์ฝํ ์นํ ์์น (Liskov substitution principle)
- ISP: ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น (Interface segregation principle)
- DIP: ์์กด๊ด๊ณ ์ญ์ ์์น (Dependency inversion principle)
4-1. SRP ๋จ์ผ ์ฑ ์ ์์น
Single responsibility principle
SRP์ ์ ์๋ "ํ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ค." ์ ๋๋ค.
๊ทธ๋ฐ๋ฐ, ์ด ํ๋์ ์ฑ ์์ด๋ผ๋ ๊ฒ์ ์ฐธ ๋ชจํธํฉ๋๋ค. ์ฑ ์์ด ํด ์ ์๊ณ ์์ ์๋ ์๊ณ , ๋ฌธ๋งฅ๊ณผ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด์ฃ .
๊ฒฐ๊ตญ ์ค์ํ ๊ธฐ์ค์ ๋ณ๊ฒฝ์ด ๋ฉ๋๋ค.
๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธ ํจ๊ณผ๊ฐ ์ ์ผ๋ฉด SRP ๋จ์ผ ์ฑ ์ ์์น์ ์ ๋ฐ๋ฅธ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด, UI ๋ณ๊ฒฝ๊ณผ ๊ฐ์ฒด์ ์์ฑ๊ณผ ์ฌ์ฉ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์์ต๋๋ค.
์ฆ, ํ๋ ๋ฐ๊ฟ ๋ ์ด๊ฒ ์ ๊ฒ ๋ค ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒ์ด๋ฉด ์ ๋ชป ์ง ๊ฒ์ ๋๋ค.
4-2. OCP ๊ฐ๋ฐฉ-ํ์ ์์น (์ค์!!)
Open/closed principle
OCP์ ์ ์๋ "์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค ์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค." ์ ๋๋ค.
์ฝ๋ ๋ณ๊ฒฝ ์์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค๊ณ ??
๋คํ์ฑ์ ํ์ฉํด๋ณด๋ฉด ๋ฉ๋๋ค.
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋ก์ด ํด๋์ค๋ฅผ ํ๋ ๋ง๋ค์ด์ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด ๋๋๋ฐ (๊ธฐ๋ฅ ์ถ๊ฐ)
์ฝ๋ ์์๋ก ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.

public class MemberService {
private MemberRepository memberRepository = new MemoryMemberRepository();
}
public class MemberService {
//private MemberRepository memberRepository = new MemoryMemberRepository(); //์ฝ๋ ๋ณ๊ฒฝ
private MemberRepository memberRepository = new JdbcMemberRepository();
}
MemberRepository๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ Memory์์ Jdbc๋ก ๋ฐ๊พธ๋ ค๊ณ ํ๋ ์ํฉ์ ๋๋ค.
์ ์ํฉ์ MemberService ๋ด์์ ์ฃผ์ ํ MemberRepository์ ๊ตฌํ์ฒด๋ฅผ ์ง์ ๋ณ๊ฒฝํ์๋๋ฐ ์ด๋ OCP ์๋ฐ์ ๋๋ค.
OCP๋ฅผ ์๋ฐํ์ง ์์ผ๋ ค๋ฉด ๋ฐ์ ์ฝ๋์ฒ๋ผ MemberService๊ฐ MemberRepository์ ์ง์ ์ ์ธ ๊ตฌํ์ฒด๋ฅผ new๋ก ํ ๋นํ๋ ๊ฒ์ด ์๋ ์ถ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ์์ค๋ ๋ฐฉ์์ ์ฑํํด์ผ ํฉ๋๋ค.
public interface MemberRepository {
void save(Member member);
}
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
@Override
public void save(Member member) {
store.put(member.getId(), member);
}
}
public class JdbcMemberRepository implements MemberRepository {
@Override
public void save(Member member) {
String sql = "insert into member(member_id, name) values(?, ?)";
Connection con = con = getConnection();
PreparedStatement pstmt = con.prepareStatement(sql);
...
}
}
์์ ์ฝ๋๋ MemberRepository๋ผ๋ ์ถ์ํ ์ธํฐํ์ด์ค์ ๊ตฌ์ฒดํ๋ ๊ตฌํ์ฒด์ธ MemoryMemberRepository์ JdbcMemberRepsitory๋ฅผ ๊ตฌํํ๋ ์ฝ๋์ ๋๋ค.
public class MemberService {
private MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
์์ ์ฝ๋๋ MemberService๋ฅผ ๊ตฌํํ๋ ์ฝ๋์ ๋๋ค.
MemberService memberService = new MemberService(new JdbcMemberRepository());
memberService.save(...);
Memory ๊ธฐ๋ฐ์ MemberRepository๋ฅผ ์ฌ์ฉํ๋ MemberService๊ฐ ๋ฐ์ดํฐ๋ฅผ DB์ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ๊พธ๊ธฐ ์ํด ๊ธฐ์กด์ MemoryMemberRepository๋ฅผ ์์ ํ๋ ๊ฒ์ด ์๋ JdbcMemberRepository๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์์ผ๋ก ํ์ฅ์ ํ์ต๋๋ค.
์ด๋ OCP๋ฅผ ์ง์ผ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ฐฉ์์ ๋๋ค.
4-3. LSP ๋ฆฌ์ค์ฝํ ์นํ ์์น
Liskov substitution principle
LSP์ ์ ์๋ "ํ๋ก๊ทธ๋จ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค." ์ ๋๋ค.
์ธํฐํ์ด์ค์์ ํด๋น ๋ฉ์๋๊ฐ ์ด๋ค ๊ธฐ๋ฅ์ ํด๋ด์ผ ํ ์ง ์ ํด์ ธ ์๊ณ , ํ์ ํด๋์ค๋ ์ธํฐํ์ด์ค์์ ์ ํ ๊ท์ฝ์ ๋ฌด์กฐ๊ฑด ์ง์ผ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์๋์ฐจ ์ธํฐํ์ด์ค์ ์์ ์ '์์ผ๋ก ๊ฐ์ผ ํ๋ค'ํ๋ ๊ท์ฝ์ด ์ ํด์ ธ ์์ต๋๋ค.
์ฌ์ค ๊ทผ๋ฐ ์ด ์์ ์ ๊ธฐ๋ฅ์ ๋ค๋ก ๊ฐ๊ฒ ๊ตฌํํด๋ ์ปดํ์ผํ๋ ๋ฐ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ทผ๋ฐ, ์ปดํ์ผ์ ์ฑ๊ณตํ๋ ๊ฒ์ ๋์ด์ ๊ธฐ์กด์ ์๋ ๊ท์ฝ์ ์๋ฐํ๋ฉด LSP ๋ฆฌ์ค์ฝํ ์นํ ์์น์ ์๋ฐํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋์ ์์ ์ ๊ธฐ๋ฅ์ ๋๋ฆฌ๋๋ผ๋ ๋ฌด์กฐ๊ฑด ์์ผ๋ก ๊ฐ๊ฒ ํด์ผ LSP๋ฅผ ์๋ฐํ๋ ๊ฒ์ด ์๋๊ฒ ๋ฉ๋๋ค.
4-4. ISP ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
Interface segregation principle
ISP์ ์ ์๋ "ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค" ์ ๋๋ค.
์๋์ฐจ ์ธํฐํ์ด์ค๋ฅผ ์ด์ ์ธํฐํ์ด์ค์ ์ ๋น ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํ๋ฉด, ์ฌ์ฉ์ ํด๋ผ์ด์ธํธ๋ ์ด์ ์ ํด๋ผ์ด์ธํธ์ ์ ๋น์ฌ ํด๋ผ์ด์ธํธ๋ก ๋ถ๋ฆฌํ ์ ์๊ฒ ์ฃ ?
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ๋ถ๋ฆฌํด์ ์ ๋น ์ธํฐํ์ด์ค ์์ฒด๊ฐ ๋ณํด๋ ์ด์ ์ ํด๋ผ์ด์ธํธ์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
์ด๋ ๊ฒ ๊ธฐ๋ฅ์ด ๋ง์ ์ธํฐํ์ด์ค ํ๋๋ฅผ ๋ถ๋ฆฌํ๋ฉด ์ธํฐํ์ด์ค๊ฐ ๋ช ํํด์ง๊ณ , ๋์ฒด ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค.
4-5. DIP ์์กด๊ด๊ณ ์ญ์ ์์น (์ค์!!)
Dependency inversion principle
"์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์ ๋๋ค." ๋ผ๋ ์์กด์ฑ ์ฃผ์ ์ ์ด ์์น์ ๋ฐ๋ฅด๋ ๋ฐฉ๋ฒ ์ค ํ๋์ ๋๋ค.
์ฝ๊ฒ ์๊ธฐํด์ ๊ตฌํ ํด๋์ค์ ์์กดํ์ง ๋ง๊ณ , ์ถ์์ ์ธ ์ธํฐํ์ด์ค์ ์์กดํ๋ผ๋ ๋ป์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ๋ฐ๋ผ๋ณด์ง ๋ง๊ณ ์ธํฐํ์ด์ค๋ง ๋ฐ๋ผ๋ณด๋ผ๋ ๋ป์ ๋๋ค.
์์ ์์ ๋ก ๋ฐ์ง๋ฉด MemberService๊ฐ MemberRepository ์ธํฐํ์ด์ค๋ง ๋ฐ๋ผ๋ณด๊ณ MemoryMemberRepository์ JdbcMemberRepository์ ๋ํด์๋ ๋ชฐ๋ผ์ผ ํ๋ค๋ ๋ป์ ๋๋ค.
์์์ ์๊ธฐํ๋ ์ญํ ์ ์์กดํ๊ฒ ํด์ผ ํ๋ค๋ ๊ฒ๊ณผ ๊ฐ์ผ๋ฉฐ, ๊ตฌํ์ ์์กดํ๋ฉด ๋์ฒด๊ฐ ์ด๋ ค์์ง๊ณ ๋ณ๊ฒฝ์ด ์ด๋ ค์์ง๋ฏ๋ก ์ถ์์ ์ธ ์ธํฐํ์ด์ค์ ์์กดํด์ผ ์ ์ฐํ๊ฒ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์ฝ๋ ์์๋ก ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.

public class MemberService {
private MemberRepository memberRepository = new JdbcMemberRepository();
}
MemberRepository๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ Memory์์ Jdbc๋ก ๋ฐ๊พธ๋ ค๊ณ ํ๋ ์ํฉ์ ๋๋ค.
์ ์ํฉ์ MemberService ๋ด์์ ์ธ๋ถ ๊ตฌํ์ ๋ด๋นํ๋ JdbcMemberRepository๋ฅผ ์์กดํ๊ธฐ ๋๋ฌธ์ DIP ์๋ฐ์ ๋๋ค.
DIP๋ฅผ ์๋ฐํ์ง ์์ผ๋ ค๋ฉด ๋ฐ์ ์ฝ๋์ฒ๋ผ ์ถ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ์์กดํ๋ ๋ฐฉ์์ ์ฑํํด์ผ ํฉ๋๋ค.
public interface MemberRepository {
void save(Member member);
}
public class JdbcMemberRepository implements MemberRepository {
@Override
public void save(Member member) {
// ... ์ ์ฅ ๋ก์ง
}
}
์์ ์ฝ๋๋ MemberRepository๋ฅผ ๊ตฌํํ๋ ์ฝ๋์ ๋๋ค.
public class MemberService {
private MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
์์ ์ฝ๋๋ MemberService๋ฅผ ๊ตฌํํ๋ ์ฝ๋์ ๋๋ค.
MemberService memberService = new MemberService(new JdbcMemberRepository());
memberService.save(...);
์์ ์ฝ๋๋ MemberService๋ฅผ ์ ์ธํ ๋์ ์์ ์ฝ๋์ ๋๋ค.
MemberService๊ฐ ์ธ๋ถ์ ์ธ ๊ตฌํ์ ๋ด๋นํ๋ JdbcMemberRepository์ ์์กดํ์ง ์๊ณ ์ถ์ํ๋ ์ธํฐํ์ด์ค์ธ MemberRepository๋ง ์์กดํ๊ธฐ ๋๋ฌธ์ DIP๋ฅผ ์ง์ผฐ์ต๋๋ค.
5. ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
5-1. ๋ค์ ์คํ๋ง์ผ๋ก
์คํ๋ง ์ด์ผ๊ธฐ์ ์ ๊ฐ์ฒด ์งํฅ ์ด์ผ๊ธฐ๊ฐ ๋์ฌ๊น์?
์คํ๋ง์ ๋ค์ ๊ธฐ์ ๋ก ๋คํ์ฑ๊ณผ OCP, DIP๋ฅผ ๊ฐ๋ฅํ๊ฒ ์ง์ํฉ๋๋ค.
- DI (Dependency Injection): ์์กด๊ด๊ณ, ์์กด์ฑ ์ฃผ์
- DI ์ปจํ
์ด๋ ์ ๊ณต
- ์๋ฐ ๊ฐ์ฒด๋ค์ ์ด๋ค ์ปจํ ์ด๋ ์์ ๋ฃ์ด๋๊ณ ์ด ์์์ ์์กด๊ด๊ณ๋ฅผ ์๋ก ์ฐ๊ฒฐํด์ฃผ๊ณ ์ฃผ์ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด ์ค๋๋ค.
์ด๊ฒ๋ค์ ํ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋์ ๋ณ๊ฒฝ ์์ด ๊ธฐ๋ฅ ํ์ฅ์ด ๊ฐ๋ฅํ๋ฉฐ ์ฝ๊ฒ ๋ถํ์ ๊ต์ฒดํ๋ฏ์ด ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
์๋ ์ ์คํ๋ง ์๋ ์์ ์ ์ด๋ค ๊ฐ๋ฐ์๊ฐ ์ข์ ๊ฐ์ฒด ์งํฅ ๊ฐ๋ฐ์ ํ๋ ค๊ณ OCP, DIP ์์น์ ์งํค๋ฉด์ ๊ฐ๋ฐ์ ํด๋ดค์ต๋๋ค.
๊ทธ๋ฌ๋ ๋๋ฌด ํ ์ผ์ด ๋ง์์ต๋๋ค. ๊ทธ๋์ ํ๋ ์์ํฌ๋ก ๋ง๋ค์ด๋ฒ๋ ธ์ต๋๋ค.
์์ํ๊ฒ ์๋ฐ๋ก OCP, DIP ์์น๋ค์ ์งํค๋ฉด์ ๊ฐ๋ฐ์ ํด๋ณด๋ฉด ๊ฒฐ๊ตญ ์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค๊ฒ ๋ฉ๋๋ค. (๋ ์ ํํ๋ DI ์ปจํ ์ด๋)
๋ง์ง๋ง์ผ๋ก...
๊ฐ์ฅ ์ค์ํ๊ฑด ๋ชจ๋ ์ค๊ณ์๋ ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํด์ผํ๋ค!
์ ์ฐํ๊ฒ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํด์ผ ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ๋ค!
๋ค์ ์น์ ๋ถํฐ๋ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ฝ๋ ์์ฃผ๋ก ์ ๋ฆฌํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ผ ์๋ฝ~~
