
IoC는 애플리케이션의 제어권을 개발자(코드)가 아닌 프레임워크나 컨테이너가 담당하도록 위임하는 설계를 말합니다. 특히, Spring은 이러한 설계를 기반으로 동작하는 대표적인 프레임워크입니다.
IoC 컨테이너는 Bean 생명주기 관리, 의존성 주입 등 애플리케이션의 제어권을 개발자가 아닌 프레임워크가 수행하기 위해 존재하는 도구입니다. Spring 프레임워크에서는 이를 구현하기 위해 BeanFactory, ApplicationContext 등의 인터페이스를 제공합니다.
Spring은 IoC 컨테이너를 구현하기 위해 BeanFactory, ApplicationContext와 같은 인터페이스를 제공하며 클래스 다이어그램은 다음과 같습니다.

BeanFactory는 Spring IoC 컨테이너의 가장 기본적인 최상위 인터페이스로 최소 기능인 Bean 생명주기 관리를 제공합니다. 또한, 대표적인 구현체인 DefaultListableBeanFactory는 Spring IoC 컨테이너의 핵심 클래스 중 하나로 ApplicationContext에서 내부적으로 사용됩니다.
ApplicationContext는 최상위 인터페이스인 BeanFactory를 확장하여 이벤트 처리, AOP, 환경 설정 관리 등 추가 기능을 제공하는 인터페이스입니다. 실제로 대부분의 Spring Framework 기반 애플리케이션에서 ApplicationContext를 사용하고 있습니다. 또한, 설정 파일 종류에 따라 여러 구현체가 존재합니다
두 인터페이스의 차이를 살펴보면 다음과 같습니다.
BeanFactory는 Lazy Loading 방식으로 Bean을 요청 시점에 생성ApplicationContext는 Eager Loading 방식으로 컨테이너 초기화 시점에 모든 Bean 생성BeanFactory는 Bean 생명주기 관리와 같은 최소 기능 제공ApplicationContext는 AOP, 이벤트 처리, 국제화, 환경 설정 관리 등 추가 기능도 제공아래는 위 개념을 공부하면서 추가 학습이 필요할 것 같은 내용들입니다. 이 내용들은 차차 정리하여 링크를 달도록 하겠습니다.
IoC는 애플리케이션의 제어권을 개발자가 아닌 프레임워크가 담당하도록 위임하는 설계를 말합니다.
Spring의 경우 IoC를 구현하기 위해 IoC 컨테이너 사용하며 이를 위해 IoC 컨테이너 구현체인 BeanFactory, ApplicationContext와 같은 인터페이스를 제공합니다.
가장 큰 차이는 Bean을 생성하는 타이밍입니다.
BeanFactory의 경우 Lazy Loading 방식으로 필요한 순간에 생성을 하지만, ApplicationContext의 경우 Eager Loading 방식으로 컨테이너 초기화 시점에 모든 Bean을 미리 생성합니다.
또한, ApplicationContext는 BeanFactory가 지원하는 Bean 생명주기 관리 기능을 포함하여 AOP, 국제화, 환경 설정 관리, 이벤트 처리 등의 기능을 추가 지원합니다.