π» DI (Dependency Injection)μ΄λ?
Dependency Injection
μ μ΄ν΄λ³΄κΈ° μ μ μμ‘΄μ±μ΄ 무μμΈμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
μμ‘΄μ±μ κ°μ²΄λ€κ°μ λ§Ίμ μ μλ κ΄κ³μ€ νλλ‘, ν ν΄λμ€μ μ μλ₯Ό μΌλΆ λ³κ²½νμ λ λ€λ₯Έ ν΄λμ€κ° λ³κ²½λλ κ²½μ° λ ν΄λμ€λ μμ‘΄κ΄κ³μ μλ€κ³ ν μ μμ΅λλ€. μμ‘΄ κ΄κ³λ λ³΄ν΅ κ΅¬μ ν΄λμ€(concrete class
)μ μ΄λ¦μ μ¬μ©ν κ²½μ°(μμ±μ νΈμΆμ ν΅ν μΈμ€ν΄μ€ μμ±, λ©μλ μκ·Έλμ² μ ν μ§μ )μ μκΉλλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Cat {
public int energy;
public Cat() {
this.energy = 0;
}
public void eat() {
Sausage s = new Sausage();
this.energy += s.getNutrition();
}
}
class Sausage {
public int getNutrition() {
return 10;
}
}
class Main {
public static void main(String[] args) {
Cat cat = new Cat();
cat.eat();
}
}
μ μμμμ Cat
ν΄λμ€μ eat
ν¨μλ μΈμλ‘ κ΅¬μ ν΄λμ€ Sausage
νμ
μ μΈμ€ν΄μ€λ₯Ό λ°κ³ μμ΅λλ€. λ°λΌμ Cat
ν΄λμ€λ Sausage
ν΄λμ€μ λν μμ‘΄μ±μ΄ μκ²Όμ΅λλ€. μ΄ μν©μμ Cat
μ΄ μμΈμ§μΈμ λ€λ₯Έ μμμ λ¨Ήλλ€κ±°λ, Sausage
λ΄λΆμ ν¨μμ λ³κ²½μ΄ λ°μνλ κ²½μ° μ μ°νκ² λμ²ν μκ° μμ΅λλ€.
μ΄λ° μν©μ ν΄κ²°νκΈ° μν΄ μμ‘΄μ± μ£Όμ
(Dependency Injection)
μ μ¬μ©ν©λλ€. μμ‘΄μ± μ£Όμ
μ νλμ ν΄λμ€κ° ꡬμ ν΄λμ€λ₯Ό μ§μ μ¬μ©νλ κ²μ΄ μλλΌ, μΈν°νμ΄μ€λ μΆμ ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘ ꡬνλ ꡬμ ν΄λμ€λ₯Ό μΈλΆλ‘λΆν° μ£Όμ
λ°μ μ¬μ©νλ κ²μ λ§ν©λλ€. μλλ μμ μμλ₯Ό μμ‘΄μ± μ£Όμ
μ ν΅ν΄ 리ν©ν λ§ν μ½λμ
λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Cat {
public int energy;
public Cat() {
this.energy = 0;
}
public void eat(Food f) {
this.energy += f.getNutrition();
}
}
interface Food {
int getNutrition();
}
class Sausage implements Food {
public int getNutrition() {
return 10;
}
}
class Main {
public static void main(String[] args) {
Cat cat = new Cat();
Food f = new Sausage();
cat.eat(f);
}
}
eat
ν¨μ λ΄λΆμμ ꡬμ ν΄λμ€ Sausage
μ μΈμ€ν΄μ€λ₯Ό μ§μ μμ±νμ§ μκ³ , ν¨μμ μΈμλ‘ Main
ν΄λμ€μμ μ£Όμ
λ°μμμ λ³Ό μ μμ΅λλ€. λν ν¨μ μΈμ νμ
μΌλ‘ μΈν°νμ΄μ€(μΆμ ν΄λμ€) Food
λ₯Ό μ°Έμ‘°νκ³ μμ΄, ν΄λΉ μΈν°νμ΄μ€λ₯Ό ꡬννλ ν΄λμ€λ λͺ¨λ eat
ν¨μμ μΈμλ‘ λ겨 μ€ μ μμ΅λλ€.
π» IoC (Inversion of Control) μ΄λ?
μ μ΄μ μμ (IoC
)μ μ μμ€μ κ΅¬μ± μμκ° μ»΄ν¨ν
μ΄μ
μ μ°Έμ¬ν μ μμ§λ§ μΈμ μ΄λ»κ² κ·Έ κ΅¬μ± μμλ₯Ό μ¬μ©ν μ§λ κ³ μμ€ κ΅¬μ± μμκ° κ²°μ νκ²λ νλκ²μ λ§ν©λλ€.
μλμ μμλ₯Ό ν΅ν΄ μμλ³΄κ² μ΅λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
abstract class CaffeineBeverage {
void prepareRespect() {
boilWater();
pourInCup();
brew();
addCondiments();
}
void boilWater() {
System.out.println("λ¬Όμ λμ΄λ μ€");
}
void pourInCup() {
System.out.println("μ»΅μ λ°λ₯΄λ μ€");
}
void brew();
void addCondiments();
}
class Coffee extends CaffeineBeverage {
void brew() {
System.out.println("νν°λ‘ 컀νΌλ₯Ό μ°λ €λ΄λ μ€");
}
void addCondiments() {
System.out.println("μ°μ μ μ€νμ μΆκ°νλ μ€");
}
}
class Tea extends CaffeineBeverage {
void brew() {
System.out.println("μ°» μμ μ°λ €λ΄λ μ€");
}
void addCondiments() {
System.out.println("λ λͺ¬μ μΆκ°νλ μ€");
}
}
μ μμμμ κ³ μμ€μ ꡬμ±μμλ CaffeineBeverage
μ΄κ³ , μ μμ€μ ꡬμ±μμλ Coffee
μ Tea
μ
λλ€. κ³ μμ€μ ꡬμ±μμμΈ CaffeineBeverage
λ νμν μν©μμλ§ μ μμ€μ ꡬμ±μμμΈ Coffee
μ Tea
μ λ©μλλ₯Ό νΈμΆνκ³ μμΌλ©°, μ μμ€μ ꡬμ±μμλ λ¨μ§ μ»΄ν¨ν
μ΄μ
μ νμν λ‘μ§λ§ ꡬννκ³ μμμ μ μ μμ΅λλ€.
μ μ΄μ μμ μ ν 리μ°λ μμΉμΌλ‘ λΆλ¦¬κΈ°λ νλλ° κ·Έ μ΄μ λ ν 리μ°λ μμΉμ μ€λͺ ν κΈμ 보면 μ μ μμ΅λλ€.
λ¨Όμ μ°λ½νμ§ λ§μΈμ. μ ν¬κ° μ°λ½ λλ¦¬κ² μ΅λλ€.
μ΄ κΈμ μμ μ΄ν΄λ³Έ μμμ λμ ν΄λ³΄λ©΄, κ³ μμ€μ ꡬμ±μμκ° μ μμ€μ ꡬμ±μμμκ² βλ¨Όμ μ°λ½νμ§ λ§μΈμ. μ ν¬κ° μ°λ½ λλ¦¬κ² μ΅λλ€.β λΌκ³ μ΄μΌκΈ°νλ κ²κ³Ό λμΌνλ€λκ²μ μ μ μμ΅λλ€.
π DIλ μ μ΄μ μμ μ λ¬μ±νκΈ° μν νλμ λ°©λ²μ λλ€. κ°μ²΄λ₯Ό μΈλΆμμ μ£Όμ ν¨μΌλ‘μ¨ κ³ μμ€μ ꡬμ±μμκ° μ£Όμ λ°μ κ°μ²΄λ₯Ό μ΄λ»κ² μ¬μ©ν μ§ κ²°μ ν μ μμ΅λλ€.