본문 바로가기
Android 개발/Hilt, Koin, DI(Dependency Injection)

KOIN을 이용한 Dependency Injection (DI) 구현하기

by Developer88 2020. 1. 6.
반응형

DependencyInjection을 구현하는 것을 도와주는 라이브러로 가장 유명한 것은,

Square에서 시작해서 Google에서 이어서 만들고 있는,

Dagger2인데요.

오늘은 다른 라이브러리인 Koin에 대해서 알아보도록 하겠습니다.

 

혹시 Dependency Injection에 대한 개념을 이해하지 못하고 계신 분들은 아래 글을 참조해 주세요.

>> Dependency Injection(DI)에 대해서 알아보자

 

1.  Implementation

가장 먼저 할 것은 라이브러리를 Implement하는 것 인데요.

아래와 같이 한 줄이면 됩니다.

 

 

2. Single과 Factory

먼저 Koin에서 객체를 생성해 주입시켜줄 Module을 생성하기 전에,

Module에서 사용되는 중요한 키워드인 Single과 Factory에 대해서 알아보겠습니다.

A. Single

Dagger에서 Singleton 애노테이션으로 사용했던 것과 비슷하게,

Retrofit의 객체처럼 App전체 주기동안 계속 살아서 이용할 수 있는 객체를 생성할 때 사용합니다.

 

B. Factory

Single과는 반대로 매번 객체를 생성해서 사용할 경우에 사용하는데요.

Dagger의 Provides와 비슷합니다.

 

3.  Module 구현

Module이라는 것은 객체를 만들어서 주입해 줄 대상들에 대한 목록이라고 할 수 있는데요.

실제로 Retrofit 클래스의 객체를 생성해 주입해주는 networkModule을 보도록 하겠습니다.

single키워드를 이용하여, Singleton타입의 Retrofit의 Api클래스 객체를 주입할 수 있는 모듈을 생성하였습니다.

 

 

 

만약 인자로 Application또는 context가 필요하다면, androidApplication()함수 또는 androidContext()를 통해서 아래와 같이 얻어올 수도 있습니다.

 

 

객체생성은 요청시 lazy하게 생성되어 지지만,

아래와 같이, createdAtStart프로퍼티를 사용하면 정의하는 동시에 객체를 생성하게 할 수 있습니다.

 

 

4. Koin Start

Application클래스에서 Koin을 start하는 방법은 아래와 같습니다.

위에서 구현한 Module은 modules에 인자로 넣어주면 됩니다.

여기서는 하나의 모듈만을 집어 넣어주었는데요.

listOf()함수를 이용해서 list를 넣어줄 수 도 있습니다.

 

 

5. 객체 주입

위에서 제공할 객체를 생성할 모듈에 대해서 정의해 보았는데요.

이제 실제로 객체를 주입해 보도록 하겠습니다.

 

객체를 생성해 주입받는 방법은 두가지 인데요.

변수선언시에 by inject()태그를 붙여서 lazy하게 호출시 생성하는 방법과,

get()태그를 붙여서 바로 주입받는 방법이 있습니다.

 

 

 

6. ViewModel과 Koin

MVVM을 사용하는 앱을 위해서 KOIN에서는 ViewModel을 위한 라이브러리를 따로 제공해 주고 있습니다.

아래와 같이 라이브러리를 implementation해 주면 준비가 다 된 것이구요.

 

ViewModel이 아래와 같이 생성자의 인자를 Api타입객체를 받는다고 가정하겠습니다.

 

 

아래와 같이 모듈파일에서 모듈을 정의해 주어서,

Koin모듈이 객체를 생성해서 주입해 주도록 합니다.

 

 

이제 MyApplication에서 startKoin을 해 줄 때,

모듈리스트에 아래와 같이 포함해 주면 됩니다.

 

 

이제 객체를 주입할 준비는 다 되었구요.

이제는 viewModel객체도 Koin모듈에서 객체를 생성해서 주입해주므로,

Activity나 Fragment에서 더 이상 "ViewModelProviders.of(this).get(ViewModel::class.java)"와

같은 코드는 사용하지 않고 삭제해 줍니다.

Lazy하게 객체를 생성해서 주입받기(inject) 위해 아래와 같이 한줄만 추가해주면 됩니다.

차이점이라고는 by inject()태그가 아닌 by viewModel()태그를 붙이는 것 뿐이네요.

 

 

이상으로 Koin을 이용해서 DI(Dependency Injection)를 구현해보고,

ViewModel를 주입받아서 사용하는 것 까지 알아보았습니다.

Koin과 관련되서 더 좋은 방법이 있으면 이 글을 통해서 업데이트 하도록 하겠습니다.

 

728x90

댓글