DevLog ๐ถ
[Spring] ์คํ๋ง์ด๋? ๋ณธ๋ฌธ
- ๊น์ํ ๋์ '์คํ๋ง ํต์ฌ์๋ฆฌ - ๊ธฐ๋ณธํธ'์ ๋ณด๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค ๐
| ์คํ๋ง์ด๋?
- ์๋ฐ ๊ธฐ๋ฐ์ ์ธ์ด ํ๋ ์์ํฌ
- ์ข์ ๊ฐ์ฒด ์งํฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๊ฒ ๋์์ฃผ๋ ํ๋ ์์ํฌ
| ๊ฐ์ฒด์งํฅ์ด๋?
- ๊ฐ์ฒด ์งํฅ์ ๊ธฐ๋ณธ 4๊ฐ์ง ํน์ฑ
โ ์ถ์ํ
โ ์บก์ํ
โ ์์
โ ๋คํ์ฑ
- ๊ฐ์ฒด๋ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ํ๋ก๊ทธ๋จ์ ์ ์ฉํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๊ฒ ๋ง๋ ๋ค!
- ์ ์ฐํ๊ณ , ๋ณ๊ฒฝ์ ์ฉ์ดํ๋ค.
| ๊ทธ๋ ๋ค๋ฉด, ๋คํ์ฑ์ด๋ ๋ฌด์์ผ๊น?
- ์ธ์์ ์ญํ ๊ณผ ๊ตฌํ์ผ๋ก ๋ถ๋ฆฌํด๋ณด์.
- ํด๋ผ์ด์ธํธ๋ ๋์์ ์ญํ (์ธํฐํ์ด์ค)๋ง ์๋ฉด ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋์์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋ ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋์์ ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ด๋, ์ํฅ์ ๋ฐ์ง ์๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋์ ์์ฒด๋ฅผ ๋ณ๊ฒฝํด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
- ๊ทธ๋ ๋ค๋ฉด, ์ญํ ๊ณผ ๊ตฌํ์ด ๋๋์ฒด ๋ฌด์์ ๋งํ๋ ๊ฑธ๊น?
โ ์ญํ = ์ธํฐํ์ด์ค
โ ๊ตฌํ = ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ (implements) ํด๋์ค
- ๊ตฌํ๋ณด๋ค ์ญํ ์ด ๋ ์ค์ํ๋ค!
- ํด๋ผ์ด์ธํธ๋ ์์ฒญํ๋ ์ฌ๋, ์๋ฒ๋ ์๋ตํ๋ ์ฌ๋.
- ์๋ง์ ๊ฐ์ฒด ํด๋ผ์ด์ธํธ์ ๊ฐ์ฒด ์๋ฒ๋ ํ๋ ฅ ๊ด๋ก๋ฅผ ๊ฐ์ง๋ค.
- ํด๋ผ์ด์ธํธ๋ ๋์์ ์๋ฒ๊ฐ ๋ ์๋ ์๊ธฐ์ ๋ ๋ค๋ฅธ ์๋ฒ์๊ฒ ์์ฒญ์ ํ ์๋ ์๋ ๊ฒ.
- JAVA์์์ ๋คํ์ฑ์ด๋?
- Overriding์ผ๋ก ์ํ. ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋ ๋ฉ์๋๊ฐ ์คํ๋๋ ๊ฒ.
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ์คํ ์์ ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅ.
- ๋น์ฐํ ํด๋์ค์ ์์ ๊ด๊ณ์์๋ ๋๋ค. (์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ค์ค ์์๋ ๋๊ณ ์กฐ๊ธ ๋ ๋ซ๊ฒ ์ง๋ง)
- ๊ฒฐ๊ณผ์ ์ผ๋ก ๋คํ์ฑ์ด๋
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์คํ ์์ ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅ
- “ํ๋ ฅ”์ด๋ผ๋ ๊ด์ ์์ ๊ฐ์ฒด ์ฌ์ด์ ๊ด๊ณ๋ฅผ ์ดํดํ๊ธฐ.
- ํด๋ผ์ด์ธํธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ์๋ฒ์ ๊ตฌํ ๊ธฐ๋ฅ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ๋๋ก!
- ๋จ, ์ธํฐํ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ตฌํ์๋ ๋ค ์ํฅ์ ๋ผ์น๊ธฐ ๋๋ฌธ์, ์ด๊ธฐ์ ์ธํฐํ์ด์ค๋ฅผ ์์ ์ ์ผ๋ก ์ ์ค๊ณํ๋ ๊ฒ์ด ์ค์ํ๋ค.
- ์คํ๋ง์์ ๊ฐ์ฒด ์งํฅ์?
- ์คํ๋ง์ ๋คํ์ฑ์ ๊ทน๋ํํด์ ์ด์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ์ญํ
- IoC, DI๋ “๋คํ์ฑ”์ ํ์ฉํ์ฌ ์ญํ ๊ณผ ๊ตฌํ์ ํธ๋ฆฌํ๊ฒ ๋ค๋ฃจ๋๋กํ ๊ฒ.
| ์ข์ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น (SOLID)
โ SRP (๋จ์ผ ์ฑ
์ ์์น)
ํ๋์ ํด๋์ค๋ ํ๋์ ์ฑ
์๋ง ๊ฐ์ ธ์ผ ํ๋ค.
๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธ ํจ๊ณผ๊ฐ ์ ๊ฒ ์ค๊ณํ๊ธฐ.
โ OCP (๊ฐ๋ฐฉ-ํ์ ์์น)
ํ์ฅ์๋ ์ด๋ ค ์์ผ๋, ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค.
๋คํ์ฑ์ ํตํด, ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ.
MemberRepository m = new MemoryMemberRepository();
MemberRepository m = new JdbcMemberRepository()
๊ทธ๋ฌ๋, ์์ ๊ฐ์ด ๋จ์ํ ๋คํ์ฑ์ ํ์ฉํ๋ฉด ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค. ์ด๋ฌ๋ฉด OCP๊ฐ ๊นจ์ง๊ฒ ๋๋ค.
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์กฐ๋ฆฝ, ์์ฑ์๊ฐ ํ์ํ๋ค!
๊ทธ๋ฆฌ๊ณ , ์ด ์ญํ ์ Spring์ด ํด์ฃผ๋ ๊ฒ.
โ LSP (๋ฆฌ์ค์ฝํ ์นํ ์์น)
ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ ํ์ ํ์
์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค.
์ธํฐํ์ด์ค์ ๊ท์ฝ์ ์งํจ ์ํ๋ก ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์์ฑํด์ผ ํ๋ค.
โ ISP (์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น)
์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค.
ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ๋ฌ ๊ฐ๋ก ๋ถ๋ฆฌํ๊ณ , ๋ช
ํํ๋๋ก.
โ DIP (์์กด๊ด๊ณ ์ญ์ ์์น)
ํ๋ก๊ทธ๋๋จธ๋ ๊ตฌํ ํด๋์ค(๊ตฌ์ฒดํ)์ ์์กดํ์ง ์๊ณ , ์ธํฐํ์ด์ค(์ถ์ํ)์ ์์กดํด์ผ ํ๋ค.
์ฆ, ์ญํ ์ ์์กดํด์ผ ํ๋ฉฐ, ์ธํฐํ์ด์ค์ ์์กดํด์ผ ์ ์ฐํ๊ฒ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋๋ค.
MemberRepository m = new MemoryMemberRepository();
ํ์ฌ ์ด ์ฝ๋๋ memberRepository์ ํ ๋นํ๋ฉด์ ์ธํฐํ์ด์ค๋ฟ๋ง ์๋๋ผ ๊ตฌํ์ฒด์ธ MemoryMemberRepository๊น์ง ์์กดํ๊ฒ ๋๋ค.
| ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ์คํ๋ง
- ๋คํ์ฑ๋ง์ผ๋ก๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ฉด ํด๋ผ์ด์ธํธ๊น์ง ๋ณ๊ฒฝ๋๋ค.
- OCP, DIP๋ฅผ ์๋ฐํ๊ฒ ๋๋ค.
- ์ด๋ฅผ ์ํด, ์คํ๋ง์์๋ ๋คํ์ฑ + OCP, DIP๊น์ง ๊ฐ๋ฅํ๋๋ก ์ง์ํ๋ค!
- DI : ์์กด๊ด๊ณ, ์์กด์ฑ ์ฃผ์
- DI Container์ ์ ๊ณต
- ํด๋ผ์ด์ธํธ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋๋ก.
โ ๋จ, ์ญํ ๊ณผ ๊ตฌํ์ ๊ตฌ๋ถํ๋ ๊ฑด ์ข์ง๋ง…
- ์ค๋ฌด์์๋ ์ธํฐํ์ด์ค๋ฅผ ๋์
ํ๋ฉด ‘์ถ์ํ’ ๋น์ฉ์ด ๋ค์ด๊ฐ๋ค.
- ์ฝ๋๋ฅผ ํ๊ณ ๋ค์ด๊ฐ์ผ ์ ์ง๋ณด์๊ฐ ๊ฐ๋ฅํด์ง๋ค๋ ์ง… ๊ทธ๋ฐ ๊ฒ.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ๊ธฐ๋ฅ์ ํ์ฅํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ , ํ์ํ ๋ ๋ฆฌํฉํฐ๋ง์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ๋์
ํด๋ ์ข๋ค.