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

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[DI] DI ์ปจํ…Œ์ด๋„ˆ์˜ ๋™์ž‘ ์›๋ฆฌ์™€ ์ฃผ์š” ๊ธฐ๋Šฅ

์ถœ์ฒ˜

ChatGPT


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

DI ์ปจํ…Œ์ด๋„ˆ๋ž€?

์ •์˜

DI ์ปจํ…Œ์ด๋„ˆ(Dependency Injection Container)๋Š” ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ์„ ๋ช…์‹œํ•˜๊ณ , DI ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด ์˜์กด์„ฑ์„ ํ•ด์„ํ•˜์—ฌ ์ ์ ˆํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์—ญํ• 

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

 

DI ์ปจํ…Œ์ด๋„ˆ์˜ ๋™์ž‘ ์›๋ฆฌ

DI ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ํ†ตํ•ด ๋™์ž‘ํ•œ๋‹ค.

1. ์„ค์ • ๋ฐ ๊ตฌ์„ฑ

๊ฐœ๋ฐœ์ž๋Š” DI ์ปจํ…Œ์ด๋„ˆ์— ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ์„ค์ •ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์–ด๋–ค ์ธํ„ฐํŽ˜์ด์Šค์— ์–ด๋–ค ๊ตฌํ˜„์ฒด๋ฅผ ์—ฐ๊ฒฐํ• ์ง€, ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐฉ์‹์„ ์ •์˜ํ•œ๋‹ค.

2. ์˜์กด์„ฑ ํ•ด์„

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ํ•ด์„ํ•œ๋‹ค. DI ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž๋‚˜ ์„ค์ •์ž ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์˜์กด์„ฑ์„ ํ•„์š”๋กœ ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•œ๋‹ค.

3. ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์ฃผ์ž…

ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
์ƒ์„ฑ๋œ ๊ฐ์ฒด์— ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค. ์ด๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…, ์„ธํ„ฐ ์ฃผ์ž…, ํ•„๋“œ ์ฃผ์ž… ๋“ฑ์˜ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

4. ์ˆ˜๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ

DI ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ์ฒด์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด, ํŠธ๋žœ์ง€์–ธํŠธ ํŒจํ„ด ๋“ฑ์˜ ๊ฐ์ฒด ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜์—ฌ, ๊ฐ์ฒด๊ฐ€ ์–ธ์ œ ์ƒ์„ฑ๋˜๊ณ  ์†Œ๋ฉธํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

5. ์˜์กด์„ฑ ํ•ด๊ฒฐ ๋ฐ ์ œ๊ณต

์š”์ฒญ์ด ์žˆ์„ ๋•Œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

DI ์ปจํ…Œ์ด๋„ˆ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

1. ๊ฐ์ฒด ๋“ฑ๋ก ๋ฐ ํ•ด์„

  • ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด ๋งคํ•‘: DI ์ปจํ…Œ์ด๋„ˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•  ๋•Œ ์ ์ ˆํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ: ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ ๊ด€๊ณ„๋ฅผ ํ•ด์„ํ•˜์—ฌ ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•œ๋‹ค.

2. ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ

  • ์ˆ˜๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ: ๊ฐ์ฒด์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์„ค์ •ํ•˜์—ฌ, ํŠน์ • ๋ฒ”์œ„(Scope) ๋‚ด์—์„œ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋งค๋ฒˆ ์ƒˆ๋กœ ์ƒ์„ฑํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.
  • ์‹ฑ๊ธ€ํ†ค(Singleton): ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ƒ์„ฑ๋œ๋‹ค.
  • ํŠธ๋žœ์ง€์–ธํŠธ(Transient): ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ์Šค์ฝ”ํ”„(Scope): ํŠน์ • ๋ฒ”์œ„ ๋‚ด์—์„œ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ์š”์ฒญ๋ณ„๋กœ ์Šค์ฝ”ํ”„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ๊ฐ์ฒด ์ฃผ์ž… ๋ฐฉ๋ฒ•

1. ์ƒ์„ฑ์ž ์ฃผ์ž…(Constructor Injection)

์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.

  class Car @Inject constructor(engine: Engine) {
      // ...
  }


2. ์„ธํ„ฐ ์ฃผ์ž…(Setter Injection)

์„ธํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.

  class Car {
      private lateinit var engine: Engine
      
      @Inject
      fun setEngine(engine: Engine) {
          this.engine = engine
      }
  }


3. ํ•„๋“œ ์ฃผ์ž…(Field Injection)

ํ•„๋“œ์— ์ง์ ‘ ์ฃผ์ž…ํ•œ๋‹ค. (๊ถŒ์žฅ๋˜์ง€ ์•Š์Œ)

  class Car {
      @Inject
      lateinit var engine: Engine
  }


4. ์ง€์—ฐ ์ดˆ๊ธฐํ™”(Lazy Initialization)

๊ฐ์ฒด๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•  ๋•Œ๊นŒ์ง€ ์ดˆ๊ธฐํ™”๋ฅผ ์ง€์—ฐ์‹œํ‚จ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.

5. ์กฐ๊ฑด๋ถ€ ๋ฐ”์ธ๋”ฉ ๋ฐ ํ”„๋กœํŒŒ์ผ๋ง

  • ์กฐ๊ฑด๋ถ€ ๋ฐ”์ธ๋”ฉ: ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ”„๋กœํŒŒ์ผ๋ง: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ, ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๋“ฑ ๋‹ค์–‘ํ•œ ํ”„๋กœํŒŒ์ผ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์„ค์ •์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

DI ์ปจํ…Œ์ด๋„ˆ์˜ ์žฅ์ 

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

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ์˜ DI ์ปจํ…Œ์ด๋„ˆ

[๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ] - [Android] DI ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

๊ฒฐ๋ก 

DI ์ปจํ…Œ์ด๋„ˆ๋Š” ํ˜„๋Œ€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์˜์กด์„ฑ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์„ ์ค„์—ฌ์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” Dagger 2, Hilt, Koin, Kodein ๋“ฑ์˜ ๋‹ค์–‘ํ•œ DI ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋”์šฑ ๊ตฌ์กฐ์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DI ์ปจํ…Œ์ด๋„ˆ์˜ ์„ ํƒ์€ ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ๊ฐœ๋ฐœ์ž์˜ ์„ ํ˜ธ๋„์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์„ ๊ณ ๋ คํ•˜์—ฌ ์ ์ ˆํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.