ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] Koin vs Dagger2
    Mobile Engineering 2020. 4. 21. 23:20

    이전 아티클을 보시면 아래의 내용을 이해하는데 도움이 됩니다.

    Koin으로 의존성 주입하기 [ https://simplifyprocess.tistory.com/5 ]

     

    오늘은 민감한 주제입니다. Koin vs Dagger2.

    Dagger는 안드로이드에서 가장 많이 사용되고 있는 DI Framework이고, 구글에서 직접 유지보수하는 오픈소스입니다. 하지만 두가지를 경험해본 저는 Koin에 손을 들어주고 싶습니다. 왜냐하면 서로 바라보는 지향점이 아주 다르고 Layering, 사용 편의성으로 따져봤을때 Koin이 더욱 우세하다고 생각합니다.

     

     

     

    Koin과 Dagger의 구동방식

    이해를 돕기 위해 아래의 그림을 봅시다.

    위 그럼처럼 Koin은 Module에서 선언한 DI를 Cache에 저장하고 있습니다. 그렇기 때문에 Injection이 필요한 코드에서는 클래스 정보와 'by inject()'로 캐시를 조회해서 Singleton 또는 Factory로 DI 객체를 가져와서 실행하는 방식입니다. 그래서 이 부분이 Dagger와 근복적인 차이를 가지고 있다는 것입니다. Dagger는 꺼꾸로 DI가 어디에 Injection되어야 하는지 Component Interface를 통해서 지정하는 방식입니다. 그리고, Dagger는 Code Generation 방식이라서 인터페이스와 어노테이션을 통해서 코드를 만들기 때문에 Cache같은 것이 필요없어서 속도가 아주 빠릅니다. 그에 반면 Koin은 내부적으로 Caching해야하는 메커니즘으로 셋업하는데 시간이 필요합니다. 하지만 처음에 앱을 구동할때 한번만 캐싱하는 구조이니 체감하기 힘들고, 캐싱이후 퍼포먼스는 Dagger와 Koin이 비슷한 수치를 보이고 있습니다. 

     

    유연한 Architecture에 대한 지원

    Dagger는 위에 언급한 것처럼 Code Generation 타입이고, Injection할 클래스를 지정하는 구조이기 때문에 안드로이드 모듈(AAR) 형태로 패키징해서 사용하기 힘듭니다. 패키징한다하더라도 메인 패키지 모듈에서 Injection을 위해 Module과 Component를 한땀한땀 작성해줘야 합니다. 그에 반면 Koin은 각 AAR모듈에 Koin Module을 넣고 Koin을 세팅하는 부분에서 Import만하는 형태로 DI 세팅을 자유롭게 할 수 있습니다. 이는 클린 아키텍처에서 이야기한 것처럼 Layer간 분리를 손쉽게 구현할 수 있을 뿐더러 마이크로 소프트처럼 여러개의 앱을 출시하는 회사에서는 공통 비즈니스 모듈을 만들고 Nexus같은 Maven Repository를 통해서 배포하는 방식을 사용한다면 엄청난 생산성 향상을 가져올 수 있는 기회일 것입니다.

     

    TDD 관점

    TDD 관점에서는, 안드로이드도 DI의 적극적인 도입으로 TDD를 할 수 있는 기반이 마련됐다고 생각합니다 - 기반은 마련됐지만 언제나 실천하는 사람이 문제입니다. Koin은 KoinTest라는 라이브러리를 제공하여 테스트 코드를 획기적으로 편리하게 작성할 수 있습니다. KoinTest를 어떻게 세팅하고 사용하는 것은 별도의 포스팅으로 거론하도록 하겠습니다.

     

    캡슐화 - Encapsulation

    사실 개인적으로 두개의 프레임워크에 대한 차이를 극명하게 보여주는 부분이라고 생각합니다. 앞서 거론했듯이 Dagger는 Inject을 바깥에서 주입해주는 Push 방식입니다. 그래서 Injection 대상 필드는 반드시 public으로 접근제한을 풀어줘야 합니다. 하지만 Koin은 Injection 대상 필드가 주입하기 위해 객체를 가져오는 방식인 Pull 방식이라서 private으로 접근제한을 줄 수 있습니다. 그게 뭐가 중요한가요? 라고 반문하실 수 있지만, 이것은 캡슐화 관점에서 너무나 중요한 부분입니다. 다른 한편으로는 보안 측면에서 치명적이라고 볼 수 있습니다. 모든 접근자를 public으로 열어준다는 것은 '해커에게 저희 앱은 당신에게 모든 것을 내어주겠습니다.' 라고 이야기하는 것이나 다름없습니다. 필자가 만나본 안드로이드 개발자중에 이런건 너무 취약한 것 아니냐는 질문에  '안드로이드는 백엔드와 다르다. 안드로이드는 구조가 원래 그렇습니다.'라는 답변으로 주장하시는 분들이 있는데, 필자가 보기엔 어불성설입니다. 안드로이드든 서버든 상관없이 과연 객체지향 언어를 사용하는 요즘 개발자가 맞는지 의심스러울 정도입니다. 그만큼 개발을 하면서 바라보는 관점과 시각 차이가 크다는 것입니다. 그렇다 보니 Koin과 Dagger는 DI를 사용하는 목적과 방향에 대해서 바라보는 시각 차이가 크다는 것입니다. 과거 Dagger는 DI 개념이 없던 안드로이드 사막에 내린 단비와 같았습니다. 그리고 제일 많이 사용하는 왕좌의 자리에 올랐다고 볼 수 있습니다. 하지만, Kotlin의 점유율 확대와 간편한 사용법과 기본에 충실한 Koin으로 인해 Dagger의 입지는 조금씩 줄어들고 있습니다.

     

    Conclusion

    결론적으로 Koin과 Dagger는 비슷하면서도 완전히 다른 패러다임을 가지고 있습니다. 하지만 개발자도 사람인지라 아무리 유명하고 좋더라도 러닝커브가 크고, 사용하기 어렵고, 번거롭다면 선택하는데 주저하게 됩니다. Dagger를 사용하고 있는 엔지니어가 Koin으로 변경한후에 너무 편하고 좋다는 포스팅이 여기저기서 보여지고 있는 것을 보면 Dagger의 앞날이 그리 밝지는 않은것 같습니다. 그에 반해 Koin은 하루 이틀만의 리서치만으로 DI를 자유롭게 사용할 수 있을 정도로 쉽고 빠르고 간편하다는 점에서 향후 DI Framework에 대한 판도가 어떻게 바뀔지 기대됩니다. 

     

     

     

     

    Thanks

    Hans

Designed by Tistory.