[Inject] 속성 또는 생성자의 인자로 종속성 인스턴스를 주입하는 방식은 생성 시점입니다. 이후, 인스턴스가 생성된 이후부터는 그러한 종속 연결이 더이상 진행되지 않습니다. 즉, 종속 관점에서 생성 이후의 관계는 불변하게 됩니다. (생성자의 인자로 종속관계가 모두 드러납니다.) 불변하다는 것은 프로그래머가 인스턴스 생성 이후 종속관계를 추적할 필요가 없다는 것입니다.
그런데, GetService를 써서 일반 메소드에서 서비스 인스턴스를 받게 되면 종속 관계는 메소드를 호출할때와 호출하지 않을때 마다 변하게되므로 종속관계가 불명확해지게 됩니다. 이렇게 되면 문제가 발생했을 때 추적하기 어렵게 되고 다양한 버그가 생길 수 있습니다.
명시적 종속성 위반
필요한 종속성을 캡슐화하는건 좋은 코드 디자인이 아닌거 같습니다. 컴포넌트는 자신이 운용되기 위해 필요한 종속성을
직접적으로 요청해야합니다. 또한 그러한 종속성이 해결되지 않는다면 사용 할 수 없기에 생성자를 통한 주입이 일반적입니다.
자동화 테스트의 어려움
서비스 로케이터를 컴포넌트내에서 캡슐화해 사용한다면 외부에서 종속성을 어떻게 해결하는지 알 수 없습니다.
즉, 자동화 테스트 작성을 위해 그 녀석이 필요로하는 환경 구성을 해줄 수 없습니다.
종속성 변경에 대한 위험
컴포넌트는 자신이 운용되기위해 필요한 종속성만을 요구하는게 좋을 것 같습니다.
서비스 로케이터를 사용한다면… 무엇이든 해결할 수 있는 백도어를 열어준것과 같습니다.
전지전능한 슈퍼맨을 얻은 효과죠. 유지관리 측면에서 코드는 보호되지 않을 확률이 높은거 같습니다.
저도 마지막에 설명해주신 '서비스 로케이터를 사용한다면, 무엇이든 해결할 수 있는 백도어를 열어준 것과 같다’는 말에 공감합니다. 느낌적인 느낌으로 그거때문이려나 생각했지만 공식문서에서 이유를 안 적어주니 여러 의견을 듣고 싶었네요. 덕분에 생각이 견고해졌습니다. 감사합니다!!