객체지향의 핵심 원칙을 지키면서 설계를 해야한다면.. 스프링을 쓸 수 밖에 없다.
클라이언트는 대상의 역할만 알면 된다.
클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
객체 설계시 역할을 먼저 부여하고, 그 역할을 수행하는 구현 객체를 만들면 된다.
한마디로 구현 클래스에 의존하면 안되고, 인터페이스에 의존해야한다.
하지만 다형성의 특지만 가지고 OCP, DIP를 지키며 코딩을 할 수가 없다.
객체 지향의 핵심은 다형성이다. 다형성 만으로는 쉽게 부품을 갈아 끼우듯이 개발 할 수가 없다..
다형성만으로는 구현객체를 변경할때 클라이언트 코드도 함꼐 변경된다.
그래서 스프링은 DI(의존관계 주입), DI 컨테이너 제공함으로써, 다형성, OCP, DIP를 가능하게 지원한다.
즉 클라이언트 코드의 변경 없이 기능을 확장 할 수 있다. (OCP)
쉽게 부품을 교체하듯이 개발 할 수 있다.