IoC, DI, ๊ทธ๋ฆฌ๊ณ ์ปจํ ์ด๋
by JiwonDev์คํ๋ง์ ๊ณต๋ถํ๋ค๋ณด๋ฉด IoC, DI, ์ปจํ ์ด๋์ ๊ฐ์ ๋จ์ด๋ฅผ ๋ง์ด ๋ณด๊ฒ๋๋ค. ์ด๋ ์ฐ๋ฆฌ๊ฐ ์ด์ ๊ธ์์ ๋ฐฐ์ด ๊ฐ๋ ์ ์๊ฐํ๋ฉด ์ฝ๊ฒ ์ดํด ํ ์ ์๋ค.
# IoC (Inversion of Control), ์ ์ด์ ์ญ์
- ๊ธฐ์กด์๋ ๊ตฌํ์ฒด๊ฐ ํ์ํ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ์ง์ ์์ฑํด์ ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ผ๋ก ๋ง๋ค์์๋ค. ํ์ง๋ง ์ด๋ฐ ๋ฐฉ๋ฒ์ ๊ฐ๋ ์ด ์๋ ๊ณต์ฐ๋ฐฐ์ฐ๊ฐ ์๋ ๋ฐฐ์ฐ๋ฅผ ์บ์คํ ํ๊ณ , ์ํ์ ์ค๋นํ๋ ๊ฒ์ฒ๋ผ ํผ์์ ๋๋ฌด ๋ง์ ์ฑ ์์ ์ง๊ณ ์๋ค๊ณ ๋ณผ ์ ์๋ค.
- ์ฐ๋ฆฌ๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ์ํด AppConfig๋ผ๋ ๊ตฌ์ฑ์์ญ์ ๋ง๋ค์ด ์ฌ๋ฌ ๊ตฌํ์ฒด๋ฅผ ์์ฑ, ์ฃผ์ ํ๋ ์ญํ ์ ๋ถ๋ฆฌ์์ผฐ๋ค. ์ด์ ์คํ์์ญ์ ์๋ ๊ฐ๊ฐ์ ๊ตฌํ์ฒด๋ค์ ์ด์ ๋ ์ด์ ์์ ์ด ํ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์๋ ์๊ณ , ๊ตฌํ์ฒด๊ฐ ๋ฐ๋์๋ค๊ณ ํด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ํ์๋ ์๋ค.
- ์ฆ ํ๋ก๊ทธ๋จ์ ๋ํ ์ ์ด ํ๋ฆ์ ๋ํ ๊ถํ์ AppConfig๊ฐ ๊ฐ์ง๊ณ ์๋ค. ์๋น์ค ์คํ์์ญ์ ๋ฌต๋ฌตํ ์์ ์ ๋ก์ง์ ์คํํ ๋ฟ, ์ ์ฒด ์ ์ด ํ๋ฆ์ ๋ํด์๋ ์ ํ ๋ชจ๋ฅธ๋ค.
- ์ด๋ ๊ฒ ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ง์ ์ ์ดํ๋ ๊ฒ์ด ์๋๋ผ, ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ด์ ์ญ์ (IoC) ๋ผ๊ณ ํ๋ค.
# ํ๋ ์์ํฌ vs ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ณดํต ํ๋ ์์ํฌ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ๋ถํ ๋ IoC ๋ผ๋ ๋ง์ ๋ง์ด ์ฌ์ฉํ๋ค. ํ๋ ์์ํฌ๊ฐ ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ ์ดํ๊ณ , ๋์ ์คํํ๋ฉด ๊ทธ๊ฒ์ ํ๋ ์์ํฌ๊ฐ ๋ง๋ค. ํ์ง๋ง ๋ด๊ฐ ์์ฑํ ์ฝ๋์ ์ ์ฒด ํ๋ฆ์ ๋ด๊ฐ ๋ด๋นํ๋ค๋ฉด, ๊ทธ๊ฑด ํ๋ ์์ํฌ๊ฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธ ๊ฒ์ด๋ค. (์ฆ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Junit๋ ์ผ์ข ์ ํ๋ ์์ํฌ๋ผ๊ณ ๋ณผ ์ ์๋ค.)
#DI(Dependency Injection), ์์กด๊ด๊ณ ์ฃผ์
์์กด๊ด๊ณ ์ฃผ์ ์ ๋ช ํํ๊ฒ ์ดํดํ๋ ค๋ฉด ์ ์ ์ธ ํด๋์ค ์์กด ๊ด๊ณ์, ์คํ ์์ ์ ๊ฒฐ์ ๋๋ ๋์ ์ธ ๊ฐ์ฒด(์ธ์คํด์ค) ์์กด ๊ด๊ณ๋ฅผ ๋ถ๋ฆฌํด์ ์๊ฐํด์ผ ํ๋ค.
@ ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ
ํด๋์ค๊ฐ ์ฌ์ฉํ๋ ์์กด๊ด๊ณ๋ import ์ฝ๋๋ง์ผ๋ก๋ ์ฝ๊ฒ ํ๋จํ ์ ์๋ค. ์ด๋ ๊ตณ์ด ์ฑ์ ์คํ์ํค์ง ์์๋ ๋ถ์๊ฐ๋ฅํ๋ค. ์๋์ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ํตํด OrderServiceImpl์ MemberRepository์ DiscountPolicy์ ์์กดํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ํ์ง๋ง ์ค์ ์คํ์ ์ด๋ค ๊ตฌํ์ฒด๊ฐ ์ฃผ์ ๋๊ณ ์ด๋ป๊ฒ ์คํ๋๋์ง๋ ์ ์ ์๋ค.
@ ๋์ ์ธ ๊ฐ์ฒด(์ธ์คํด์ค) ์์กด๊ด๊ณ
์ฑ ์คํ ์์ ์ ์์ฑ๋ ์ธ์คํด์ค์ ์ฐธ์กฐ๊ฐ์ด ์ฐ๊ฒฐ๋ ์์กด๊ด๊ณ์ด๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
์คํ ์์ (๋ฐํ์)์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์ ํด๋ผ์ด์ธ
ํธ์ ์๋ฒ์ ์ค์ ์์กด๊ด๊ณ๊ฐ ์ฐ๊ฒฐ ๋๋ ๊ฒ์ ์์กด๊ด๊ณ ์ฃผ์ ์ด๋ผ ํ๋ค. - ์ค์ ๋์์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , ๊ทธ ์ฐธ์กฐ๊ฐ์ ์ ๋ฌํด์ ์ฐ๊ฒฐ๋๋ค.
- ์์กด๊ด๊ณ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ํธ์ถํ๋ ํ์ ์ ์ธ์คํด์ค๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
- ์์กด๊ด๊ณ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ์ ์ ์ธ ์์กด๊ด๊ณ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ๋์ ์ธ ์ธ์คํด์ค ์์กด๊ด๊ณ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
# IoC ์ปจํ ์ด๋, DI ์ปจํ ์ด๋
AppConfig ์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ฉด์ ์์กด๊ด๊ณ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ์ [ IoC ์ปจํ ์ด๋ ๋๋ DI ์ปจํ ์ด๋ ]๋ผ ํ๋ค. ์ด ๋์ ๊ฐ์ ๋ง์ด์ง๋ง, IoC๋ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋จ์ด์ด๊ธฐ์ '์์กด๊ด๊ณ ์ฃผ์ '์ ์ด์ ์ ๋ง์ถฐ DI ์ปจํ ์ด๋๋ผ๊ณ ๋ถ๋ฅด๊ฒ ๋ ๊ฒ์ด๋ค.
- ์ดํ๋ฆฌ์ผ์ด์ ์ ์กฐ๋ฆฝ์ ๋ด๋นํ๋ ์ปจํ ์ด๋๋ผ๋ ์๋ฏธ๋ก ์ด์ ๋ธ๋ฌ, ์ค๋ธ์ ํธ ํฉํ ๋ฆฌ๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ค.
# ์ด์ ์คํ๋ง ํ๋ ์์ํฌ๋ก๋ก
์์์๋ ํฐ์บฃ ์๋ฒ๋ฅผ ์ฝ๊ฒ ๋์ฐ๊ธฐ ์ํด์ ์คํ๋ง๋ถํธ๋ฅผ ์ด์ฉํ์ ๋ฟ, ์ ๋ถ ์์ํ ์๋ฐ์ฝ๋๋ก ๋ชจ๋ ๊ฐ์ฒด๋ค์ ์์ฑํ์๋ค. (์คํ๋ง์ ๊ธฐ๋ฅ์ ์ด ๊ฒ์ด ์๋ค.) ์ด์ ๋ค์ ๊ธ์์ ์คํ๋ง ํ๋ ์์ํฌ๋ ์์ ๊ฐ๋ ๋ค์ ์ด๋ป๊ฒ ์ง์ํ๋์ง ์ง์ ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ ์์๋ณด์.
'๐ฑ Spring Framework > Spring Core' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
#6. ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น (0) | 2021.08.02 |
---|---|
#5 ์คํ๋ง์ผ๋ก ์ ํํ๊ธฐ (0) | 2021.08.02 |
#4 ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ(SOC), ์์กด์ฑ ์ฃผ์ (DI) (0) | 2021.08.02 |
#3 ์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ์กด์ ๋ถํธํ ์ค๊ณ ๋ฐฉ์ (0) | 2021.08.01 |
#2 ์คํ๋ง ํ๋ก์ ํธ ์์ฑ (0) | 2021.07.25 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev