DI(Dependency Injection)
Mention : Dependency Injection?๐ ์์กด์ฑ ์ฃผ์ ์ด๋?
์์กด ๊ด๊ณ ์ฃผ์ (Dependency Injection)
โA๊ฐ B๋ฅผ ์์กดํ๋ค.โ
์์กด๋์ B๊ฐ ๋ณํ๋ฉด, ๊ทธ๊ฒ์ด A์ ์ํฅ์ ๋ฏธ์น๋ค. -ํ ๋น์ ์คํ๋ง-
- ๋ค์์ ์์๋ฅผ ๋ณด์
class Pizza {
private PizzaRecipe pizzaRecipe;
public Pizza() {
PizzaRecipe = new PizzaRecipe();
}
}
- ํผ์๋ ํผ์ ๋ ์ํผ์ ์์กดํ๋ค.
- ํผ์ ๋ ์ํผ๊ฐ ๋ณํํ๊ฒ ๋๋ฉด, ๋ณํ๋ ๋ ์ํผ์ ๋ฐ๋ผ ํผ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์์ ํด์ผ ํ๋ค. ์ด๋ ๋ ์ํผ์ ๋ณํ๊ฐ ํผ์์ ์ํฅ์ ๋ฏธ์ณค๊ธฐ ๋๋ฌธ์, โํผ์๋ ํผ์ ๋ ์ํผ์ ์์กดํ๋คโ ๋ผ๊ณ ๋งํ ์ ์๋ค.
์์กด๊ด๊ณ๋ฅผ ์ธํฐํ์ด์ค๋ก ์ถ์ํํ๊ธฐ
-
๋ ๋ค์ํ PizzaRecipe๋ฅผ ์์กด ๋ฐ์ ์ ์๊ฒ ๊ตฌํํ๋ ค๋ฉด ์ธํฐํ์ด์ค๋ก ์ถ์ํํด์ผ ํ๋ค.
class Pizza { private PizzaRecipe pizzaRecipe; public Pizza() { pizzaRecipe = new PeperoniPizzaRecipe(); //pizzaRecipe = new PeperoniPizzaRecipe(); //pizzaRecipe = new CheesePizzaRecipe(); } } interface PizzaRecipe { newPizza(); } } class PeperoniPizzaRecipe implements PizzaRecipe { public Pizza newPizza() { return new PeperoniPizza(); } }
- ์์กด๊ด๊ณ๋ฅผ ์ธํฐํ์ด์ค๋ก ์ถ์ํํ๊ฒ ๋๋ฉด, ๋ ๋ค์ํ ์์กด ๊ด๊ณ๋ฅผ ๋งบ์์๊ฐ ์๊ณ , ์ค์ ๊ตฌํ ํด๋์ค์์ ๊ด๊ณ๊ฐ ๋์จํด์ง๊ณ , ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋ค.
Dependency Injection?
- ์์กด๊ด๊ณ๋ฅผ ์ธ๋ถ์์ ๊ฒฐ์ ํ๊ณ ์ฃผ์ ํ๋ ๊ฒ์ด DI ์ด๋ค.
โํด๋์ค ๋ชจ๋ธ์ด๋ ์ฝ๋์๋ ๋ฐํ์ ์์ ์ ์์กด๊ด๊ณ๊ฐ ๋๋ฌ๋์ง ์๋๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ธํฐํ์ด์ค๋ง ์์กดํ๊ณ ์์ด์ผํ๋ค.โ
โ๋ฐํ์ ์์ ์ ์์กด๊ด๊ณ๋ ์ปจํ ์ด๋๋ ํฉํ ๋ฆฌ ๊ฐ์ ์ 3์ ์กด์ฌ๊ฐ ๊ฒฐ์ ํ๋ค.โ
โ์์กด๊ด๊ณ๋ ์ฌ์ฉํ ์ค๋ธ์ ํธ์ ๋ํ ๋ ํผ๋ฐ์ค๋ฅผ ์ธ๋ถ์์ ์ฃผ์ ํด์ค์ผ๋ก์จ ๋ง๋ค์ด์ง๋ค.โ -ํ ๋น์ ์คํ๋ง-
- DI๋ ์์กด๊ด๊ณ๋ฅผ ์ธ๋ถ์์ ๊ฒฐ์ ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ํด๋์ค ๋ณ์๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ๋ค์ด ๊ณง DI๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ฐํ์ ์์ ์ ์์กด๊ด๊ณ๋ฅผ ์ธ๋ถ์์ ์ฃผ์ ํ์ฌ DI๊ตฌํ์ด ์์ฑ๋๋ค.
- ์์ฑ์๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
```java
class Pizza {
private PizzaRecipe pizzaRecipe;
public Pizza(PizzaRecipe pizzaRecipe) {
this.pizzaRecipe = pizzaRecipe;
}
}
class PizzaShopOwner {
private Pizza pizza = new Pizza(new PeperoniRecipe());
public void changeMenu() {
pizza = new Pizza(new CheesePizzaRecipe());
}
}
```
-
๋ฉ์๋๋ฅผ ์ด์ฉ
class Pizza { private PizzaRecipe pizzaRecipe = new PeperoniRecipe(); public void setPizzaRecipe(PizzaRecipe pizzaRecipe) { this.pizzaRecipe = pizzaRecipe; } } class PizzaShopOwner { private Pizza pizza = new Pizza(); public void changeMenu() { pizza.setPizzaRecipe(new CheesePizzaRecipe()); } }
DI์ ์ฅ์
- ์์กด์ฑ์ด ์ค์ด๋ ๋ค.
- DI๋ก ๊ตฌํํ๊ฒ ๋์์ ๋, ์ฃผ์ ๋ฐ๋ ๋์์ด ๋ณํ๋๋ผ๋ ๊ทธ ๊ตฌํ ์์ฒด๋ฅผ ์์ ํ ์ผ์ด ์๊ฑฐ๋ ์ค์ด๋ค๊ฒ๋จ
- ์ฌ์ฌ์ฉ์ฑ์ด ๋์ ์ฝ๋๊ฐ ๋๋ค.
- ๋ค๋ฅธ ํด๋์ค์์ ์ฌ์ฌ์ฉํ ์๊ฐ ์๋ค.
- ํ
์คํธํ๊ธฐ ์ข์ ์ฝ๋๊ฐ ๋๋ค.
- ๋ถ๋ฆฌํด์ ํ ์คํธ๋ฅผ ์งํํ ์ ใ ์๋ค.
- ๊ฐ๋
์ฑ์ด ๋์์ง๋ค.
- ๊ธฐ๋ฅ๋ค์ ๋ณ๋๋ก ๋ถ๋ฆฌํ๊ฒ ๋์ด ์์ฐ์ค๋ฝ๊ฒ ๊ฐ๋ ์ฑ์ด ๋์์ง๋ค.
- Summary
- DI(Dependency Injection) ๋ ์คํ๋ง์ด ๋ค๋ฅธ ํ๋ ์์ํฌ์ ์ฐจ๋ณํ๋์ด ์ ๊ณตํ๋ ์์กด ๊ด๊ณ ์ฃผ์ ๊ธฐ๋ฅ์ผ๋ก, ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒ ์๋๋ผ ์ธ๋ถ์์ ์์ฑํ ํ ์ฃผ์ ์์ผ์ฃผ๋ ๋ฐฉ์์ด๋ค. DI(์์กด์ฑ ์ฃผ์ )๋ฅผ ํตํด์ ๋ชจ๋ ๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๊ณ ์ ์ฐ์ฑ์ด ๋์์ง๋ค. IoC(Inversion of Control) ๋ โ์ ์ด์ ์ญ์ โ ์ด๋ผ๋ ์๋ฏธ๋ก, ๋ง ๊ทธ๋๋ก ๋ฉ์๋๋ ๊ฐ์ฒด์ ํธ์ถ์์ ์ ๊ฐ๋ฐ์๊ฐ ๊ฒฐ์ ํ๋ ๊ฒ์ด ์๋๋ผ, ์ธ๋ถ์์ ๊ฒฐ์ ๋๋ ๊ฒ์ ์๋ฏธํ๋ค. IoC๋ ์ ์ด์ ์ญ์ ์ด๋ผ๊ณ ๋งํ๋ฉฐ, ๊ฐ๋จํ ๋งํด โ์ ์ด์ ํ๋ฆ์ ๋ฐ๊พผ๋คโ๋ผ๊ณ ํ๋ค. ๊ฐ์ฒด์ ์์กด์ฑ์ ์ญ์ ์์ผ ๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ์ค์ด๊ณ ์ ์ฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ํ์ฌ ๊ฐ๋ ์ฑ ๋ฐ ์ฝ๋ ์ค๋ณต, ์ ์ง ๋ณด์๋ฅผ ํธํ๊ฒ ํ ์ ์๊ฒ ํ๋ค.
Reference ๐
https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/
Leave a comment