๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
CS

[CS] : DI ์™€ IoC

by ๊ถŒ์Šพํ–„ 2023. 8. 29.

 

DI ์™€ IoC ?

์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, 1. ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ , 2. ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ , 3. ํ™•์žฅ์„ฑ ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š”๋ฐ ๋„์›€์ด ๋˜๋Š” ์›์น™์ด๋‹ค.

 

IoC (Inversion of Control) ?

์ง์—ญํ•˜๋ฉด "์ œ์–ด์˜ ์—ญ์ „" ๊ณผ ๊ฐ™๋‹ค.

  • IoC๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์ปดํฌ๋„ŒํŠธ(ํด๋ž˜์Šค, ๋ชจ๋“ˆ)์˜ ์ œ์–ด๊ถŒ์„ ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ์ปจํ…Œ์ด๋„ˆ์— ๋„˜๊ธฐ๋Š” ๊ฐœ๋…์ด๋‹ค.
    ์ผ๋ฐ˜์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๊ฐ€ ์ œ์–ด ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์™ธ๋ถ€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ์–ดํ๋ฆ„์„ ์ œ์–ดํ•˜๊ฒŒ ๋œ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ œ์–ด์˜ ์—ญ์ „์€ ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ์™€ ์˜์กด์„ฑ ํ•ด๊ฒฐ์„ ์ž๋™ํ™”ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”์–ด ๋” ๋ชจ๋“ˆํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์œ„ ๊ฐœ๋…๋“ค์„ ์˜ˆ๋กœ ๋“ค์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ˆ์‹œ๊ฐ€ ์žˆ๋‹ค.

 

IoC ์˜ˆ์‹œ

ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋œ๋‹ค.

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

 

๋”ฐ๋ผ์„œ, ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฐจ์ด์ ์„ IoC๋ฅผ ํ†ตํ•ด์„œ ์„ค๋ช…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ œ์–ด ํ๋ฆ„์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋‚ด์–ด์ฃผ์ง€ ์•Š๋Š”๋‹ค.
๊ทธ์ € ๋‹จ์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์— ์šฐ๋ฆฌ๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ž‘์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ ์žฌ์ ์†Œ์— ๊ฐ€์ ธ๋‹ค๊ฐ€ ์“ธ ๋ฟ์ด๋‹ค.

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

 

IoC๋ฅผ ๋„์ž…ํ•จ์œผ๋กœ์จ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฒƒ

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

 

DI (Dependency Injection) ?

์ง์—ญํ•˜๋ฉด "์˜์กด์„ฑ ์ฃผ์ž…"

IoC๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด๊ถŒ์„ ์—ญ์ „์‹œํ‚ค๋Š” ๊ฐœ๋…์ด๊ณ , DI๋Š” ํ•ด๋‹น ๊ฐœ๋…์„ ์‹คํ˜„์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” "๋””์ž์ธ ํŒจํ„ด"์ค‘ ํ•˜๋‚˜์ด๋‹ค.

๊ฐ์ฒด์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…์‹œํ‚ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

IoC์™€ DI๋Š” ๋‹ค๋ฅธ๊ฐœ๋…์ด๋‹ค.

IoC์•ˆ์— DI๊ฐ€ ํฌํ•จ๋  ์ˆ˜๋Š” ์žˆ์œผ๋‚˜ ์ ˆ๋Œ€ ๋™์ผ์‹œ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

DI๊ฐ€ ์—†์ด๋„ IoC๋ฅผ ๋งŒ์กฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

์˜์กด์„ฑ ?

public class A {
    private B b = new B();
}

์˜ˆ์‹œ ์ฝ”๋“œ์ด๋‹ค.

์œ„ ์ฝ”๋“œ๋Š” A๊ฐ€ B์— ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ์ฝ”๋“œ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด B๋ผ๋Š” ํด๋ž˜์Šค์— final ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๊ฐ€ ๋œ๋‹ค๋ฉด new B() ๋ถ€๋ถ„์— ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ์ƒ๊ธธ๊ฒƒ์ด๊ณ  ์ด๋Š” B์˜ ๋ณ€ํ™”์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  A๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ B๊ฐ€ ๋ณ€ํ•˜๋ฉด A๋„ ์˜ํ–ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— "A๊ฐ€ B์— ์˜์กดํ•œ๋‹ค" ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

public class A {
    private B b;
    
    public A(B b) {
        this.b = b;
    }
}

์ด ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ A๋Š” B์— ์˜์กด์„ ํ•˜๊ณ ์žˆ๊ณ , B๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ A๋„ ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒˆ์—๋Š” ์˜์กด๋Œ€์ƒ์„ ์ง์ ‘์ƒ์„ฑ(๊ฒฐ์ •) ํ•˜๋Š” ๊ฒƒ์ด์•„๋‹ˆ๋ผ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ฃผ์ž…์„ ๋ฐ›๊ณ ์žˆ๋‹ค.

  • ํด๋ž˜์Šค ๋ชจ๋ธ์ด๋‚˜ ์ฝ”๋“œ์—๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ์ ์˜ ์˜์กด๊ด€๊ณ„๋‚˜ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค.
    ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์˜์กดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๋Ÿฐํƒ€์ž„ ์‹œ์ ์˜ ์˜์กด๊ด€๊ณ„๋Š” ์ปจํ…Œ์ด๋„ˆ๋‚˜ ํŒฉํ† ๋ฆฌ ๊ฐ™์€ ์ œ 3์ž์˜ ์กด์žฌ๊ฐ€ ๊ฒฐ์ •ํ•œ๋‹ค.
  • ์˜์กด๊ด€๊ณ„๋Š” ์‚ฌ์šฉํ•  ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์™ธ๋ถ€์—์„œ ์ œ๊ณต(์ฃผ์ž…) ํ•ด์คŒ์œผ๋กœ์จ ๋งŒ๋“ค์–ด์ง„๋‹ค.

 

DI์˜ ๋ฐฉ๋ฒ• 3๊ฐ€์ง€

1. ์ƒ์„ฑ์ž ์ฃผ์ž…

public class A {
    private B b;
    
    public A(B b) {
        this.b = b;
    }
}

2. ์„ธํ„ฐ ์ฃผ์ž…

public class A {
    private B b;
    
    public void setB(B b) {
        this.b = b;
    }
}

3. ์ธํ„ฐํŽ˜์ด์Šค ์ฃผ์ž…

public interface BInjection {
    void inject(B b);
}

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

 

 

DI์˜ ์žฅ์ 

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