최근에 흥미로운 글 하나를 읽었습니다.

🧑‍💻🧑‍💻🧑‍💻

 

 

"Koin은 DI 인가 Service Locator 인가?"

 

Android DI 하면 그다음 항상 따라오는 Dagger, Hilt, Koin 삼 형제가 있죠

 

여기서 우리가 귀가 아프도록 들었던 "Koin"

우리에게 익숙한 친구인 "Koin"이 사실은 DI가 아니라 

Service Locator 패턴이라고 합니다. 

 

여기서 부터 많은 혼란이 찾아오죠.

😵‍💫😵‍💫😵‍💫

 

"Koin이 DI가 아니다?"

"Service Locator는 뭐지?"

"Koin으로 생성해 둔 프로젝트들을 모두 리펙토링 해야 하나?"

 

우선 Service Locator는 무엇인가 알아봐야겠습니다.  💁‍♂️💁‍♂️

 

 

혹시 Koin에 대해 알아보고 싶으신가요?

 

[Kotlin] Android Koin을 활용하여 DI 적용 (경량화 DI Koin)

요즘 아주 자주 보이는 DI 종속 항목 삽입의 개념을 알고자 간단한 프로젝트를 생성하여 Koin을 이용한 DI를 적용해봤습니다. (조용히 숨만 쉬고 사는데도 배워야 할 앱 개발 지식은 끝이 없네요...

salmonpack.tistory.com

 


 

 

Service Locator는 Martin Fowler 🥸🥸 라는 아저씨가 처음 제시한 이후

잘 알려진 패턴 중 하나라고 합니다.

 

Service Locator의 목표는 모듈화 수준을 높이는 것입니다. 

클라이언트와 인터페이스 사이의 의존성을 제거하는 방식으로 모듈화 수준을 높이는데요. 

 

Service Locator는 중앙 레지스트리 같은 역할을 합니다. 

모든 인터페이스에 대한 구현체를 저장하고 기억하고 있다가  

필요한 부분에서 사용하게 도와줍니다. 

 

이와 같은 방식으로 클라이언트는 구현체와 더 느슨한 관계를 가지게 됩니다.

하지만 Service Locator는 싱글톤과 같은 형태로 구현체들과 관계가 형성됩니다.

 

 

 

 

 

요약하자면 

Service Locator에 구현체에 대한 정보를 모두 등록해 두고 

해당 구현체가 필요한 곳에서 Locator를 통해 제공받을 수 있도록 하는 패턴입니다. 

 

여기서 많은 사람들이 주장하는 Service Locator의 문제점은 

클래스의 의존성을 숨긴다는 점, 다시 말해 컴파일 중에는 오류가 나타나지 않지만 

런타임에서는 오류가 발생할 여지가 있다는 이야기입니다. 

 

모든 관리를 동적으로 관리되는데, 동적으로 관리되기 때문에

컴파일 시점에서 어떠한 문제도 발생하지 않고, 런타임에서 문제가 발생됩니다.

 

런타임에서 발생된 문제를 해결하려면

구현체 생성과 Service Locator에 등록되는 과정에 대한 모든 코드를 파악하고 있어야 합니다.

 

이 외에도 Service Locator는 안티패턴이며 

Service Locator를 사용했을 때 나타는 문제점과 내용에 대해 

다른 분들이 작성한 글들을 참고했습니다.

 


 

다시 본론으로 돌아오자면

Koin은 엄밀하게 따져본다면 DI 라이브러리가 아니라 

Service Locator 패턴의 구현체에 더 가깝다고 합니다. 

 

이렇게 듣고 보니 처음 Koin을 적용하여 사용할 때 생각해 보면

컴파일에서는 정상이지만 런타임에서 Koin 적용 관련된 에러를 자주 봤던 경험이 있습니다.

Hilt를 적용할 때는 컴파일에서 이미 에러 이슈를 찾아 보여줬었고요.

 

Koin을 적용한 경우 Hilt 보다 의존관계 파악이 어려웠습니다.

Hilt의 경우 AndroidStudio 툴에서 좌측에 아이콘으로 표현해주기도 하고요

(AndroidStudio에서 Hilt 의존 관련 아이콘 표현 설명 자료)

 

Android Hilt 적용하기1 - (Koin vs Hilt)

Photo by Anis Rahman on Unsplash 다들 "단검"🗡 많이 사용해 보셨나요?? "단검 칼자루"⚔️는 많이 만져보셨나요?? 갑자기 시작부터 이상한 소리인가 하시겠지만 저는 요즘 핫한 Android DI "Dagger"와 "Hilt"에

salmonpack.tistory.com

 

 

작고 간단한 프로젝트에 빠르고 쉽게 적용하기 위해서는 Koin이 조금 유리한 측면이 있다고 생각하지만

크고 복잡한 로직의 프로젝트에서는 멀리 봤을 때 Hilt와 같은 DI 라이브러리가 유지보수에 더 유리하다고 생각합니다. 

 

 

➕➕➕

자료 참고

- https://edykim.com/ko/post/service-locator-is-an-antipattern/

- https://eggrollfactory.tistory.com/m/25

- https://dev-kimji1.medium.com/di-라이브러리-koin-은-di가-맞을까-66f974fead4f

 

 

 

 


여기까지 저의 긴 글을 읽어주셔서 감사합니다.

제가 습관적으로 코딩을 하는 그날까지 습관적으로 코딩을 하기 위해 글 작성을 꾸준하게 해 보겠습니다.

 

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기