IoC는 프로그램의 제어 흐름을 개발자가 아닌 외부가 관리하도록 하는 설계 원리이다. 일반적인 프로그램은 객체를 직접 생성하고 호출하지만 IoC를 적용하면 객체의 생성, 의존성 주입, 생명주기 관리 등을 컨테이너가 담당하게 된다.
OrderService orderService = new OrderService();
orderService.placeOrder();
일반적인 프로그램은 객체를 직접 생성하고 메서드를 호출한다.
@Service
public class OrderService {
private final PaymentService paymentService;
@Autowired
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
OrderService는 PaymentService 객체를 직접 생성하지 않고도 @Autowired를 통해 필요한 객체를 주입받는 것을 확인할 수 있다.
이렇게 되면, 객체 간 결합도는 낮추고 유지보수성을 높일 수 있다.
Spring에서는 IoC를 DI(의존성 주입) 형태로 구현한다. 객체가 필요로 하는 의존성을 외부에서 주입받는 것이다.
@AutowiredsetXXX()위와 같은 방법들을 많이 사용한다.
DI와 IoC에 대해 혼동을 방지하기 위해 표로 정리하면 다음과 같다.
| 구분 | IoC (제어의 역전) | DI (의존성 주입) |
|---|---|---|
| 개념 | 객체 제어 흐름을 프레임워크로 위임하는 설계 원리 | IoC를 구현하기 위한 구체적인 기술 |
| 관심사 | “누가 제어권을 가지는가?” | “의존 객체를 어떻게 제공받는가?” |
| 역할 | 애플리케이션 전체의 제어 구조를 관리 | 클래스 간의 의존 관계를 주입 |
| 구현 주체 | 프레임워크 (예: Spring IoC Container) | 개발자 / 프레임워크의 주입 메커니즘 |
| 예시 | Spring Container가 객체를 생성 및 관리 | @Autowired, 생성자 주입, setter 주입 등 |