IOC(제어의 역전) DI(의존성 주입)은 큰 큐모의 어플리케이션에서 개발자가 객체의 생명주기, 의존성 관리에 어려움을 격는 것을 해결하기 위해 등장한 개념입니다.
프레임워크, 어플리케이션에 객체 생명주기, 의존성을 위임하고 개발자는 제공받은 객체를 사용하기만 하면 됩니다.
아래는 express에서 수동으로 container에 객체들을 넣어주는 부분입니다.
export default ({ mongoConnection, models }: { mongoConnection; models: { name: string; model: any }[] }) => {
try {
models.forEach(m => {
Container.set(m.name, m.model);
});
const agendaInstance = agendaFactory({ mongoConnection });
const mgInstance = new Mailgun(formData);
Container.set('agendaInstance', agendaInstance);
Container.set('logger', LoggerInstance);
Container.set('emailClient', mgInstance.client({ key: config.emails.apiKey, username: config.emails.apiUsername }));
...
};
Spring bean은 IOC container에 의해 초기화, 관리되는 객체입니다.
Spring은 모든 객체를 bean으로 관리하지 않고 bean 설정이 되어있는 객체들만 bean으로 관리합니다.
빈설정은 아래와 같이 합니다.
<bean id="myBean" class="com.example.MyBean">
<property name="myDependency" ref="myDependencyBean"/>
</bean>
<bean id="myBean" class="com.example.MyBean" autowire="byType"/>
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
@Component, @Controller, ...@Conditional 어노테이션을 통해 특정 조건에 따라 bean 정의가 가능합니다.Spring은 다른 설정이 있지 않는 한 Singletone으로 관리합니다.
대표적인 Bean scope
Bean의 초기화화 소멸시점은 보통 Spring application의 초기화, 소멸시점과 같습니다.
@PostConstruct: Bean 초기화 시점에 호출@PreDestroy: Bean 소멸시점에 호출Spring에서 bean을 등록하는 방법은 크게 5가지 과정으로 수행됩니다.
ClassPathBeanDefinitionScanner
클래스패스에서 @Component, @Service, @Repository, @Controller 어노테이션이 붙은 클래스를 스캔하여 빈 정의를 생성하고, 이를 스프링 컨테이너에 등록합니다.
1~3 단계를 동시에 수행합니다.
ClassPathScanningCandidateComponentProvider