개발자가 작성한 객체나 메서드의 제어(객체의 생성, 설정, 초기화, 메소드 호출, 소멸 등의 생명주기)를 개발자가 아니라 외부(Spring container)에 위임하는 설계 원칙 [IOC는 설계(디자인) 패턴이 아니라 원칙이다] 이로인해 객체와 메서드간의 결합성을 낮춰 좀더 유연하고 확장성이 높은 코드를 작성할 수 있게된다.
종종 IOC와 DI를 같은 의미로 사용하지만 DI는 IOC가 구현된 한 가지 예시일 뿐이다.
제어의 역전이 구현된 예는 다음 세 가지가 있다.
1. Dependency Injection 의존성 주입
2. Service Locator Pattern 서비스 로케이터 패턴
3. Event-driven Programs, as opposed to Sequential Programs 이벤트 드리븐 프로그램, 순차적 프로그램과 반대되는
의존성 주입(Dependency Injection, DI)은 객체 지향 프로그래밍에서 사용되는 IOC를 구현한 디자인 패턴(설계패턴)이다. 객체가 필요한 의존성(다른 객체)을 외부에서 주입받아 사용하는 것을 의미한다. DI를 사용하면 객체의 생성과 관리를 외부에서 담당하게 되어, 객체는 자신의 의존성에 대한 구현에 의존하지 않고, 자신의 책임에 집중할 수 있다.
장점 :
- 테스트 용이성 : DI를 사용하면 객체를 독립적으로 테스트할 수 있다. 객체의 생성과 관리를 외부에서 담당하기 때문에, 객체는 필요한 의존성을 외부에서 주입받아 사용할 수 있다. 따라서 객체를 특정 구현에 종속시키지 않고 테스트할 수 있다.
- 확장성 : DI를 사용하면 객체 코드를 변경하지 않고 외부에서 의존성을 변경할 수 있기때문에 확장성이 좋아진다.
- 유지보수성 : DI를 사용하면 객체 코드는 객체의 의존성을 다루는 코드만 남게 되어 객체 코드를 쉽게 이해하고 유지보수할 수 있다.
Service Locator 패턴은 객체가 필요한 서비스를 찾기 위해 중앙 집중식 서비스 로케이터를 사용하는 디자인 패턴입니다. 서비스 로케이터는 객체가 필요한 서비스를 제공하는 인터페이스를 정의하고, 해당 인터페이스를 구현하는 객체를 생성하고 관리합니다.

장점:
- 코드의 재사용성: Service Locator 패턴을 사용하면 객체는 필요한 서비스를 찾기 위해 중앙 집중식 서비스 로케이터를 사용할 수 있습니다. 따라서 객체는 특정 서비스에 종속되지 않고, 다양한 서비스에서 재사용할 수 있습니다.
- 코드의 확장성: Service Locator 패턴을 사용하면 새로운 서비스가 추가되더라도, 객체 코드를 변경하지 않고 새로운 서비스를 사용할 수 있습니다.
- 코드의 유지보수성: Service Locator 패턴을 사용하면 객체 코드는 필요한 서비스에 대한 의존성만을 담고 있습니다. 따라서 객체 코드를 쉽게 이해하고 유지보수할 수 있습니다.
단점:
- 코드의 복잡성: Service Locator 패턴을 사용하면 객체 코드가 복잡해질 수 있습니다.
- 코드의 테스트 용이성: Service Locator 패턴을 사용하면 객체를 테스트하기 어려울 수 있습니다.
- 코드의 성능: Service Locator 패턴을 사용하면 코드의 성능이 저하될 수 있습니다.
순차적 프로그램은 일련의 명령을 순서대로 실행하는 프로그램이다. 반면에 이벤트 기반 프로그램은 이벤트가 발생할 때마다 그에 대한 응답을 실행하는 프로그램이다.
장점 :
- 확장성: 이벤트 기반 프로그램은 새로운 이벤트를 쉽게 추가할 수 있다.
- 효율성: 이벤트 기반 프로그램은 순차적 프로그램에 비해 메모리와 CPU를 효율적으로 사용할 수 있다.
- 견고성: 이벤트 기반 프로그램은 순차적 프로그램에 비해 장애에 강하다.
참고자료
https://luv-n-interest.tistory.com/1113
https://velog.io/@virtualplastic/Spring-%EC%A0%9C%EC%96%B4%EC%9D%98-%EC%97%AD%EC%A0%84-IOC-Inversion-of-Control