*인프런 김영한 강사님의 강좌를 참고하여 정리한 내용입니다.*
단순히 스프링이 제공하는 기능을 배우고 사용하는 것은 어렵지 않습니다.
그런데 스프링이 제공하는 핵심 가치와 원리를 제대로 이해하고 사용하려면 큰 난관에 부딪힙니다.
왜냐하면 IoC(제어의 역전), DI(의존관계 주입) 같은 알듯말듯한 용어부터, SRP, OCP, DIP 같은
소위 SOLID라 불리는 좋은 객체 지향 설계의 원칙들도 함께 이해해야 비로소 스프링의 핵심 원리를
제대로 파악할 수 있기 때문입니다.
- 김영한 -

객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러개의 독립된 역활을 수행하는 단위이다. 즉 "협력"하는 객체들의 모임이다. 또한 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하다.
객체 지향 프로그램이 유연하다는 것은, 독립적으로 역활을 수행하는 컴퓨터 프로그램을 마치 컴 퓨터 부품을 갈아 끼우듯이 변경할 수 있다는 것이다.

자동차 역활을 구현한 자동차(K3, 아반떼, 테슬라 모델3)는 자동차 역활(인터페이스)에만 "의존"하고 있기 때문에 운전자는 자동차를 운전할 수 있다. (자동차 역활에만 의존할 수 있다)
이처럼 역활과 구현을 구분하게 되면, 구현에 의존하지 않기 때문에 구현의 변경이 유연하며 용이하다.