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

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

[Android] DI ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ถœ์ฒ˜

ChatGPT


์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” DI ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

1. Dagger 2 (https://dagger.dev/)

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” DI ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜๋กœ, ๊ตฌ๊ธ€์—์„œ ๊ณต์‹ ์ง€์›ํ•œ๋‹ค. 

ํŠน์ง•

  • ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜์กด์„ฑ ์ฃผ์ž… : Dagger 2๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜์กด์„ฑ์„ ๋ถ„์„ํ•˜๊ณ  ์ฃผ์ž… ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ, ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ค„์–ด๋“ ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ๋งค์šฐ ์œ ๋ฆฌํ•˜๋‹ค.
  • ์•ˆ์ „ํ•œ ํƒ€์ž… : ์˜์กด์„ฑ ์ฃผ์ž… ์‹œ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜์—ฌ, ์ปดํŒŒ์ผ ์‹œ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. 
  • ์Šค์ฝ”ํ”„ ์ง€์› : Singleton๊ณผ ๊ฐ™์€ ์Šค์ฝ”ํ”„๋ฅผ ์ง€์›ํ•˜์—ฌ, ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชจ๋“ˆ๊ณผ ์ปดํฌ๋„ŒํŠธ : Dagger 2๋Š” ๋ชจ๋“ˆ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•œ๋‹ค. ๋ชจ๋“ˆ์€ ์˜์กด์„ฑ์„ ์ œ๊ณตํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ๋Š” ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • ์•ˆ๋“œ๋กœ์ด๋“œ ํ†ตํ•ฉ : Dagger 2๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ์™€ ์ž˜ ํ†ตํ•ฉ๋˜๋ฉฐ, `@ContributesAndroidInjector`์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ฐ„ํŽธํ•˜๊ฒŒ Activity, Fragment, Service ๋“ฑ์— ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์žฅ์ 

  • ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜๋‹ค.
  • ์ปดํŒŒ์ผ ํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ํ†ตํ•ด ์˜ค๋ฅ˜๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฝ”๋“œ ์ƒ์„ฑ ๋ฐฉ์‹์„ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

๋‹จ์ 

  •  ์„ค์ •์ด ๋‹ค์†Œ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ ์ด ์กด์žฌํ•œ๋‹ค.
  •  ์ฝ”๋“œ ์ƒ์„ฑ์œผ๋กœ ์ธํ•œ ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

Java ์˜ˆ

  @Module
  public class NetworkModule {
      @Provides
      public Retrofit provideRetrofit() {
          return new Retrofit.Builder()
                  .baseUrl("https://api.example.com")
                  .build();
      }
  }

  @Component(modules = {NetworkModule.class})
  public interface AppComponent {
      void inject(MainActivity activity);
  }

  public class MainActivity extends AppCompatActivity {
      @Inject
      Retrofit retrofit;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          DaggerAppComponent.create().inject(this);

          // Retrofit ์‚ฌ์šฉ
          retrofit.create(ApiService.class);
      }
  }


2. Hilt (https://developer.android.com/training/dependency-injection/hilt)

Dagger 2์˜ ์˜์กด์„ฑ ์ฃผ์ž… ๊ธฐ๋Šฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์•ˆ๋“œ๋กœ์ด๋“œ์šฉ DI ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ๊ตฌ๊ธ€์—์„œ ์ง€์›ํ•˜๋ฉฐ, ์•ˆ๋“œ๋กœ์ด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Dagger 2๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ณต์žก์„ฑ์„ ์ค„์ด๋Š” ๋ฐ ์ค‘์ ์„ ๋‘๊ณ  ์žˆ๋‹ค.

ํŠน์ง•

  • Dagger 2 ๊ธฐ๋ฐ˜: Hilt๋Š” Dagger 2์˜ ๊ธฐ๋Šฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์— ํŠนํ™”๋œ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ๊ฐ„์†Œํ™”๋œ API : Hilt๋Š” ๊ฐ„๋‹จํ•œ ์• ๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ •์˜ํ•˜๊ณ  ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์–ด, ์„ค์ •์ด ๊ฐ„ํŽธํ•˜๋‹ค.
  • ์ž๋™ ์Šค์ฝ”ํ”„ ๊ด€๋ฆฌ : Activity์™€ Fragment ๊ฐ™์€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์Šค์ฝ”ํ”„๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ๋ชจ๋“ˆ๊ณผ ๋ฐ”์ธ๋”ฉ ๊ด€๋ฆฌ : ๋ชจ๋“ˆ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ, `@Module`๊ณผ `@InstallIn` ์• ๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์•ˆ๋“œ๋กœ์ด๋“œ ํ†ตํ•ฉ : ViewModel, WorkManager, Activity, Fragment, Service ๋“ฑ์— ์‰ฝ๊ฒŒ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์žฅ์ 

  •  Dagger 2์— ๋น„ํ•ด ์„ค์ •์ด ๊ฐ„ํŽธํ•˜๋ฉฐ, ์•ˆ๋“œ๋กœ์ด๋“œ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ๋‹ค.
  • ์•ˆ๋“œ๋กœ์ด๋“œ ๊ตฌ์„ฑ ์š”์†Œ์™€์˜ ํ†ตํ•ฉ์ด ์šฉ์ดํ•˜๋ฉฐ, ์ˆ˜๋™์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • ํ•™์Šต ๊ณก์„ ์ด ๋‚ฎ๊ณ , ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๋‹ค.

๋‹จ์ 

  • Dagger 2๋ณด๋‹ค ๋œ ์œ ์—ฐํ•˜๋ฉฐ, ํŠน์ • ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์ž๋™ ์ƒ์„ฑ๋˜๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ํ†ต์ œ๊ฐ€ ์ œํ•œ์ ์ด๋‹ค.

Kotlin ์˜ˆ

  @HiltAndroidApp
  class MyApplication : Application()

  @AndroidEntryPoint
  class MainActivity : AppCompatActivity() {
      @Inject lateinit var retrofit: Retrofit

      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          setContentView(R.layout.activity_main)

          // Retrofit ์‚ฌ์šฉ
          retrofit.create(ApiService::class.java)
      }
  }

  @Module
  @InstallIn(SingletonComponent::class)
  object NetworkModule {
      @Provides
      fun provideRetrofit(): Retrofit {
          return Retrofit.Builder()
              .baseUrl("https://api.example.com")
              .build()
      }
  }

 

3. Koin (https://insert-koin.io/)

Kotlin์— ํŠนํ™”๋œ ์˜์กด์„ฑ ์ฃผ์ž… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์ธ DSL(Domain Specific Language)์„ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ •์˜ํ•œ๋‹ค. ์ฝ”๋“œ ๊ฐ€๋…์„ฑ๊ณผ ์„ค์ •์˜ ์šฉ์ด์„ฑ์ด ์žฅ์ ์ด๋‹ค.

ํŠน์ง•

  • ์ฝ”ํ‹€๋ฆฐ ์นœํ™”์  : Koin์€ Kotlin DSL์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ์„ ์–ธํ•œ๋‹ค. ์ด๋Š” ์ฝ”ํ‹€๋ฆฐ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ง๊ด€์ ์ด๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ ์ฃผ์ž… : Koin์€ ๋Ÿฐํƒ€์ž„์— ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋ฉฐ, ๋ณต์žกํ•œ ์„ค์ • ์—†์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชจ๋“ˆ ๊ด€๋ฆฌ : Koin์€ ๋ชจ๋“ˆ์„ ํ†ตํ•ด ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, `startKoin` ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ชจ๋“ˆ์„ ์ฃผ์ž…ํ•œ๋‹ค.
  • ์ฝ”๋ฃจํ‹ด ๋ฐ ViewModel ํ†ตํ•ฉ : Koin์€ ์ฝ”๋ฃจํ‹ด ๋ฐ ์•ˆ๋“œ๋กœ์ด๋“œ ViewModel๊ณผ์˜ ํ†ตํ•ฉ์„ ์ง€์›ํ•˜์—ฌ ๊ฐ„ํŽธํ•œ ์‚ฌ์šฉ์„ ์ œ๊ณตํ•œ๋‹ค.

์žฅ์ 

  • ์‚ฌ์šฉ์ด ๊ฐ„ํŽธํ•˜๋ฉฐ, ์„ค์ •์ด ์ง๊ด€์ ์ด๋‹ค.
  • ์ฝ”ํ‹€๋ฆฐ ์–ธ์–ด์˜ ํŠน์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณ„๋„์˜ ์ฝ”๋“œ ์ƒ์„ฑ์ด ์—†์–ด ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

๋‹จ์ 

  • ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ ์ธํ•ด ์ปดํŒŒ์ผ ํƒ€์ž„์˜ ํƒ€์ž… ์•ˆ์ „์„ฑ์ด ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Kotlin ์˜ˆ

  // ๋ชจ๋“ˆ ์ •์˜
  val appModule = module {
      single { Retrofit.Builder().baseUrl("https://api.example.com").build() }
  }

  // ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”
  class MyApplication : Application() {
      override fun onCreate() {
          super.onCreate()
          startKoin {
              androidContext(this@MyApplication)
              modules(appModule)
          }
      }
  }

  // Activity์—์„œ ์˜์กด์„ฑ ์ฃผ์ž…
  class MainActivity : AppCompatActivity() {
      private val retrofit: Retrofit by inject()

      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          setContentView(R.layout.activity_main)

          // Retrofit ์‚ฌ์šฉ
          retrofit.create(ApiService::class.java)
      }
  }


4. Kodein-DI (https://kodein.org/di/)

Kotlin๊ณผ JVM์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋Ÿ‰ DI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

ํŠน์ง•

  • ๊ฒฝ๋Ÿ‰ ๋ฐ ์œ ์—ฐ์„ฑ : Kodein-DI๋Š” ๊ฐ€๋ณ๊ณ  ์œ ์—ฐํ•œ DI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์— ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชจ๋“ˆํ™”๋œ ์„ค์ • : Kodein-DI๋Š” ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ , ๊ฐ ๋ชจ๋“ˆ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํƒ€์ž… ์•ˆ์ „์„ฑ : Kodein-DI๋Š” ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ ์ปดํŒŒ์ผ ์‹œ ์˜ค๋ฅ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • Kotlin ์นœํ™”์  : Kotlin ์–ธ์–ด์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ„๊ฒฐํ•œ DSL์„ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ •์˜ํ•œ๋‹ค.

์žฅ์ 

  • ์„ค์ •์ด ๊ฐ„๋‹จํ•˜๋ฉฐ, ๊ฒฝ๋Ÿ‰ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜๋‹ค.
  • ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ ์ปดํŒŒ์ผ ์‹œ ์˜ค๋ฅ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • Kotlin DSL์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ€๋…์„ฑ์ด ๋†’์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

  • ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์„ฑ๋Šฅ ๋ฐ ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ์ œํ•œ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. 
  • ์ผ๋ถ€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Kotlin ์˜ˆ

  val kodein = DI {
      bind<Retrofit>() with singleton {
          Retrofit.Builder().baseUrl("https://api.example.com").build()
      }
  }

  class MainActivity : AppCompatActivity(), DIAware {
      override val di by closestDI()
      private val retrofit: Retrofit by instance()

      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          setContentView(R.layout.activity_main)

          // Retrofit ์‚ฌ์šฉ
          retrofit.create(ApiService::class.java)
      }
  }

 
5. Toothpick (https://github.com/stephanenicolas/toothpick)

์•ˆ๋“œ๋กœ์ด๋“œ ๋ฐ ์ž๋ฐ” ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋Ÿ‰ DI ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ๊ตฌ์„ฑ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ํšจ์œจ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ์ค‘์ ์„ ๋‘”๋‹ค.

ํŠน์ง•

  • ๊ฒฝ๋Ÿ‰์„ฑ : Toothpick์€ ๊ฒฝ๋Ÿ‰ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ๊ฐ„๋‹จํ•˜๊ฒŒ DI๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ ์ฃผ์ž… : ๋Ÿฐํƒ€์ž„์— ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜์—ฌ ์„ค์ •์ด ๊ฐ„ํŽธํ•˜๋ฉฐ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์Šค์ฝ”ํ”„ ๊ธฐ๋ฐ˜ ์ฃผ์ž… : Toothpick์€ ์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๋•์Šต๋‹ˆ๋‹ค.
  • Kotlin ํ†ตํ•ฉ : Kotlin DSL์„ ์‚ฌ์šฉํ•˜์—ฌ Kotlin๊ณผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ 

  • ๊ฒฝ๋Ÿ‰ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜๋ฉฐ, ์„ค์ •์ด ๊ฐ„๋‹จํ•˜๋‹ค. 
  • ๋Ÿฐํƒ€์ž„ ์ฃผ์ž…์œผ๋กœ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.  
  • ์Šค์ฝ”ํ”„๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

  •  ์ปดํŒŒ์ผ ํƒ€์ž„ ์•ˆ์ „์„ฑ์ด ๋ถ€์กฑํ•˜๋ฉฐ, ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ์ œ์•ฝ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

 

Kotlin ์˜ˆ

  // ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐํ™”
  class MyApplication : Application() {
      override fun onCreate() {
          super.onCreate()
          Toothpick.openScope(this).installModules(AppModule())
      }
  }

  // ๋ชจ๋“ˆ ์ •์˜
  class AppModule : Module() {
      init {
          bind(Retrofit::class.java).toInstance(
              Retrofit.Builder().baseUrl("https://api.example.com").build()
          )
      }
  }

  // Activity์—์„œ ์˜์กด์„ฑ ์ฃผ์ž…
  class MainActivity : AppCompatActivity() {
      private val retrofit: Retrofit by inject()

      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          setContentView(R.layout.activity_main)

          // Retrofit ์‚ฌ์šฉ
          retrofit.create(ApiService::class.java)
      }
  }


์•ˆ๋“œ๋กœ์ด๋“œ DI ํ”„๋ ˆ์ž„์›Œํฌ ๋น„๊ต

ํ”„๋ ˆ์ž„์›Œํฌ ํŠน์ง• ์žฅ์  ๋‹จ์ 
Dagger2 ์ปดํŒŒ์ผ ํƒ€์ž… DI, ํƒ€์ž… ์•ˆ์ „ ๋†’์€ ์„ฑ๋Šฅ, ํƒ€์ž… ์•ˆ์ „์„ฑ ์„ค์ •์ด ๋ณต์žก, ์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ 
Hilt Dagger2 ๊ธฐ๋ฐ˜, ์•ˆ๋“œ๋กœ์ด๋“œ ์ตœ์ ํ™” ๊ฐ„๋‹จํ•œ ์„ค์ •, ์ž๋™ ์Šค์ฝ”ํ”„ ๊ด€๋ฆฌ ์œ ์—ฐ์„ฑ ์ œํ•œ, ์ผ๋ถ€ ๊ธฐ๋Šฅ ์ œํ•œ
Koin Kotlin DSL, ๋Ÿฐํƒ€์ž„ DI ๊ฐ„ํŽธํ•œ ์„ค์ •, ํƒ€์ž… ์•ˆ์ „์„ฑ ์„ฑ๋Šฅ ๋ฐ ํ™•์žฅ์„ฑ ์ œํ•œ
Kodein-DI ๊ฒฝ๋Ÿ‰, ํƒ€์ž… ์•ˆ์ „์„ฑ ๊ฐ„๋‹จํ•œ ์„ค์ •, ํƒ€์ž… ์•ˆ์ „์„ฑ ์„ฑ๋Šฅ ๋ฐ ํ™•์žฅ์„ฑ ์ œํ•œ
Toothpick ๊ฒฝ๋Ÿ‰, ์Šค์ฝ”ํ”„ ๊ธฐ๋ฐ˜ DI ๊ฐ„๋‹จํ•˜๋‚˜ ์„ค์ •, ๋Ÿฐํƒ€์ž„ ์œ ์—ฐ์„ฑ ์ปดํŒŒ์ผ ํƒ€์ž„ ์•ˆ์ „์„ฑ ๋ถ€์กฑ


๊ฒฐ๋ก 

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ DI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ ํƒํ•  ๋•Œ๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ, ์š”๊ตฌ ์‚ฌํ•ญ, ํŒ€์˜ ๊ฒฝํ—˜์— ๋”ฐ๋ผ ์ ํ•ฉํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. Dagger 2์™€ Hilt๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜๋ฉฐ, ๋†’์€ ์„ฑ๋Šฅ๊ณผ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. Koin๊ณผ Kodein-DI๋Š” ๊ฐ„ํŽธํ•œ ์„ค์ •๊ณผ Kotlin ์นœํ™”์  ํ™˜๊ฒฝ์„ ์„ ํ˜ธํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜๋‹ค. Toothpick์€ ๊ฒฝ๋Ÿ‰ ํ”„๋กœ์ ํŠธ์—์„œ ์œ ์—ฐํ•œ DI ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•œ๋‹ค. ๊ฐ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํŠน์ง•๊ณผ ์žฅ์ ์„ ๊ณ ๋ คํ•˜์—ฌ, ํ”„๋กœ์ ํŠธ์— ๋งž๋Š” ์ตœ์ ์˜ ์„ ํƒ์„ ํ•˜๋ฉด ๋œ๋‹ค.