Koin(Service Locator) 알아보기

James_·2022년 3월 9일
0

DI?

  • 컴포넌트간의 의존 관계를 소스코드 내부가 아닌 외부 설정 파일등을 통해
    정의되게하는 디자인 패턴 중 하나
  • 객체를 직접 생성하지 않고 외부에서 주입한 객체를 사용하는 방식
  • 인스턴스 간 디커플링을 만들어줌 -> 유닛테스트 용이성 증대

서비스 로케이터?

  • 중앙 등록자 Service Locator를 통해 요청이 들어왔을 떄 특정 인스턴스 반환
  • apk 크기, 빌드 속도, 메서드 수 등 복잡한 제약이 있는 경우 사용하기 편함
  • Koin이 대표적인 라이브러리

DI와 비교해보기

종속성

DI: 일부 핵심 클래스에 종속성을 주입
ServiceLocator: 모든 클래스가 서비스 로케이터에 종속

호출방법

DI: 처음 한번만 호출(명시적인 호출X)
ServiceLocator: 인젝터를 직접 호출(명시적인 호출)

의존관계

DI: 의존 관계 파악이 쉬움
ServiceLocator: 의존 관계 파악이 어려움

Koin 흝어보기

선언

class Controller(val service: BusinessService)
class BusinessService()

val myModule = module{
	single{Controller(get())}
    single{BuisnessService()}
}

single 키워드로 싱글톤으로 만들었다는 것 확인 할 수 있다(다른 키워드는 밑에서 확인 가능)

Inject 생성

class Controller(val service:BusinessService){

	fun hello(){
    	service.sayHello()
    }
}

안드로이드에서 사용하기

뷰에서 by 키워드로 Delegate 받는다.

class MyActivity:AppCompatActivity(){
	
    val service: BusinessService by inject()
}

Koin 키워드

+ module{...} : 키워드로 주입 받고자 하는 객체의 집합
+ single{...} : 앱이 실행되는 동안 계속 유지되는 싱글톤 객체 생성
+ factory{...} : 요청할 때마다 매번 새로운 객체를 생성
+ get() : 컴포넌트 내에서 알맞은 의존성을 주입

Koin의 장단점

  • 장점
  • 러닝커브가 낮아 쉽고 빠르게 DI 적용 가능
  • Kotlin 개발 환경에 도입하기 쉬움
  • 별도의 어노테이션을 사용하지 않기 때문에 컴파일 시간 단축
  • ViewModel 주입을 쉽게 할 수 있는 별도의 라이브러리 제공
  • 단점
  • 런타임시 주입이 필요한 컴포넌트가 생성이 되어있지 않는 파라미터가 있는 경우 크래시 발생
  • 컴파일 타임에 주입대상을 선정하는 DI에 비해 런타임에 서비스 로케이팅을 통해 인스턴스를 동적으로 주입하기 때문에 런타임 퍼포먼스 감소
profile
Android 개발자

0개의 댓글