간략히 말하자면 프로그램의 제어 흐름 구조가 바뀌는 것(개발자 -> 프레임워크)
일반적인 구조는 모든 종류의 작업을 사용하는 쪽(개발자)에서 제어하는 구조
이에 반하여 IoC는 제어 흐름의 개념을 거꾸로 뒤집음 오브젝트는 자신이 사용할 오브젝트를 스스로 생성하거나 선택하지 않고 자신이 어떻게 만들어지고 어디서 사용되는 지 알 수 없다.
모든 제어 권한을 자신이 아닌 다른 대상에게 위임
프로그램 시작을 담당하는 main()같은 엔트리 포인트를 제외하면 모든 오브젝트는 이런 방식으로 위임받은 제어 권한을 갖는 특별한 오브젝트에 결정되고 만들어짐
Spring에서는 일반적인 Java 객체를 new 키워드를 통해서 생성하고 이를 개발자가 관리하는 것이 아니라 Spring Container에게 모두 맡긴다.
저장소에 저장되어 있는 빈에 접근하기 위해 개발자들이 컨테이너에서 제공하는 API를 이용하여 사용하고자 하는 빈을 검색하는 것
각 계층 사이, 각 클래스 사이에 필요로 하는 의존 관계를 컨테이너가 자동으로 연결
각 클래스 사이의 의존 관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결
이를 통해서 코드를 의존성으로 부터 격리시켜 코드 테스트에 용이하고, 코드를 확장하거나 변경 할 때 영향을 최소화 한다.
DL은 사용 시 컨테이너 종속성 증가, 그러므로 DI를 사용
인자가 없는 생성자나 인자가 없는 static factory 메소드가 bean을 인스턴스화 하기 위하여 호출된 후 bean의 setter 메소드를 호출하여 실체화 하는 방법
(set 방식으로 의존성을 주입하는 방식인 것 같다.)
장점
생성자를 이용하여 클래스 사이의 의존 관계를 연결
장점
단점
Singleton 인스턴스와 Non Singleton 인스턴스의 의존 관계를 연결시킬 필요가 있을 경우 사용
많이 사용하지 않음