๋ฐฑ์—”๋“œ(Back-End) ๊ฐœ๋ฐœ/Spring

[Spring] DI์™€ IOC ๋ž€?

rabo93 2025. 2. 27. 21:10
ํ”ํžˆ๋“ค IoC์™€ DI(Dependency Injection: ์˜์กด์„ฑ ์ฃผ์ž…)์„ ํ—ท๊ฐˆ๋ คํ•˜๊ฑฐ๋‚˜, ๋™์ผ์‹œํ•˜๊ณ ๋Š” ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ์‚ฌ์‹ค IoC์™€ DI๋Š” ๋‹ค๋ฅธ ๊ฐœ๋…์ด๋‹ค. ์ ˆ๋Œ€ IoC == DI๊ฐ€ ์•„๋‹ˆ๋‹ค! (DI โŠ‚ IoC ๋ผ๋ฉด ๋ชฐ๋ผ๋„)
IoC๋Š” ํ”„๋กœ๊ทธ๋žจ ์ œ์–ด๊ถŒ์„ ์—ญ์ „์‹œํ‚ค๋Š” ๊ฐœ๋…์ด๊ณ ,
DI๋Š” ํ•ด๋‹น ๊ฐœ๋…์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋กœ, ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๊ฐ์ฒด์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…์‹œํ‚ค๋Š” ํŒจํ„ด์„ ๋งํ•œ๋‹ค.
IOC (Inversion of Control) : ์ œ์–ด์˜ ์—ญ์ „

 

* ํ• ๋ฆฌ์šฐ๋“œ ์›์น™์˜ "Don't call usd, We'll call you." 

: ๋ฐฐ์šฐ๋“ค(๊ฐ์ฒด)์—๊ฒŒ ์˜ํ™”์‚ฌ์—์„œ "ํ•„์š”ํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋จผ์ € ์—ฐ๋ฝํ• ํ…Œ๋‹ˆ, ๋จผ์ € ์—ฐ๋ฝํ•˜์ง€ ๋งˆ์„ธ์š”"

 

๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ(๊ฐ์ฒด์˜ ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”, ์†Œ๋ฉธ, ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋“ฑ..)๋ฅผ ํด๋ผ์ด์–ธํŠธ ๊ตฌํ˜„ ๊ฐ์ฒด(๊ฐœ๋ฐœ์ž)๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ–ˆ๋‹ค..

๊ทธ๋Ÿฌ๋‚˜, ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด Controller, Service๊ฐ™์€ ๊ฐ์ฒด ๋™์ž‘์„ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„์€ ํ•ด๋„, ํ•ด๋‹น ๊ฐ์ฒด๋“ค์ด ์–ด๋А ์‹œ์ ์— ํ˜ธ์ถœ๋  ์ง€๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ๋‹จ์ง€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์š”๊ตฌํ•˜๋Š”๋Œ€๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด๋“ค์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์ƒ์„ฑํ•˜๊ณ , ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์†Œ๋ฉธ์‹œํ‚จ๋‹ค. => ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด๊ถŒ์ด ์—ญ์ „๋จ!

 

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ด๋ฏธ ๋‚ดํฌ๋œ ๊ฐ์ฒด๋“ค์„ ์ ์žฌ์ ์†Œ์— ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ€์ ธ๋‹ค ์“ธ ๋ฟ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ œ์–ด ํ๋ฆ„์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋‚ด์–ด์ฃผ์ง€ ์•Š๋Š”๋‹ค.

  • ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ 

:  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์— ์ž‘์„ฑํ•œ ๊ฐ์ฒด๋“ค์„ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์— ๊ฐ€์ ธ๋‹ค๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ๋™ํ•˜๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด๊ถŒ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์—ญ์ „๋œ๋‹ค.

ex) ํ…Œ์ŠคํŠธ Junit ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์šฉ ์‹œ

- ๊ฐœ๋ฐœ์ž : ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ์ž‘์„ฑ

- Junit ํ”„๋ ˆ์ž„์›Œํฌ : ๋ฉ”์„œ๋“œ๋“ค์˜ ๋Œ€ํ•œ ์ œ์–ด

=> ๊ฐœ๋ฐœ์ž๋“ค์€ @Test ๋“ฑ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๊ธฐ๋งŒ ํ•˜๋ฉด Junit ํ”„๋ ˆ์ž„ ์›Œํฌ๊ฐ€ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ œ์–ด๊ถŒ์ด Junit์ชฝ์œผ๋กœ ์—ญ์ „๋˜์—ˆ๋‹ค.

 

IOC ์žฅ์ 

  • ํ”„๋กœ๊ทธ๋žจ์˜ ์ง„ํ–‰ ํ๋ฆ„๊ณผ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ตฌํ˜„์ฒด ์‚ฌ์ด์˜ ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๋‹ค.
  • ๊ฐ์ฒด ๊ฐ„ ์˜์กด์„ฑ์ด ๋‚ฎ์•„์ง„๋‹ค.

DI (Dependency Injection) : ์˜์กด์„ฑ ์ฃผ์ž…

 

* ์˜์กด์„ฑ : A๊ฐ€ B์— ์˜์กดํ•œ๋‹ค๋ฉด, B๊ฐ€ ๋ณ€๊ฒฝ ์‹œ์— A์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.

(๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๊ฐ์ฒด๋“ค๋ผ๋ฆฌ ํ˜‘๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฒฐ๊ตญ ์„œ๋กœ์—๊ฒŒ ์˜์กดํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.)

public class A {
    private B b = new B();
	// ์ด A ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€์˜ Bํด๋ž˜์Šค๋ฅผ ์˜์กดํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.
	// ๋งŒ์•ฝ, ์™ธ๋ถ€์˜ Bํด๋ž˜์Šค์—์„œ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๊ฒŒ๋˜๋ฉด Aํด๋ž˜์Šค์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค. 
}

 

public class A {
    private B b; // A๊ฐ€ B์— ์˜์กดํ•œ๋‹ค
    
    public A(B b) { 
        this.b = b;
    }
    // ์ด ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ B๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด A์˜ ๋‚ด์šฉ๋„ ๋ณ€๊ฒฝ๋˜์ง€๋งŒ,
    // ์˜์กด ๋Œ€์ƒ์„ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์™ธ๋ถ€์˜ B๋กœ๋ถ€ํ„ฐ ์ฃผ์ž…๋ฐ›๋Š”๋‹ค.
}

 

 

์˜์กด์„ฑ ์ฃผ์ž…์˜ ์„ธ๊ฐ€์ง€ ์Šคํƒ€์ผ

  • ์ƒ์„ฑ์ž ์ฃผ์ž… (Constructor Injection)  **์Šคํ”„๋ง์—์„œ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹!
public class A {
    private B b;
    
    public A(B b) {
        this.b = b;
    }
}
  • Setter ์ฃผ์ž… (Setter Injection)
public class A {
    private B b;
    
    public void setB(B b) {
        this.b = b;
    }
}
  • ์ธํ„ฐํŽ˜์ด์Šค ์ฃผ์ž… (Interface Injection)
public interface BInjection {
    void inject(B b);
}

public A implements BInjection {
    private B b;
    
    @Override
    public void inject(B b) {
        this.b = b;
    }
}

 

 

DI ์žฅ์ 

  • ์˜์กด์„ฑ์ด ์ค„์–ด๋“ ๋‹ค. (๋ณ€๊ฒฝ์— ๋œ ์ทจ์•ฝํ•ด์ง„๋‹ค.)
  • ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.
  • ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง„๋‹ค.
  • ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง„๋‹ค.