DI
์์กด์ฑ ์ฃผ์
์ด๋?
๊ฐ์ฒด ์์ฒด๊ฐ ์๋๋ผ, ์ธ๋ถ (Framework ๋ฑ)์ ์ํด ๊ฐ์ฒด ์์กด์ฑ์ด ์ฃผ์ ๋๋ ์ค๊ณ ํจํด
ํ์๋ก ํ๋ ์ค๋ธ์ ํธ๋ฅผ ์ค์ค๋ก ์์ฑํ๋ ๊ฒ์ด ์๋,
์ธ๋ถ๋ก๋ถํฐ ์ฃผ์
๋ฐ๋ ๊ธฐ๋ฒํ์ํ ์์์ ์ธ๋ถ์์ ๋ฃ์ด์ฃผ๋๊ฒ ๋ฐ๋ก ์์กด์ฑ ์ฃผ์ ์ด๋ค
DI ์ IoC (Inversion of Control)
Dependency Injection์
IoC ๊ฐ๋ ์ด ์ ์ฉ๋ ๊ฒฐ๊ณผ๋ฌผ
์ค ํ๋์ด๋ค์์กด์ฑ์ ์ฃผ์ ํ๋ค๋ ๊ฒ์ IoC ์ ์ธ ํ์๋ก ๋ฐ๋ผ๋ณผ ์ ์์ง๋ง, IoC์ ์์กด์ฑ ์ฃผ์ ์ด ๊ฐ์ ๊ฒ์ ์๋๋ค
DI์ DIP (Dependency Inversion Principle)
DI๋ DIP๋ฅผ ๊ตฌํํ๋ ๊ธฐ๋ฒ์ค ํ๋์ผ ๋ฟ ์๋ก ๊ฐ์ ๊ฐ๋ ์ด ์๋๋ค
์คํ๋ง์์์ ์์กด์ฑ ์ฃผ์
์ด๋?
์คํ๋ง์ DI๋ผ๋ ๋ฐฉ์์ ์ด์ฉํ์ฌ ๋ชจ๋๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ์ด์ค๋ค
์คํ๋ง์์์ DI๋
Spring IoC Container
๊ฐ ๊ฐ๋ฐ์ ๋์ ์ ์๋ ๋๋กBean
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ์์กด์ฑ์ ๋์ ์ฃผ์
ํ๋ ๊ฒ์ ์๋ฏธํ๋ค์ฌ๊ธฐ์ IoC๋ ์ ์ด์ ์ญ์ ์ด๋ผ๋ ๋ง๋ก ์ฌ์ฉ์๊ฐ ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์, Spring์ IoC Container๊ฐ ๋์ ํด์ค๋ค๋ ๋ง์ด๋ค
์คํ๋ง์์๋ ์ด๋ป๊ฒ ๊ตฌํํ๋๊ฐ?
๊ฐ๋ฐ์๊ฐ ํด์ผํ๋ ์ผ
Bean class ์์ฑ
์ฃผ์ ์ ์ํ ์ค์ (xmlํ์ผ ๊ธฐ์ ๋๋ @(์ด๋ ธํ ์ด์ ) ๊ธฐ์ )
์ ์์กด์ฑ ์ฃผ์
์ ์ฌ์ฉํด์ผ ํ๋๊ฐ?
์์กด์ฑ ์ฃผ์ ์ ์ด์ฉํ๋ฉด ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์๋ค
๋์จํ ๊ฒฐํฉ์ด ๊ฐ๋ฅํ๋๋ก ์ ๋ํ ์ ์๊ฒ ๋๊ณ , ์ด ๊ณผ์ ์์ OCP ์์น์ ์ ์ฉํ ์ ์๊ฒ ๋๋ค
OCP (Open Closed Principle - ๊ฐ๋ฐฉ ํ์ ์์น)
ํ์ฅ์ ๋ํด ์ด๋ ค์๊ณ , ์์ ์ ๋ํด์๋ ๋ซํ์์ด์ผ ํ๋ค๋ ์์น
์คํ๋ง์ IoC ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค
IoC๋ฅผ ์ด์ฉํ๋ฉด
๋ก์ง ์คํ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ
๊ฐ ๊ฐ๋ฅํด์ง๋ฉฐ, ๊ตฌํ ๊ฐ์ ์ ํ์ด ์ฌ์์ง๋ค์ปจํ ์ด๋๊ฐ Bean์ ๋ผ์ดํ ์ฌ์ดํด์ ๊ด๋ฆฌํ๋ฏ๋ก, ๊ฐ๋ฐ์์ ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ์ค์ด๋ ๋ค๋ ์ฅ์ ์ด ์๋ค
IoC์์ ์ฌ์ฉํ๋ ํจํด์ด ๋ฐ๋ก DI์ด๋ค
DI ๋ฐฉ์๊ณผ ์ฅ๋จ์
Spring Framework์์๋ Dependency Injection์ 3๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ง์ํ๊ณ ์๋ค
์์ฑ์ (constructor) ์ฃผ์
์์ฑ์์ ์์กด์ฑ ์ฃผ์ ์ ๋ฐ๊ณ ์ ํ๋ field๋ฅผ ๋์ดํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ๊ถ๊ณ ๋๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค
์ฅ์
์ธ์คํด์ค๊ฐ ์์ฑ๋์์ ๋ ์์กด์ฑ์ด ์กด์ฌํ๋ ๊ฒ์ด ๋ณด์ฅ๋๊ธฐ ๋๋ฌธ์, ์์กด์ฑ ์กด์ฌ ์ฌ๋ถ๊ฐ ๋ณด์ฅ๋๊ณ ์์กด์์
immutable
ํ๊ฒ ์ ์ํ ์ ์๋คํ์์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ ๋ ํผ๋ฐ์ค ์์ด๋ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง ๋ชปํ๋๋ก ๊ฐ์ ํ๋ค
Spring 4.3 ์ด์๋ถํฐ๋,
์์ฑ์๊ฐ ํ๋
์ธ ๊ฒฝ์ฐ @Autowired๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๋ค๋ฌต์์ ์์ฑ์ ์๋ ์ฃผ์
Circular Dependency (์ํ ์ฐธ์กฐ) ์์กด์ฑ์ ์์์ฐจ๋ฆด ์ ์๋ค
์์กด์ฑ ๋์ field๋ฅผ
final
๋ก ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ ์ธํ ์ ์๋คTest case ์์ฑ ์, ์์ฑ์๋ฅผ ํตํด ์์กด์ฑ ์ฃผ์ ์ด ์ฉ์ดํ๋ค
๋จ์
์ด์ฉ ์ ์๋
์ํ ์ฐธ์กฐ
๋ ์์ฑ์ ์ฃผ์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ด๋ ต๋ค์ด ๋ ๋๋จธ์ง ์ฃผ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋๋ก ํ์ง๋ง, ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ๋ ๊ฒ์ด ์ค์ํ๋ค
์์ ์ (setter) ์ฃผ์
setter method์ @Autowired annotation์ ์ ์ธํ์ฌ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ
์ฅ์
์์กด์ฑ์ด
์ ํ์ ์ผ๋ก ํ์
ํ ๊ฒฝ์ฐ์ ์ฌ์ฉ์์ฑ์์ ๋ชจ๋ ์์กด์ฑ์ ๊ธฐ์ ํ๋ฉด ๊ณผ๋ํ๊ฒ ๋ณต์กํด์ง ์ ์๋ ๊ฒ์ ์ ํ์ ์ผ๋ก ๋๋ ์ ์ฃผ์ ํ ์ ์๋ค
์ ์ํ ์
์ฃผ์ ๋ฐ์ ์์กด์ฑ์ ๊ธฐ๋ณธ๊ฐ์ ์ ์ํ ์ ์๋ค๋ฉด, null ๊ฐ์ด ์กด์ฌํ ์ ์๋ค
๋จ์
์์กด์ฑ ์ฃผ์ ๋์ ํ๋์ final๋ก ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ ์ธํ ์ ์๋ค
field ์ฃผ์
โ Deprecated
member field์ @Autowired annotation์ ์ ์ธํ์ฌ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ
์ฅ์
์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ค
๋จ์
์์กด ๊ด๊ณ๊ฐ ๋์ ๋ณด์ด์ง ์์ ์ถ์์ ์ด๊ณ , ์ด๋ก ์ธํด ์์กด์ฑ ๊ด๊ณ๊ฐ ๋ณต์กํด์ง ์ ์๋ค
SRP (Single Responsibility Principle:
๋จ์ผ ์ฑ ์ ์์น
)์ ๋ฐํ๋anti-pattern
Unit test ์ ์์กด์ฑ ์ฃผ์ ์ด ์ฉ์ดํ์ง ์๋ค
์์กด์ฑ ์ฃผ์ ๋์ ํ๋์ final์ ์ ์ธํ ์ ์๋ค
๊ฒฐ๋ก : ์์ฑ์ ์ฃผ์ ๊ณผ setter ์ฃผ์ ์ ์ ์ ํ ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉํ์!
Last updated
Was this helpful?