ν™ˆ DI 와 IoC
포슀트
μ·¨μ†Œ

DI 와 IoC

πŸ’» 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도 μ œμ–΄μ˜ 역전을 λ‹¬μ„±ν•˜κΈ° μœ„ν•œ ν•˜λ‚˜μ˜ λ°©λ²•μž…λ‹ˆλ‹€. 객체λ₯Ό μ™ΈλΆ€μ—μ„œ μ£Όμž…ν•¨μœΌλ‘œμ¨ κ³ μˆ˜μ€€μ˜ κ΅¬μ„±μš”μ†Œκ°€ μ£Όμž…λ°›μ€ 객체λ₯Ό μ–΄λ–»κ²Œ μ‚¬μš©ν• μ§€ κ²°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

μ˜€λ²„λΌμ΄λ”©

DDD vs SQL 쀑심 섀계