[Spring] ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection, DI)

๐Ÿ”น ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection, DI)

DI๋ž€ ์™ธ๋ถ€์—์„œ ๋‘ ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ฒฐ์ •ํ•ด ์ฃผ๋Š” ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์ด์— ๋‘์–ด ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ๋Š” ์˜์กด๊ด€๊ณ„๊ฐ€ ๊ณ ์ •๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์‹œ์— ๊ด€๊ณ„๋ฅผ ๋™์ ์œผ๋กœ ์ฃผ์ž…ํ•˜์—ฌ ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•˜๊ณ  ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

์˜์กด์„ฑ์ด๋ž€ ํ•œ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์˜์กด์„ฑ์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

public class Store {
    private Book book;
}

์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์™€ ๊ฐ™์ด Store ๊ฐ์ฒด๊ฐ€ Book ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์— Store ๊ฐ์ฒด๊ฐ€ Book ๊ฐ์ฒด์— ์˜์กด์„ฑ์ด ์žˆ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

Book book = new Book();
Store store = new Store(book);

๊ทธ๋ฆฌ๊ณ  ๋‘ ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๊ฒƒ์„ ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ผ ํ•œ๋‹ค.

 

์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ๋ฒ•์—๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…, ํ•„๋“œ ์ฃผ์ž…, ์ˆ˜์ •์ž(setter) ์ฃผ์ž…, ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ์ฃผ์ž…์ด ์žˆ๋‹ค.

Spring 4๋ถ€ํ„ฐ๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค.

 

[ ์˜์กด์„ฑ ์ฃผ์ž…์ด ํ•„์š”ํ•œ ์ด์œ  ]

์˜ˆ๋ฅผ ๋“ค์–ด, ์ฑ…๊ณผ ์ฑ…์„ ํŒ๋งคํ•˜๋Š” Store ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

public class Store {
    private Book book;
    
    public Store() {
        this.book = new Book();
    }
 }

์œ„์™€ ๊ฐ™์€ ์˜ˆ์‹œ ํด๋ž˜์Šค๋Š” ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

1. ๋‘ ํด๋ž˜์Šค๊ฐ€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค.

์œ„์™€ ๊ฐ™์€ Store ํด๋ž˜์Šค๋Š” ํ˜„์žฌ Book ํด๋ž˜์Šค์™€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค๋Š” ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋‘ ํด๋ž˜์Šค๊ฐ€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์–ด ๋งŒ์•ฝ Store์—์„œ Book์ด ์•„๋‹Œ Pen๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ƒํ’ˆ์„ ํŒ๋งคํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด Store ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค. ์ฆ‰, ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค. ๊ฐ๊ฐ์˜ ๋‹ค๋ฅธ ์ƒํ’ˆ๋“ค์„ ํŒ๋งคํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ์ž๋งŒ ๋‹ค๋ฅด๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ค‘๋ณต๋˜๋Š” Store ํด๋ž˜์Šค๋“ค์ด ํŒŒ์ƒ๋˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ๋ชปํ•œ๋‹ค. ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ์ƒ์†์„ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒ์†์€ ์ œ์•ฝ์ด ๋งŽ๊ณ  ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ง€๋ฏ€๋กœ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

2. ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ๋งบ์–ด์ ธ ์žˆ๋‹ค.

์œ„์˜ Store์™€ Book์€ ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ๋งบ์–ด์ ธ ์žˆ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ๊ฐ์ฒด์ง€ํ–ฅ์  ์„ค๊ณ„๋ผ๋ฉด ๊ฐ์ฒด๋“ค ๊ฐ„์— ๊ด€๊ณ„๊ฐ€ ๋งบ์–ด์ ธ์•ผ ํ•œ๋‹ค. ๊ฐ์ฒด๋“ค ๊ฐ„์— ๊ด€๊ณ„๊ฐ€ ๋งบ์–ด์กŒ๋‹ค๋ฉด ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•˜๋”๋ผ๋„ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฒฐ๊ตญ ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ์ด์œ ๋Š” Store์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์–ด๋–ค ์ œํ’ˆ์„ ํŒ๋งคํ• ์ง€์— ๋Œ€ํ•œ ๊ด€์‹ฌ์ด ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

Spring์—์„œ๋Š” DI๋ฅผ ์ ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜์˜€๋‹ค.

 

[ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ ]

์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„  ๋‹คํ˜•์„ฑ์ด ํ•„์š”ํ•˜๋‹ค.

Book, Pen ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ œํ’ˆ์„ ํ•˜๋‚˜๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Product๋ผ๋Š” Interface๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

์šฐ์„  Book์—์„œ Product ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜์ž.

public interface Product {

}

public class Book implements Product {

}

์ด์ œ Store์™€ Book์ด ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค.

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

public class Store {
    private Product product;
    
    public Store(Product product) {
        this.product = product;
    }
}

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์šฐ๋ฆฌ๋Š” ์Šคํ”„๋ง์ด๋ผ๋Š” DI ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Store์—์„œ Product ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ์ ์— ํ•„์š”ํ•œ ๊ฐ์ฒด(Bean)๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฉฐ, ์˜์กด์„ฑ์ด ์žˆ๋Š” ๋‘ ๊ฐ์ฒด๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ฃผ์ž…์‹œ์ผœ์•ผ ํ•œ๋‹ค.

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด Book์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ๊ฐ์ฒด๋ฅผ Store๋กœ ์ฃผ์ž…์‹œ์ผœ ์ฃผ๋Š” ์—ญํ• ์„ ์œ„ํ•ด DI ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ด๋‹ค.

public class BeanFactory {
    public void Store() {
        // Bean ์ƒ์„ฑ
        Product book = new Book();
        
        // ์˜์กด์„ฑ ์ฃผ์ž…
        Store store = new Store(book);
    }
}

์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์€ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›์„ ํ•ด์ค€๋‹ค.

์Šคํ”„๋ง์€ ํŠน์ • ์œ„์น˜๋ถ€ํ„ฐ ํด๋ž˜์Šค๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ , ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ์ฒด๋“ค์˜ ๊ด€๊ณ„๊นŒ์ง€ ์„ค์ •ํ•ด ์ค€๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์Šคํ”„๋ง์€ DI ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๊ฐœ๋…์€ ์ œ์–ด์˜ ์—ญ์ „(Inversion of Control, IoC)๋ผ๊ณ  ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•œ๋‹ค. ์–ด๋– ํ•œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ• ์ง€์— ๋Œ€ํ•œ ์ฑ…์ž„์€ ํ”„๋ ˆ์ž„์›Œํฌ์—๊ฒŒ ๋„˜์–ด๊ฐ”๊ณ , ์ž์‹ ์€ ์ˆ˜๋™์ ์œผ๋กœ ์ฃผ์ž…๋ฐ›๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection, DI)์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ๋‘ ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ
  • ๋‘ ๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค.
  • ๊ฐ์ฒด์˜ ์œ ์—ฐ์„ฑ์„ ๋†’์ธ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•œ๋‹ค.

ํ•œ ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด(๊ตฌ์ฒด ํด๋ž˜์Šค)์— ์˜์กดํ•  ๊ฒƒ์ธ์ง€๋Š” ๋ณ„๋„์˜ ๊ด€์‹ฌ์‚ฌ์ด๋‹ค.

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

๋‹จ, ํ•œ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์œผ๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ DI ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค.



 

 

 

๐Ÿ“ƒ reference