Service Locator 와 Dependency Injection 둘의 각 장단점을 정리하면서 비교해 보려고 합니다.
1. IoC (Inversion of Control)
IoC는 클래스가 다른 클래스를 사용할 때 의존성이 강한 결합이 발생하는 것을 방지하기 위해 외부에서 인터페이스를 활용해 클래스를 제공해 줘 느슨한 결합을 만들어주는 개념입니다.
이 때문에 클래스 내에서 사용할 클래스 객체를 생성하면 안 되고, 외부에서 객체를 받아와서 사용해야 합니다.
또한 싱글톤으로 클래스 객체를 받아와서 사용하는 건 해당 클래스에 강한 결합이 일어나는 방법이므로 사용하면 안됩니다.
이렇게 함으로써 테스트 환경을 구축하기 쉬워져 테스트가 용이해지고, 특정 환경에 종속되지 않아 유지보수성 및 재사용성이 좋은 코드를 짤 수 있습니다.
이때, 외부에서 객체를 받아오는 방법으로 Service Locator, Dependency Injection 가 있습니다.
2. Service Locator
Service Locator 는 다른 클래스에서 사용될 클래스 객체들을 전역 접근이 가능한 중앙 등록소에 미리 등록하여, 클래스가 해당 객체들을 사용할 때 중앙등록소에서 가져와서 사용하는 방법입니다.

장점
- 구현이 간단하고 이해하기 쉬워 빠르게 적용할 수 있습니다.
- 어떤 객체든 Sevice Locator 에 접근할 수 있기 때문에 편리하게 사용할 수 있습니다.
단점
- 클래스가 어떤 Service Locator의 객체들을 사용하는지 의존성이 명확하게 드러나지 않습니다.
(구현부를 들여다 봐야지 확인이 가능합니다.) - 사용될 클래스가 Service Locator 에 모두 등록되므로 ServiceLocator 가 너무 비대해질 수 있습니다.
또한, Service Locator 와의 의존성은 강하게 결합되는 문제가 있습니다. - 테스트 환경에서도 Service Locator 가 문제없이 동작하도록 신경 써야 하는 문제가 있습니다.
(Dependency Injection보다 테스트 환경을 구축하기 어렵습니다.)
3. Dependency Injection
DI(Dependency Injection) 은 특정 클래스가 필요한 클래스 객체들을 외부에서 주입시키는 방법입니다.
해당 클래스는 수동적으로 의존성을 받기만 하고, 스스로 의존성을 찾거나 생성하지 않습니다.
보통 생성자 주입을 많이 사용합니다.

장점
- 의존성이 외부에서 주입되기 때문에 굉장히 약한 결합 의존성을 가집니다.
- 주입되는 부분이 한정적이므로 어떤 객체들을 사용하는지 의존성이 명확하게 드러납니다.
- 테스트환경에서 모킹 객체들을 쉽게 주입할 수 있어 단위테스트 작성이 용이합니다.
단점
- 라이브러리를 사용하지 않을 경우 초기 설정 구축이 어렵습니다.
또한, DI 프레임워크를 도입하더라도 러닝커브가 좀 있습니다. - 의존성 주입을 작성할 때마다 꽤 긴 코드를 작성해야 할 수 있습니다.
4. 결론
Service Locator 의 경우 사용하기 간단하고 쉽지만, 테스트 환경을 구축하기가 Dependency Injection 보다는 어렵기 때문에 간단하게 IoC 를 구축해야 하는 경우 유리하고, 테스트 환경을 구축해야 하는 프로젝트의 경우에는 불리합니다.
Dependnecy Injection 의 경우 초기 구축이 난이도가 있고 사용하기가 약간 복잡하다는 단점이 있지만, 테스트 환경 구축이 용이하며, 유지보수성이 Service Locator 보다 더 뛰어나기 때문에 간단한 프로젝트에서는 불리하며, 테스트 환경을 구축해야 하거나 큰 팀에서 진행하는 프로젝트에는 유리합니다.
참고
https://martinfowler.com/bliki/InversionOfControl.html
'프로그래밍 일반' 카테고리의 다른 글
| 추상클래스 vs 인터페이스 (0) | 2026.04.09 |
|---|---|
| SOLID 원칙 정리 (0) | 2024.11.03 |