실행시점에 클래스 간의 관계가 형성되어 의존성을 낮춘다.
의존성이 삽입된다는 의미로 IoC를 DI라고도 표현한다.
1. 재사용성을 높여준다.
2. 테스트에 용이하다.
3. 코드를 단순화 시켜준다.
4. 사용하는 이유를 파악하기 수월하고 코드가 읽기 쉬워진다.
5. 종속성이 감소하기에 변경에 민감하지 않다.
6. 결합도(coupling)는 낮추면서 유연성과 확장성을 향상 시킬 수 있다.
7. 객체관의 의존관계를 설정할 수 있다.
스프링 IoC컨테이너(ApllicationContext, BeanFactory)가 관리하는 객체이다.
스프링은 Bean의 의존성을 관리하고, 객체를 만들고, 등록해주며 관리한다.
빈으로 등록되면 의존성 관리가 수월해지고 싱글톤 형태가 된다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfig {
@Bean
public BookRepository bookRepository() {
return new BookRepository();
}
@Bean
public BookService bookService() {
BookService bookService = new BookService();
bookService.setBookRepository(bookRepository());
return bookService;
}
}
ApplicationConfig라는 자바파일을 만든 뒤 @Configuration
으로 빈을 등록할 곳에 @Bean
어노테이션과 함께 코드를 작성하면 빈으로 등록이 된다.
하나하나 Bean으로 등록해야 하기에 번거롭다.
스프링 부트는 어노테이션을 통해 Bean을 설정하고 주입받는 것을 표준으로 삼는다.
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackageClasses = DemoApplication.class)
public class ApplicationConfig {
}
@ComponentScan이라는 어노테이션을 사용하고 현재 패키지를 적어주면 패키지 아래에 있는 빈으로 등록해야 할 어노테이션을 찾아 전부 빈으로 등록해 준다.
@Componet, @Service, @Repositroy, @Controller, @RestController 어노테이션을 찾아서 Bean으로 등록해 준다.
스프링 부트에서는 ApllicationContext를 직접 만들어 사용할 필요 없이 @SpringBootApplication이라는 어노테이션 때문에 @ComponentScan등을 편리하게 사용할 수 있다.