Service Locator vs DI Container
공통점
둘 다 객체 간의 의존성(Dependency)을 외부에서 관리해주는 역할을 함.
즉, 객체가 직접 필요한 걸 만들지 않고, 외부에서 "가져오거나" "주입받음".
둘 다 IoC(Inversion of Control, 제어의 역전) 원칙을 따른다는 점에서 비슷함.
차이점
의존성 전달 방식
객체가 직접 Service Locator(저장소)에 요청해서 가져옴
DI 컨테이너가 객체를 만들 때 필요한 의존성을 "주입"함
코드 예시
this.foo = locator.get(Foo)
constructor(Foo foo)
(생성자에서 바로 받음)
결합도
객체가 Service Locator에 "직접 의존"
객체는 DI 컨테이너를 몰라도 됨(느슨한 결합)
테스트 용이성
테스트 어려움 (Locator를 Mock해야 함)
테스트 쉬움 (Mock 객체 주입 가능)
의존성 명시성
코드에서 의존성이 "숨겨짐"
생성자/필드에서 의존성이 "명확히 드러남"
대표 예시
Koin(실제로는 Service Locator에 가까움)
Spring, Dagger, Hilt, GetIt(Flutter) 등
쉽게 비유
Service Locator: "필요할 때마다 냉장고(Locator)에서 꺼내먹는 방식." → 내가 직접 냉장고에 가서 우유를 꺼내옴.
DI 컨테이너: "아침에 엄마가 우유를 내 책상에 미리 갖다주는 방식." → 나는 그냥 책상 위에 있는 우유를 마시면 됨.
Flutter에서 적용 예시
Service Locator 패턴:
GetIt
에서 직접GetIt.I.get<MyService>()
로 객체를 꺼내올 때.DI 컨테이너 패턴: Provider, Riverpod 등에서 위젯 트리를 통해 필요한 객체가 "자동으로 주입"될 때
Last updated