제어의 역전(IoC, Inversion of Control)이란? → 프레임워크가 프로그램에 대한 제어 흐름을 가져간다?!(Like AppConfig) → 프로그램은 어떤 흐름인지 모름! 프레임워크가 제어흐름을 관리함! → 그래서 흐름의 제어가 역전됌.

프레임워크 vs 라이브러리

프레임워크가 내가 작성한 코드를 제어하고, 그걸 대신 실행한다면 프레임워크가 맞다(JUnit, Test의 흐름)

반면 내가 작성한 코드가 제어의 흐름을 담당한다면 라이브러리임!

의존관계 주입(DI, Dependency Injection)이란? → 런타임시에 원하는 객체를 외부에서 주입해주는 것! 지금까지 배운건 생성자 주입!!

→ 정적인 클라이언트 의존관계를 변경하지않고(import 한 인터페이스들) 동적인 의존관계를 변경할 수 있다!(구현체들) → 다이어그램 변경 안해도 됌!!!!

이걸 둘다 연결해주는 것을 IoC 컨테이너 , DI 컨테이너라고 함 like AppConfig

IoC는 굉장히 범용적이라, 의존관계 주입에 초점을 주어 DI 컨테이너 라고함! → 컨테이너가 거창한게 아니네~ → 다른 용어로 어셈블러(조립해준단 느낌) 오브젝트 팩토리(오브젝트를 만들어주는 친구)

스프링에서 이러한 DI컨테이너에 @Configuration 붙혀줌!

각 의존성 주입과 역할(구현메서드)를 정해주는 메서드에 @Bean 붙혀주면 스프링 컨테이너 @Bean 붙혀진 메서드들을 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다! 이것들이 스프링 bean들!

AppConfig같이 내가 만든 커스텀 DI 컨테이너를 스프링은 ApplicationContex라는 인터페이스로 스프링 컨테이너를 관리함. ApplicationContext = 스프링 컨테이너

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);