지난 시간 우리는 DI 주입에 대해서 알아보았다. 그럼 Spring 프레임워크를 사용하여 어떻게 더 편리하게 DI 를 주입하여 올바른 소프트웨어를 구현할 수 있을까? 오늘은 Spring Container가 무엇이고 어떻게 의존성을 주입하는지 알아보자!
사실 Spring Container 라는 용어는 다른 용어로도 대체가 가능하다. DI컨테이너, IOC 컨테이너로도 불리는데 상황에 따라 이 세 용어가 서로 대체해서 사용된다.
DI 컨테이너: 객체 간의 의존성을 주입하는 역할을 강조하는 용어로 사용.
IOC 컨테이너: 객체의 생명주기와 제어 흐름을 애플리케이션 코드 대신 컨테이너에 위임하는 개념을 강조. 스프링은 이러한 IOC 컨테이너 역할도 수행한다.
구현체를 외부에서 주입하는 AppConfig Class에 메소드들을 Bean으로 등록한 뒤 스프링 컨테이너를 살펴보자!
public class AppConfig{
@Bean
public MemberService memberService(){
System.out.println("call AppConfig.memberService");
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
System.out.println("call AppConfig.memberRepository");
return new MemorymemberRepository();
}
@Bean
public OrderService orderService(){
System.out.println("call AppConfig.orderService");
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
//return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}

스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI) 한다.
빈 이름은 메서드 이름을 디폴트로 사용한다
빈 이름을 직접 부여할 수 있다.
또한, Bean 이 무엇이 있는지 직접 조회도 가능하다! Bean 객체 중 부모 타입의 Bean을 조회하면 자식 타입도 함께 조회한다. 모든 객체의 어머니인 Object 타입으로 조회하면 모든 스프링 Bean을 조회한다.


다이어그램을 보면 BeanFactory 등 다양한 클래스를 상속하는 것을 볼 수 있다.