스프링을 처음 배웠을 때, 엔터프라이즈급의 대형 프로젝트에 적합하고 확장성이 뛰어난, 제어의 역전이 특징인 자바 진영의 프레임워크라고 배웠었다. 제어의 역전이라는 것이 직관적으로 이해하기가 어려웠다. 지금도 어렵다. 마틴 파울러의 블로그와 스택오버플로우를 보면서 이해한 부분을 나름 정리해보았다.
IoC는 소프트웨어 관점에서 포괄적으로 쓰이는 개념이다. callback 함수와 같이 사용자가 따로 값을 입력하지 않아도 프로그램이 특정 기능을 수행하는 경우부터, 객체 지향 프로그래밍에서 어떤 객체의 의존성을 다른 객체에 주입하는 것까지 모두 해당된다. 자바를 배우면서 알게된 개념이라 IoC = DI 라고 알고 있었지만, 사실은 IoC가 더 범위가 넓고, (마틴 파울러에 따르면) 그만큼 모호한 개념이라고 할 수 있다. 결과적으로 DI(Dependency Injection)란 IoC를 구현하기 위한 많은 소프트웨어 설계 방법 중 하나에 불과하며, 객체 지향 프로그래밍의 관점에서 쓰이는 표현이라고 보면 될 것 같다.