๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ ๊ณต๋ถ€

Spring DI

by syLim___ 2023. 8. 17.
728x90

 

โœ…  DI ํ•„์š”์„ฑ

 

์šฐ์„  "์˜์กด์„ฑ(Dependency)"์˜ ์˜๋ฏธ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณด์ž๋ฉด,

 

ํด๋ž˜์Šค ๊ฐ„ ์˜์กด์„ฑ์ด ์žˆ๋‹ค

 = ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค

 = ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค๋„ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค

 = ํ•œ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กญ์ง€ ์•Š๋‹ค

 

์ •๋„๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

 


 

์ข‹์€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™(SOLID) ์ค‘

DIP(Dependency Inversion Principle, ์˜์กด์„ฑ ์—ญ์ „ ์›์น™)๋Š” ๋ฐ”๋กœ ์ด ์˜์กด์„ฑ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•œ๋‹ค.

 

 - ๊ตฌ์ฒด์— ์˜์กดํ•œ ๊ฒฝ์šฐ: ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด, ์ด๊ฒƒ์„ ๊ตฌ์ฒดํ™”ํ•œ ๊ตฌํ˜„์ฒด๋“ค๋„ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

 - ์ถ”์ƒ์— ์˜์กดํ•œ ๊ฒฝ์šฐ: ๊ทธ๋Ÿฌ๋‚˜ ๊ตฌํ˜„์ฒด์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋”๋ผ๋„, ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ณ€๊ฒฝ๋  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

๋”ฐ๋ผ์„œ ๊ตฌ์ฒด๊ฐ€ ์•„๋‹Œ ์ถ”์ƒ์— ์˜์กดํ•ด์•ผ, ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ์„ฑ์ด ์ข‹์€ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฆ‰ DIP๋ฅผ ๋”ฐ๋ฅด๋ ค๋ฉด ๊ตฌ์ฒด์  ์š”์†Œ์— ๋Œ€ํ•œ ์˜์กด์€ ํ”ผํ•˜๊ณ , ์ถ”์ƒํ™”(์ธํ„ฐํŽ˜์ด์Šค)์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.

 

 

์˜์กด๊ด€๊ณ„ ์—ญ์ „์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ์˜์กด์„ฑ ์ฃผ์ž…(DI, Dependency Injectcion)๊ฐ€ ์žˆ๋‹ค.

 


 

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

์ด๋Ÿฌํ•œ ์˜์กด์„ฑ์„ "์™ธ๋ถ€"์—์„œ ์ฃผ์ž…์‹œ์ผœ ์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 

์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…์‹œ์ผœ์ฃผ๋ฉด,

๊ฐ ํด๋ž˜์Šค๋Š” ์ž์‹ ์˜ ๊ธฐ๋Šฅ๋งŒ์„ ์‹คํ–‰ํ•˜๊ณ , ์ž์‹ ๊ณผ ๋‹ค๋ฅธ ํด๋ž˜์Šค์™€์˜ ์˜์กด์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ๋”์ด์ƒ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

๋‹ค์‹œ ๋งํ•ด, ์˜์กด์„ฑ์ด ์žˆ๋Š” ํด๋ž˜์Šค๋ผ๋ฆฌ๋Š” ์„œ๋กœ์˜ ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กœ์›Œ์ง€๊ฒŒ ๋œ๋‹ค.

 

 

โœ… Spring DI

 

0๏ธโƒฃ DI ์—†์ด ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ

@Controller
public class ProductController {

    ProductService productService = new ProductService();
    
}

 

 - ProductController๊ฐ€ ProductService๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ , ์˜์กด์„ฑ๋„ ์ง์ ‘ ์ฃผ์ž…ํ•œ๋‹ค.

 - ๋งŒ์•ฝ ProductService์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด, ProductController์˜ ์ฝ”๋“œ๊นŒ์ง€ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 - ๋‘ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์„œ, ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์€ ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

 


 

์šฐ๋ฆฌ๋Š” ํด๋ž˜์Šค ๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ๊ณ , ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์ด ๋†’์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ ํด๋ž˜์Šค ๊ฐ„ ์˜์กด๋„๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•ด์ฃผ๋„๋ก, DI๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

 

์šฐ๋ฆฌ๋Š” @Autowired ๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ, ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—๊ฒŒ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 - ์ด๋•Œ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›๋Š” ๊ฐ์ฒด๋Š” ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

Spring DI ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์—๋Š” ํฌ๊ฒŒ ํ•„๋“œ ์ฃผ์ž…, Setter ์ฃผ์ž…, ์ƒ์„ฑ์ž ์ฃผ์ž… ์ด ์žˆ๋‹ค.

 


 

1๏ธโƒฃ ํ•„๋“œ ์ฃผ์ž… (Field Injection)

 

@Controller
public class ProductController {

    @Autowired
    private ProductService productService;

}

 - ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฃผ์ž…๋ฐ›๊ณ ์ž ํ•˜๋Š” ํ•„๋“œ ์„ ์–ธ๋ถ€์— @Autowired ์–ด๋…ธํ…Œ์ด์…˜๋งŒ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

 

 - ์˜์กด์„ฑ์ด ์™ธ๋ถ€์—์„œ ์–ด๋–ป๊ฒŒ ์ฃผ์ž…๋˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

    ์œ„ ์ฝ”๋“œ๋งŒ ๋ณด๊ณ ๋Š” ProductService๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ๋˜๊ณ , ์ฃผ์ž…๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.

    ์ด๋กœ ์ธํ•ด ์ฝ”๋“œ์˜ ํ™•์žฅ์ด๋‚˜ ํ…Œ์ŠคํŠธ, ์œ ์ง€๋ณด์ˆ˜์˜ ์–ด๋ ค์›€์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

   


 

2๏ธโƒฃ Setter ์ฃผ์ž… (Setter Injection)

 

@Controller
public class ProductController {

    private ProductService productService;
    @Autowired
    public void setProductService(ProductService productService){
        this.productService = productService;
    }

}

 - Setter๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ทธ ์œ„์— @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ค€๋‹ค.

 

 - Runtime์— ์˜์กด์„ฑ์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, Runtime์— ์˜์กด์„ฑ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๋‹ค.

 

 - ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ํ•„๋“œ๋Š” final๋กœ ์„ ์–ธํ•  ์ˆ˜ ์—†์–ด์„œ, ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค.

 

 - Setter๋ฅผ ํ†ตํ•ด ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ํ•˜์ง€ ์•Š์•„๋„ ๊ฐ์ฒด ์ƒ์„ฑ์€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

    ๋งŒ์•ฝ ๊ฐ์ฒด ์ƒ์„ฑ๋งŒ ํ•ด๋‘๊ณ  ๊ทธ ๊ตฌํ˜„์ฒด๋ฅผ Setter๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด NullPointerException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 


 

3๏ธโƒฃ ์ƒ์„ฑ์ž ์ฃผ์ž… (Constructor-based DI)

 

@Controller
public class ProductController {

    private final ProductService productService;
    @Autowired
    public ProductController(ProductService productService){
        this.productService = productService;
    }

}

 - constructor๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ทธ ์œ„์— @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ค€๋‹ค.

 

 - ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์ ์— ์Šคํ”„๋ง์ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด์ค€๋‹ค.

 

 - ๊ฐ์ฒด ์˜์กด์„ฑ ์ฃผ์ž…์ด ํ•„์ˆ˜์ธ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, NullPointerException์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 - ๊ฐ์ฒด๋ฅผ final๋กœ ์„ ์–ธํ•˜์—ฌ ๊ฐ์ฒด๊ฐ€ ์ตœ์ดˆ ์ฃผ์ž…๋œ ์ดํ›„ ๋ณ€ํ•˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. (์˜์กด๊ด€๊ณ„ ๋ถˆ๋ณ€์„ฑ O)

 


 

#๏ธโƒฃ ์…‹ ์ค‘ ์–ด๋–ค ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ?

 

 - ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ์‚ฌํ•ญ์ด๋‹ค.

 

 - ์ƒ์„ฑ์ž ์ฃผ์ž…๋งŒ์ด ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 - ์ƒ์„ฑ์ž ์ฃผ์ž…๋งŒ์ด NullPointerException์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 - ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์–ด๋– ํ•œ ์˜์กด์„ฑ์ด ํ•„์š”ํ•œ์ง€ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚œ๋‹ค.

 

 

 - (์ฐธ๊ณ ) ์ƒ์„ฑ์ž ์ฃผ์ž…๋งŒ์˜ ์žฅ์ ์ด์—ˆ๋˜ ๊ฒƒ: ์ˆœํ™˜ ์ฐธ์กฐ ๋ฐฉ์ง€

 

         ์ด์ „๊นŒ์ง€๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…๋งŒ์ด ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ƒ์„ฑ์ž ์ฃผ์ž…๋งŒ์˜ ํฐ ์žฅ์ ์ด์—ˆ๋‹ค.

         ํ•„๋“œ ์ฃผ์ž…๊ณผ setter ์ฃผ์ž…๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ˆœํ™˜ ์ฐธ์กฐ ๋ฐœ์ƒ์‹œ ์—๋Ÿฌ๋ฅผ ๋„์›Œ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

         ๊ทธ๋Ÿฌ๋‚˜ ์Šคํ”„๋ง๋ถ€ํŠธ2.6 ๋ถ€ํ„ฐ๋Š” ์ด ๋ถ€๋ถ„์ด ํŒจ์น˜๋˜์–ด, 3๊ฐ€์ง€ ๋ฐฉ์‹ ๋ชจ๋‘ ์ˆœํ™˜ ์ฐธ์กฐ ๋ฐœ์ƒ ๋ฐฉ์ง€๊ฐ€ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

๋”๋ณด๊ธฐ

 

์ˆœํ™˜ ์ฐธ์กฐ๋ž€ , ๋‘ ํด๋ž˜์Šค๊ฐ€ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด ํด๋ž˜์Šค A๋Š” ํด๋ž˜์Šค B๋ฅผ ์ฐธ์กฐํ•˜๊ณ , ํด๋ž˜์Šค B๋Š” ํด๋ž˜์Šค A๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

ํด๋ž˜์Šค A์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ํด๋ž˜์Šค B์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•˜๊ณ , ํด๋ž˜์Šค B์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ํด๋ž˜์Šค A์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์ด๋‹ค.

 

 


 

โœ…  Reference

 

 

  • ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜ (2019, Rober C. Martin)

 

728x90