IoC란 제어의 역전이라는 뜻이다. 말 그대로 제어의 흐름이 바뀐것이다.
기존의 객체 지향 프로그래밍에서는 객체가 필요한 다른객체를 직접 생성하였다.
public class OrderService {
private PaymentService paymentService = new PaymentService();
}
예를 들어, 위 코드에서는 OrderService내부에서 PaymentService를 생성하고 관리하게 된다. 이를 정방향 제어라고 부른다.
하지만, 스프링에서는 객체의 생성과 관리를 개발자가 하지 않고, 스프링에서 해주는 파트가 존재한다.
이러한 경우 PaymentService객체는 개발자가 직접 생성하지 않고 Spring 컨테이너가 객체를 생성한 뒤 필요한곳에 전달해주게 된다.
DI는 IoC를 구현하는 대표적인 방법이다.
public class OrderService {
private PaymentService paymentService = new PaymentService();
}
기존 방식에서는 new PaymentService();를 사용하여 직접 객체를 생성하였지만, DI에서는 외부에서 필요한 객체를 생성한 뒤 주입해준다.
@RequiredArgsConstructor
@Service
public class OrderService{
private final PaymentService paymentService;
}
위와 같이, 자연스럽게 CRUD 코드를 작성하면서 사용했던 @RequiredArgsConstructor 어노테이션이 DI의 예시이다.
Spring은 PaymentService 객체를 생성한 뒤 OrderService 생성자에 전달한다.
이처럼 객체가 내부에서 직접 의존 객체를 생성하지 않고 외부에서 전달받는것을 DI(의존성 주입)라고 한다.