객체로 인해 책임과 역할을 나눌 수 있어 유지 보수 하기가 쉬워진다.
의존성 주입(DI)은 일체형과 조립형이 있고. 일체형은 클래스 객체 간 높은 결합도를 가지고 있고 조립형은 인터페이스를 이용해 클래스 간 낮은 결합도를 가지고 있다. 조립형은 객체를 부품처럼 쉽게 변경해 끼울 수 있지만 추가적인 로직을 생성해야 한다. 빈 객체를 생성해야 하고(var a = A(), var b = B() ) 의존성이 있는 두 객체를 연결할 새로운 로직(a.setB(b))을 생성한다. 전제조건이 객체를 생성해야한다는 것이다.
스프링에서는 조립에 대한 방향성만 설정해준다면 자동 조립이 가능하다.
스프링은 지정된 어노테이션을 가지고 순서대로 조립하기 시작한다. 조립하는 이 공간을 IoC 컨테이너라고 한다.
제어의 역전(IoC)은 일반 의존성 주입의 진행 순서와는 다르게 작은 부품부터 조립해나간다.
만들어지는 크기의 순서는 가장 작은 부분과 그 다음 좀 더 큰 부분이 결합되고 이후 더 크기가 큰 부분이 결합되는 방식이다.
일체형 프로그램 DI의 순서는 A,B,C,D 순으로 정방향으로 진행된다. A 객체가 생성되면 B가 만들어지고 , 이후 C가 생성되고, 마지막으로 D가 생성된다. 전제 조건이 이전 객체가 생성되어야한다는것이다.
결합형 프로그램 DI의 순서는 D,C,B,A 순으로 역방향으로 진행된다. D가 만들어진 다음에 결합되고 C가 만들어진 다음에 결합되는 순서이다. IoC 컨테이너라고 하는 이유가 이것 때문이다.
이 공간이 역순으로 객체를 생성하는 컨테이너라는 뜻이다. 이 컨테이너를 스프링이 가지고 있다.
IoC 컨테이너는 빈으로 지정된 객체의 생성부터 소멸까지 관리한다. 생성자 주입으로 컨트롤러에 서비스를 주입하고 서비스 구현 파일에 레포지토리를 주입하게 된다면 스프링이 알아서 컨트롤러 - 서비스 - 레포지토리를 결합해 하나의 인스턴스를 자동 생성해준다. 컨트롤러가 서비스 방향을 바라보고 있고 서비스는 레포지토리 방향을 바라보며 호출하고 있다. 이로 인해 Todo Application 기능들이 실행 가능한 것이다.