@SpringBootApplication
public class KioskApplication implements CommandLineRunner {

    private Kiosk kiosk;

    @Autowired
    public KioskApplication(Kiosk kiosk) {
        this.kiosk = kiosk;
    }

    public static void main(String[] args) {
        SpringApplication.run(KioskApplication.class, args);
    }

    @Override
    public void run(String... args) {

        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

        // (2) 빈 조회
        DiscountPolicy discountPolicy = applicationContext.getBean("discountPolicy", DiscountPolicy.class);
        Printer printer = applicationContext.getBean("printer", Printer.class);
        Kiosk kiosk_check = applicationContext.getBean("kiosk", Kiosk.class);

        --- 생략 ---

(1) 스프링 컨테이너 생성

앞에서 프로그램을 스프링 전환하는 과정에서 간략하게 언급했던 것처럼, ApplicationContext 인터페이스를 일반적으로 스프링 컨테이너라고 부릅니다.

좀 더 정확하게는 스프링 컨테이너를 말할 때 ApplicationContext가 상속하고 있는 BeanFactory와 구분해서 사용하지만, BeanFactory를 직접 사용하는 경우는 거의 없기 때문에 일반적으로 ApplicationContext를 스프링 컨테이너라 합니다.

uPJd6R0lgKMxdMflo6EJP-1681349321878.png

참고로, BeanFactory는 스프링 컨테이너의 최상위 인터페이스로 스프링 빈을 관리하고 조회하는 역할을 담당합니다. 곧 뒤에서 보게 될 getBean() 메서드를 제공하는 주체도 바로 BeanFactory입니다.

그렇다면 BeanFactory 인터페이스를 상속하고 있는 ApplicationContext는 BeanFactory와 무엇이 다

를까요?

1QXhpIsoIwhg3BPPM75DV-1681349364428.png

여러분들의 인텔리제이에서 ApplicationContext 인터페이스에 대한 정보를 찾아보면, 이 사실을 직접 확인할 수 있습니다.

위의 그림에서 확인할 수 있는 것처럼 ApplicationContext는 BeanFactory로부터 확장된 인터페이스뿐만 아니라 EnvironmentCapable, MessageSource, ApplicationEventPublisher, ResourcePatternResolver 등 다양한 기능의 인터페이스들을 상속받아 사용하고 있습니다. 이러한 인터페이스들은 환경 변수 설정, 메시지 국제화 기능, 이벤트 발생, 리소스 조회 등 다양한 기능들을 지원합니다.

정리하면, ApplicationContext는 빈을 관리하고 조회하는 기능뿐 아니라 웹 애플리케이션을 개발하는 데 필요한 다양한 부가 기능들을 함께 제공합니다.