-
[Andoird/Kotlin] Koin 사용법Android/Kotlin 2022. 9. 6. 20:25반응형
[모든 포스팅은 개인적 공부를 위해 작성된 글입니다]
<Koin이란?>
- 자동으로 DI를 가능하게 하는 라이브러리
- 장점 : 경량화, 다른 자동 DI 라이브러리 Dagger에 비해 배우기 쉬움
https://jeong-yeon.tistory.com/109
<Koin 사용법>
- gradle app 수준
//Koin implementation "io.insert-koin:koin-android:3.1.6" testImplementation "io.insert-koin:koin-test:3.1.6"
- 처음에는 org로 시작하는 것을 implementation 했다가 액티비티에서 koin 사용이 불가능해(unresolved) 찾아보니 기존의 org로 시작하는 것이 없어지고 위의 것으로 바뀌었다고 함
- KoinApplication{} : KoinApplication 생성하는 컨테이너 구성
- startKoin{} : 어플리케이션 생성(KoinAppllication 컨테이너 구성하고 GlobalContext를 사용하여 등록)
- modules{} : 사용할 모듈(inject(주입) 될 대상) 정의
- single{} : SingleTon 패턴으로 인스턴스 생성(한번 생성하면 계속 쓰는 것)
- factory{} : 사용할 때 마다 인스턴스 새로 생성
- viewModel{} : ViewModel 전용
- module() : 사용할 모듈 리스트 설정
- get() : 필요한 구성요소 자동 매핑
- androidLogger() : 안드로이드 전용 로그 작성(현재 코드에서는 androidLogger()를 사용하는 경우 에러가 발생해 주석처리 해두었는데 원인 찾는대로 추가할 예정)
- logger() : 사용할 레벨 및 logger 구현 설명(로그 작성)
- properties() : HashMap 속성을 Koin 컨테이너에 로드
- fileProperties() : 주어진 파일에서 Koin 컨테이너로 속성 로드
- environmentProperties() : OS 환경에서 Koin 컨테이너로 속성 로드
class MyApplication: Application() { override fun onCreate() { super.onCreate() startKoin{ androidContext(this@MyApplication) // androidLogger() modules(mainModule) } } val mainModule = module{ factory<MainRepository>{ MainRepositoryImp() }//한 번 생성 후 필요할 때 마다 재사용 factory{ MainUsecase(get()) }//필요할 때 마다 새로 생성 viewModel { MainViewModel(get()) } } }
- 기본적으로 androdiContext와 androidLogger는 추가하지 않아도 정상적으로 작동함
- ViewModel은 매개변수로 Usecase를 받고 UseCase는 매개변수로 Repository를 받음(get()이 알아서 필요한 것(ViewModel에서는 UseCase)를 찾아 주입)
- Repository 구현체를 사용해 모듈 생성하는 경우 반드시 factory 옆의 <> 안에 인터페이스를 넣어줘야 함(모르고 한참 헤맸다..)
*MyApplication 클래스는 Application()을 상속받고 생성한 후 menifest.xml에 추가해줘야 함*
<application android:name=".koin.MyApplication" . . . ></application>
MainActivity
private val mainViewModel: MainViewModel by viewModel<MainViewModel>() mainViewModel.getHoliday()
- ViewModel이 아닌 경우 by viewModel 대신 by injection() 사용
<Koin의 단점>
- Activity에서만 의존성 주입 가능(다른 클래스에서 하려면 constructor를 반드시 제공해야 함)
- 지금 생각하면 정말 간단한 내용인데 처음 접했을 당시에는 왜그렇게 어려웠는지.. 더 열심히 해야겠다..*참고한 블로그*
반응형'Android > Kotlin' 카테고리의 다른 글
[Android/Kotlin] Glide 라이브러리 사용 방법 (0) 2022.09.12 [Android/Kotlin] MaterialCalendarView 커스텀 (0) 2022.09.08 [Android/Kotlin] Retrofit과 OKHttp를 사용하여 공공데이터포털 json 파싱하기, MaterialCalendar 공휴일/휴일 빨간색 데코레이터 추가 (0) 2022.09.05 [Android/Kotlin] DatePicker 초기화 (0) 2022.08.31 [Android/Kotlin] startAcitivtyForResult() 대체 (0) 2022.08.31