스프링이 다른 프레임워크와 차별화되어 제공하는 의존 관계 주입기능을 말한다.
객체를 직접 생성하는게 아닌, 외부에서 생성한 후 주입 시켜주는 방식이다.
이를통해 모듈간의 결합도가 낮아지고 유연성이 높아진다.
제어의 역전이라는 의미로 , 메소드나 객체의 호출작업을 개발자가 결정하는것이 아니라, 외부에서 결정되는것을 의마한다.
객체의 의존성을 역전시켜 객체간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성과 코드중복, 유지보수를 편하게 할 수 있게 한다.
주요 등장개념
1. Spring Container
2. IoC Container
Container
인스턴스의 생명주기를 관리하며 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것.
즉 개발자가 작성한 코드의 처리과정을 위임받은 독립적 존재이다.
적절한 설정만 되어 있다면 누구의 도움 없이도 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 컨트롤해준다.
이때 Spring Container에서 생성되는 개체를 Bean이라 한다.
Bean은 Spring IoC Container가 관리하는 자바 객체, Spring Bean Container에 존재하는 객체를 말한다.
Spring IoC(Inversion of Control) Contatiner에 의해 인스턴스화, 관리, 생성된다.
Bean Container는 의존성 주입을 통해 Bean 객체를 사용할 수 있도록 해준다.
Spring에서 Bean은 보통 Singleton으로 존재한다.
Singleton : 어떤 Class가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 객체를 만들어 사용하는 디자인 패턴
Spring IoC Container가 IoC Container를 만들고 그 안에 Bean을 등록할때 사용하는 Interface들을 Life Cycle Callback이라고 부른다.
Life Cycle Callback 중에는 @Component이 붙어있는 모든 Class의 Instance를 생성해 Bean으로 등록하는 작업을 수행하는 Annotation Processor가 등록 돼있다.
Instance : 일반적으로 실행 중인 임의의 프로세스, 해당 클래스의 구조로 컴퓨터 저장공간에서 할당되어 현재 생성된 Object를 의미.
이때, @ComonentScan Annotation이 붙어있는 Class가 이에 해당한다.
즉, @ComponentScan, @Component Anotation을 사용해서 Bean을 등록하는 방법이다.
@ComponentScan은 어느 지점부터 Component를 찾으라고 알려주는 역할을 하고,
@Component는 실제로 찾아서 Bean으로 등록할 Class를 의미한다.
@ComponentScan은 @Component이 부여된 Class를 찾아 자동으로 Bean으로 등록해주는 역할을 한다.
@ComponentScan이 붙어있는 Class가 있는 package에서부터 모든 하위 package의 모든 Class를 찾아 다니며,
@Component나 @Component를 사용하는 다른 Annotation을 사용하는 Class를 찾는다.
EX) Stereotype Annotation(@Controller, @Service, @Repository 등)
Stereotype Annotation들은 내부적으로 @Component Annotation을 사용한다.