IoC = 제어의 역전
DI = 의존성 주입
이라는 것을 기억하고 아래의 예시를 보자!
new 키워드
를 사용하면, 개발자가 직접 heap이라는 메모리에 Object를 생성하는 것이다.
-> 주도권이 개발자에게 존재
"method1의 의자"와 "method2의 의자"는 같지 않다.
각 메서드가 본인들의 의자 객체의 주소를 관리하게 된다.
이렇게 되면 하나의 메서드 내부에서는 객체를 공유할 수 있으나, 다른 클래스나 메서드에 객체를 공유하는 것이 어려워진다.
상상해보자.
method1에 있는 의자 객체를 method2나 다른 클래스와 공유하려면, 매개변수로 넘겨 주거나 클래스를 import 해줘야 할 것이다.
그렇게 수많은 변수를 공유하기 시작한다면, 매우 귀찮을 것이다.
이런 불편한 점을 Spring IoC가 해결해준다.
Spring은 개발자가 생성해둔 여러 클래스들을 모두 읽어서 한 메모리 공간에 올려준다.
=> Spring IoC
이때, 메모리에 올려두었기 때문에 해당 Object들은 메서드에서 관리하는 것이 아니라 Spring에서 관리하게 된다.
=> 원래는 주도권이 개발자에게 있었는데, 이제는 Spring에게 존재함
=> 제어의 역전
IoC를 통해서, 메모리(heap)에 Object를 올려줬다면 해당 Object들을 공유해서 사용할 수 있도록 해주는 것이 DI이다.
의자 객체는 method1, method2, method3에 공유될 수 있으며 한 번만 생성된 Object가 여러 곳에서 사용되는 것이므로 싱글톤이다.