HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🤩
개발
/
Spring
Spring
/
🎧
Spring Framework 핵심개념(Core)
/
🌒
ApplicationContext(Spring에서의 IoC 컨테이너)
🌒

ApplicationContext(Spring에서의 IoC 컨테이너)

ApplicationContext (Spring에서의 IoC Container)BeanFactory와 ApplicationContext의 차이점BeanConfiguration MetadataApplicationContext 생성 코드(Java 기반 Configuration metadata)ApplicationContext를 CustomClass에서 이용하기 위해서는? → ApplicationContextAware interface를 구현

ApplicationContext (Spring에서의 IoC Container)

notion image
  • 일종의 IoC 컨테이너임
  • 어떠한 클래스를 사용할 것인지 레지스터 해주면, 생명주기를 Managing하면서 객체를 만들어줌
  • 스프링에서는 이런 IoC 컨테이너를 ApplicationContext 인터페이스로 제공을 함

BeanFactory와 ApplicationContext의 차이점

notion image
  • https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-introduction — BeanFactory에 비해 추가된 기능들 설명(BeanFactory interface 를 상속받음)
    • Spring AOP feature들과의 쉬운 통합
    • Message resource handling (for use in internationalization)
    • Event publication
    • Application-layer specific contexts such as the WebApplicationContext for use in web applications.
  • BeanFactory는 configuration framework와 basic functionality를 제공
  • ApplicationContext는 enterprise-specific functionality 를 더함

Bean

  • BeanFactory, IoC Container에 의해 관리되어지는 객체를 말함
  • 우리가 일반적으로 자바에서 객체를 만들면 JVM에 올라갈 건데, 여기서 IoC에서 관리되는 객체와 아닌 객체를 구분하기 위해 Bean이라는 용어 도입한 것

Configuration Metadata

  • 스프링의 ApplicationContext는 실제 만들어야 할 정보를 Configuration Metadata(설정 메타데이터)로부터 받아옴
  • 이 메타데이터를 이용해서 IoC 컨테이너에 의해 관리되는 객체들을 생성하고 구성함
  • 어플리케이션에서 객체들의 도면이라고 볼 수 있음
  • Configuration Metadata를 XML 기반으로 하는 경우 GenericXmlApplicationContext를 구현체로 사용하여 ApplicationContext를 구현(요즘에는 자바 기반으로 많이 작성한다고 함 — @Configuration)
  • JAVA 기반 ⇒ AnnotationConfigApplicationContext 구현체를 이용

ApplicationContext 생성 코드(Java 기반 Configuration metadata)

@Configuration public class AppConfiguration { @Bean public VoucherRepository voucherRepository(){ return new VoucherRepository() { @Override public Optional<Voucher> findById(UUID voucherId) { return Optional.empty(); } }; } @Bean public OrderRepository orderRepository(){ return new OrderRepository(){ @Override public void insert(Order order) { } }; } @Bean public VoucherService voucherService(){ // voucherService(VoucherRepository voucherRepository) 의 형태로 작성해도 // IoC container가 알아서 Dependency resolution을 진행해줌(VoucherRepository가 // Bean으로 선언되어 있기 때문에 return new VoucherService(voucherRepository()); } @Bean public OrderService orderService(){ return new OrderService(voucherService(), orderRepository()); } } // client code AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfiguration.class); var orderService = applicationContext.getBean(OrderService.class);

ApplicationContext를 CustomClass에서 이용하기 위해서는? → ApplicationContextAware interface를 구현

public class ApplicationContextProvider implements ApplicationContextAware{ private static ApplicationContext context; public static ApplicationContext getApplicationContext() { return context; } @Override public void setApplicationContext(ApplicationContext ac) throws BeansException { context = ac; } }
  • 위와 같이 ApplicationContextAware를 implements하게 되면, spring boot 가 시작되면서 bean을 생성하고 ApplicationContextAwareProcessor에서 invokeAwareInterfaces를 부르면서 setApplicationContext를 불러줌으로써 ApplicationContext 값이 주입되게 됨
  • 그렇게 되고 나면 ApplicationContextProvider.getApplicationContext 메서드로 context에 대해 접근이 가능함