IOC란, 프로그램을 구동하는데 필요한 객체에 대한 생성, 변경 등의 관리를 프로그램을 개발하는 사람이 아닌 프로그램을 구동하는 컨테이너에서 직접 관리하는 것을 말함
스프링은 IOC를 통해 구동 시 필요한 객체의 생성부터 생명 주기까지 해당 객체에 대한 관리를 직접 수행한다.
개발자가 직접 객체를 생성할 수 있지만 해당 권한을 컨테이너에 맡김으로써 소스 코드 구현의 시간을 단축할 수 있다.

💡 서버 실행 시 Spring Container가 Component Scan(Bean Scanning) 을 수행하여
@Component, @Repository, @Service, @Controller 어노테이션이 붙은 클래스를 모두 찾아 Bean으로 등록(객체로 생성)
Spring Legacy Project는 <context:component-scan> 태그
Spring Boot Project는 @CompnentScan 어노테이션을 이용해 기능 수행
DI란, IOC 구현의 핵심 기술로
IOC를 통해 Spring이 생성하고 관리하는 Bean(객체)을
필요한 곳에 주입하는 것
(객체 생성을 개발자가 아닌 Spring에게 의존하고 생성된 객체를 개발자라 필요한 곳에 주입 하는 것)
이렇게 의존석을 주입 받게 되면 이후 해당 객체를 수정해야 할 상황이 발생했을 때 소스 코드의 수정을 최소화 할 수 있음
객체간의 종속 관계(결합도)를 약화 시킬 수 있음
(결합도: 한 클래스에서 필드 객체를 생성할 때 발생하는 구 객체간의 관계, 각 객체간의 내용이 수정될 경우 영향을 미치는 정도! )
