DI ์‹ฌํ™”

๋ฐ•์šฐํ˜„ (Joshua)ยท2023๋…„ 7์›” 20์ผ
1

๐Ÿ“‹ DI(Dependency Injection)๋ž€?

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

๐Ÿค”์˜๋ฌธ์  1 : ์Šคํ”„๋ง์—์„œ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค??

: ์ผ๋‹จ ๊ฒฐ๋ก ์€ ์•„๋‹ˆ๋‹ค. ์Šคํ”„๋ง์—์„œ๋Š” bean ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ฐ์ฒด์ด๊ฑฐ๋‚˜ ์Šคํ”„๋ง์ด ์Šค์บ”ํ•œ ๊ฐ์ฒด๋“ค๋งŒ ์˜์กด์„ฑ ์ฃผ์ž…์ด ๊ฐ€๋Šฅ ํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ bean ์€ ์Šคํ”„๋ง์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
bean์œผ๋กœ ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋Š”

public class Car1 {
    private BatteryA batteryA = new BatteryA(100, "Energizer"); 
}

์ด๋ ‡๊ฒŒ ๋’ค์— "new ~~" ๋ฅผ ์ž‘์„ฑํ•ด์„œ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ์ƒ์„ฑํ•˜์—ฌ ๊ด€๋ฆฌ๋ฅผ ํ•˜์˜€์ง€๋งŒ,
๋ฐ˜๋ฉด์—, bean์œผ๋กœ ๋“ฑ๋ก๋˜๊ฑฐ๋‚˜ ์Šคํ”„๋ง์ด ์Šค์บ”ํ•œ ๊ฐ์ฒด๋Š”

public class Car1 {
    private BatteryA batteryA;
}

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

๐Ÿค”์˜๋ฌธ์  2 : ์–ธ์ œ bean ๊ฐ์ฒด๋“ค์ด ์ƒ์„ฑ์ด ๋˜์ง€?

: ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ, ์Šคํ”„๋ง์ด bean ๊ฐ์ฒด๋‚˜ ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๊ฐ์ฒด๋“ค์„ ์Šค์บ”ํ•˜์—ฌ์„œ ์ƒ์„ฑํ•œ๋‹ค. ์กฐ๊ธˆ ๋” ๊นŠ๊ฒŒ ํŒŒ๊ณ  ๋“ค๋ฉด Bean Application Context๊ฐ€ ์‹œ์ž‘ ๋ ๋•Œ ์ด๋‹ค. Application Context๊ด€๋ จํ•ด์„œ๋Š” ๋‚˜์ค‘์— ์กฐ๊ธˆ ๋” ๊นŠ๊ฒŒ ํŒŒ๋ณด์ž. ์ผ๋‹จ์€ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋˜๊ฒ ๋‹ค.
๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ์Šคํ”„๋ง์€ bean ๊ฐ์ฒด๋“ค์„ ์ฃผ์ž…ํ•ด์ค„๊นŒ?

๐Ÿค”์˜๋ฌธ์  3 : ์–ด๋””์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด์ง€?

: ์Šคํ”„๋ง์—๋Š” bean ๊ฐ์ฒด๋“ค์ด ๋‹ด๊ฒจ์ ธ ์žˆ๋Š” IoC(Inversion of Control) ์ปจํ…Œ์ด๋„ˆ๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. ์ƒ์„ฑ๋œ bean ๊ฐ์ฒด๋“ค์„ ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ ๋‹ด๊ฒจ์ ธ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ ํ›„, ์—ฌ๊ธฐ์— ์žˆ๋Š” bean ๊ฐ์ฒด๋“ค์„ ํ•„์š”ํ•œ ๊ฐ์ฒด๋“ค์— ์ฃผ์ž…์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ ๋งˆ์ง€๋ง‰ ์˜๋ฌธ์ ์€ ์–ด๋–ป๊ฒŒ bean ๊ฐ์ฒด๋“ค์„ ์ฃผ์ž…์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿค”์˜๋ฌธ์  4 : ์–ด๋–ป๊ฒŒ bean ๊ฐ์ฒด๋“ค์„ ์ฃผ์ž…์„ ํ•ด์ฃผ์ง€?

: ์ด์ œ ์—ฌ๊ธฐ์„œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ DI ๋ผ๋Š” ๊ฐœ๋…์ด ๋‚˜์˜จ๋‹ค.
์Šคํ”„๋ง์—์„œ DI๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ƒ์„ฑ์ž ์ฃผ์ž…, setter/์ˆ˜์ •์ž ์ฃผ์ž…, ๊ทธ๋ฆฌ๊ณ  ํ•„๋“œ ์ฃผ์ž…์ด ์žˆ๋‹ค.

๐Ÿ“3๊ฐ€์ง€ DI ๋ฐฉ๋ฒ•

  1. ์ƒ์„ฑ์ž ์ฃผ์ž… (Constructor Injection)
    = ํ•ด๋‹น ๊ฐ์ฒด์— ์ฃผ์ž…๋˜์–ด์•ผ ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ํ•ด๋‹น ๊ฐ์ฒด ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ •ํ•ด๋‘”๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ์Šคํ”„๋ง์ด ํ•ด๋‹น ๊ฐ์ฒด ์ƒ์„ฑ์ž์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ™•์ธํ•ด์„œ ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ์— bean ๊ฐ์ฒด๋ฅผ ํ™•์ธํ•˜๊ณ  ์ฃผ์ž…ํ•ด์ค€๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ์จ ์ฃผ์ž…๋ฐ›์€ ๊ฐ์ฒด๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ๋ฐ˜๋“œ์‹œ ๊ฐ์ฒด์˜ ์ฃผ์ž…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ Spring ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์ ๊ทน ์ง€์›ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ์„ฑ์ž๊ฐ€ 1๊ฐœ๋งŒ ์žˆ์„ ๊ฒฝ์šฐ์— @Autowired๋ฅผ ์ƒ๋žตํ•ด๋„ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํŽธ์˜์„ฑ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์Šคํ”„๋ง ๊ณต์‹๋ฌธ์„œ๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž… ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.
public class Car1 {
    private BatteryA batteryA;
    @Autowired  //์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜ ์ผ๋•Œ๋Š” ์ƒ๋žต ๊ฐ€๋Šฅ
    public Car1(BatteryA batteryA) {
        this.batteryA = batteryA;
    }
}
  1. ์ˆ˜์ •์ž ์ฃผ์ž…(Setter ์ฃผ์ž…, Setter Injection)
    = ํ•ด๋‹น ๊ฐ์ฒด์— ์„ ํƒ์ ์œผ๋กœ ์ฃผ์ž…๋˜๋Š” ๊ฐ์ฒด๋ฅผ setter ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ •ํ•ด๋‘”๋‹ค. ๊ทธ ํ›„, ์ƒํ™ฉ์— ๋งž๊ฒŒ setter ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์Šคํ”„๋ง์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ™•์ธํ•ด์„œ ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ์— bean ๊ฐ์ฒด๋ฅผ ํ™•์ธํ•˜๊ณ  ์ฃผ์ž…ํ•ด์ค€๋‹ค. Setter ์ฃผ์ž…์€ ์ƒ์„ฑ์ž ์ฃผ์ž…๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ฃผ์ž…๋ฐ›๋Š” ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.
public class Car1 {
    private BatteryA batteryA;
    @Autowired //์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค. 
    public void setBatteryA(BatteryA batteryA) {
        this.batteryA = batteryA;
    }
}
  1. ํ•„๋“œ ์ฃผ์ž…(Field Injection)
    = ํ•ด๋‹น ๊ฐ์ฒด์— ์ฃผ์ž…๋˜์–ด์•ผํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์„ ์–ธ ํ•œํ›„ @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค. ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ์Šคํ”„๋ง์ด @Autowired ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํ•„๋“œ๋ฅผ ํ™•์ธ ํ•œ ํ›„ ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ์— bean ๊ฐ์ฒด๋ฅผ ํ™•์ธํ•˜๊ณ  ์ฃผ์ž…ํ•ด์ค€๋‹ค. ์ด ์ฃผ์ž…์€ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ ธ์„œ ๊ณผ๊ฑฐ์— ์ƒ๋‹นํžˆ ๋งŽ์ด ์ด์šฉ๋˜์—ˆ๋˜ ์ฃผ์ž… ๋ฐฉ๋ฒ•์ด๋‹ค. ํ•˜์ง€๋งŒ ํ•„๋“œ ์ฃผ์ž…์€ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•˜๋Š”๋ฐ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ค‘์š”์„ฑ์ด ๋ถ€๊ฐ๋จ์— ๋”ฐ๋ผ ํ•„๋“œ์˜ ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋Š” ํ•„๋“œ ์ฃผ์ž…์€ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ๋‹ค. ๋˜ํ•œ ํ•„๋“œ ์ฃผ์ž…์€ ๋ฐ˜๋“œ์‹œ DI ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค.
public class Car1 {
    @Autowired
    private BatteryA batteryA;
}

๐Ÿ“์ƒ์„ฑ์ž ์ฃผ์ž… ์‚ฌ์šฉ ๊ถŒ์žฅ ์ด์œ 

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ์Šคํ”„๋ง ๊ณต์‹ ๋ฌธ์„œ๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž… ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ๋Š” ์ด๋ ‡๊ฒŒ ์ž‘์„ฑ ๋˜์–ด์žˆ๋‹ค

"Spring ํŒ€์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ํ•„์š”ํ•œ ์˜์กด ๊ฐ์ฒด๊ฐ€ null์ด ์•„๋‹˜์„ ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ƒ์„ฑ์ž๊ฐ€ ์ฃผ์ž…ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ํ•ญ์ƒ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™”๋œ ์ƒํƒœ์—์„œ ํด๋ผ์ด์–ธํŠธ(ํ˜ธ์ถœ) ์ฝ”๋“œ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค."

  • ์ƒ์„ฑ ๋ ๋•Œ ์ฃผ์ž…์ด ๋œ๋‹ค.
    ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ ๋  ๋•Œ ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ๊ฐ์ฒด๋“ค์ด ์ฃผ์ž…๋œ๋‹ค. ์ด๋Š” ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ์ฃผ์ž…๋˜์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  100% ํ™•์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ์ฃผ์ž…๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋งค์šฐ ์œ ์šฉํ•˜๋ฏ€๋กœ ์ฝ”๋“œ ๋ณต์žก์„ฑ์„ ๋‹จ์ˆœํ™”ํ•œ๋‹ค.
public class Car1 {
    private BatteryA batteryA;
    private BatteryB batteryB;
    public Car1(BatteryA batteryA, BatteryB batteryB) {
        this.batteryA = batteryA;
        this.batteryB = batteryB;
    }
}

์œ„์˜ ์ฝ”๋“œ์—์„œ batteryA๋Š” bean ๊ฐ์ฒด์ด๊ณ  batteryB๋Š” bean ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ด๋•Œ, Car1 ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ ค ํ• ๋•Œ, ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค. ์ด๋Š”, ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ์ด ๋ ๋•Œ ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ์ฒด๋“ค์ด ์ฃผ์ž…์ด ๋˜๋Š”๋ฐ batteryB๋Š” bean ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ์—๋Ÿฌ์ด๋‹ค.

  • ์ฝ”๋“œ ๋ƒ„์ƒˆ ์‹๋ณ„
    ์ฃผ์ž… ๋˜์–ด์•ผํ•˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋“ค์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋กœ ์ธํ•ด, ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋งŽ์€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์—๊ฒŒ ์˜์กด ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์˜์กด ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋งŽ๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋งŽ์€ ์ฑ…์ž„๊ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋œปํ•˜๋ฉด์„œ ์ด๋Š” ๋‚˜์œ ์ฝ”๋“œ ๋ƒ„์ƒˆ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
public class Car1 {
    private BatteryA batteryA;
    private BatteryB batteryB;
    private Window window;
    private Tire tire;
    private Wheel wheel;
    private Engine engine;
    public Car1(BatteryA batteryA, BatteryB batteryB, 
                Window window, Tire tire, Wheel wheel, Engine engine) {
        this.batteryA = batteryA;
        this.batteryB = batteryB;
        this.window = window;
        this.tire = tire;
        this.wheel = wheel;
        this.engine = engine;
    }
}

์œ„์˜ ์ฝ”๋“œ ์ฒ˜๋Ÿผ ์ƒ์„ฑ์ž์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฐ์ฒด๋“ค์ด ์ฃผ์ž…์ด ๋˜์–ด์ ธ์•ผํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์šฉ์ด
    ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ํ•„์š”ํ•œ ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑ์ž์— ๋ช…์‹œํ•˜์—ฌ์„œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ ํ•„์š”ํ•œ ์˜์กด ๊ฐ์ฒด๋“ค์„ Mockito๋ฅผ ์‚ฌ์šฉํ•ด ์‰ฝ๊ฒŒ ๋ชจ์˜ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ์ด๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ์ œ์–ด ๋ฐ ๊ฒฉ๋ฆฌ๋ฅผ ๊ฐœ์„ ํ•ด์ค€๋‹ค.
public class Car1 {
    private BatteryA batteryA;
    public Car1(BatteryA batteryA) {
        this.batteryA = batteryA;
    }
    public String CarHasBattery(){
        return "BROOM BROOM";
    }
}

์˜ˆ๋ฅผ ๋“ค์–ด ์œ„๊ฐ€ Car1์— ๋Œ€ํ•œ ์ฝ”๋“œ์ด๋ฉด,

class Car1Test {
    @Mock
    BatteryA batteryA;
    @Test
    void CarTest(){
        Car1 car1 = new Car1(batteryA);
        assertEquals("BROOM BROOM", car1.CarHasBattery()); //Success
    }
}

์œ„์— ์ฒ˜๋Ÿผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…๋˜์–ด์•ผํ•˜๋Š” ๊ฐ์ฒด๋ฅผ Mock์œผ๋กœ ์‰ฝ๊ฒŒ ์ƒ์„ฑ ํ›„ ์ž‘์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ถˆ๋ณ€์„ฑ
    ์ƒ์„ฑ์ž ์ฃผ์ž…์œผ๋กœ ์ฃผ์ž…๋ฐ›์€ ๊ฐ์ฒด๊ฐ€ ๋ถˆ๋ณ€ํ•˜๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด๋Š”, NullPointerException์„ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๋‚ด๋ถ€ ์ƒํƒœ ๋ณ€ํ™”๋กœ ์ธํ•œ ๋ฒ„๊ทธ์— ๋œ ์ทจ์•ฝํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
profile
๋งค์ผ ๋งค์ผ ์„ฑ์žฅํ•˜์ž

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 7์›” 20์ผ

๊ฐ€์น˜ ์žˆ๋Š” ์ •๋ณด ๊ณต์œ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ