스프링 컨테이너
스프링 컨테이너는 스프링에서 객체를 관리, 제공하는 역할을 한다.
스프링 컨테이너 생성 과정
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext();
ApplicationContext
는 스프링 컨테이너 역할을 하며, 스프링 프레임워크의 인터페이스 중 하나이다.AnnotationConfigApplicationContext
는ApplicationContext
의 구현체인 클래스인데, 이름 그대로Annotation
기반의config
를 토대로 스프링 애플리케이션 컨텍스트를 구성한다는 의미이다.
위의 코드는 컨테이너가 파라미터 없이 생성된 상태로, 아무 빈도 등록되어 있지 않기 때문에 getBean()
메서드를 호출하여 빈을 가져오면 예외가 발생할 수 있다. 보통은 파라미터로 설정 정보를 지정하고 스프링 컨테이너를 생성할 때 파라미터로 넘어온 설정 클래스 정보를 사용하여 스프링 빈을 등록한다.
// AppConfig.java
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemberMemoryRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}
위와 같이 AppConfig.java
파일이 존재할 때,
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
AnnotationConfigApplicationContext
생성시 파라미터로 구성 정보를 지정해주면 스프링 컨테이너가 생성되면서 AppConfig.class
의 정보들을 사용하여 스프링 빈을 등록한다. 이때 스프링 컨테이너는 구성 정보를 토대로 스프링 빈 의존성을 주입한다. 위의 AppConfig
를 토대로 의존성을 주입하면,
memberService <- memberRepository
: memberService 가 memberRepository 에 의존한다.orderService <- memberRepository, discountPolicy
: orderService 가 memberRepository, discountPolicy 에 의존한다.
스프링 컨테이너는 빈을 생성하고 관리하는 역할을 하며, 빈이 생성되고 소멸되기까지의 생명 주기를 관리한다.
빈 팩토리
ApplicationContext
를 살펴보면 BeanFactory
를 포함한 다양한 인터페이스를 상속받았음을 알 수 있다.
Spring 프레임워크에서 빈 팩토리는 Spring IoC(Inversion of Control)
컨테이너의 최상위 인터페이스 중 하나로, 애플리케이션에서 관리되는 객체인 빈(bean)
을 생성하고 관리하는 역할을 한다. 즉, ApplicationContext
가 빈 팩토리를 상속받았기 때문에 빈 관리 기능을 제공하는 것이다.
스프링 빈
스프링 빈은 스프링에서 제공해주는 객체로, 스프링 컨테이너가 생성하고 관리한다.
빈 등록 방식
스프링은 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정, Annotation 등 다양한 방법을 제공하는데, 이때 BeanDefinition
을 사용한다. BeanDefinition
은 스프링 컨테이너가 관리하는 객체의 메타데이터를 담고 있는 인터페이스이다. 이를 통해 스프링은 빈의 생성, 초기화, 의존성 주입 등을 수행할 수 있다.
스프링 컨테이너는 추상화된 BeanDefinition
를 기반으로 스프링 빈을 생성하기 때문에 설정 형식은 알 필요가 없다.
AnnotationConfigApplicationContext
는AnnotatedBeanDefinitionReader
를 사용해서 파라미터로 지정된 구성 정보를 읽고BeanDefinition
을 생성한다.- 동일한 방식으로, 새로운 형식의 설정 정보가 추가되면,
~BeanDefinitionReader
를 만들어서BeanDefinition
을 생성하면 된다.