오늘은 ApplicationContext에 대해 알아보는 시간을 가지겠다. ApplicationContext가 무엇이며 어떠한 역할을 하는지 알아보겠습니다.
ApplicationContext의 역할을 안다면 정말 이 친구가 서비스 개발시 이해하기 가장 빡센 놈이겠거니 싶습니다. 들어가기 이전에 ApplicationContext는 Spring IOC랑 관련있으니 Spring IOC란?을 한 번 읽고 오시는걸 추천드립니다.
Spring IOC Container는 다음과 같이 동작합니다.
Spring IOC Container 동작과정
다음 다이어그램을 보면 Spring IOC Container가 어떻게 동작하는지 알 수 있습니다.
어플리케이션을 실행할 경우, 기본적으로 구성 메타데이터(xml)와 POJOs를 Spring IOC Container에서 읽어 Bean을 생성하고 해당 Bean들을 통해 시스템을 사용할 수 있도록 구성합니다.
이 때, Bean을 생성하고 관계설정과 같은 제어역할을 담당하는 것이 BeanFactory입니다. BeanFactory는 스프링의 최상위 인터페이스이며 Spring IOC Container의 기본 요소입니다.
ApplicationContext는 이런 BeanFactory를 상속받아 구현되어졌다. 한 번 코드를 통해 확인해보겠습니다.
ApplicationContext.java
package org.springframework.context;
import org.springframework.beans.factory.HierarchicalBeanFactory;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.core.env.EnvironmentCapable;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.lang.Nullable;
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
@Nullable
String getId();
String getApplicationName();
String getDisplayName();
long getStartupDate();
@Nullable
ApplicationContext getParent();
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
ApplicationContext는 다음과 같이 구현되어져 있으며 그냥 봐도 상속받은 인터페이스가 꽤나 된다는 것을 알 수 있습니다.
상속받는 인터페이스 목록
하나하나씩 설명하면 매우 길어지니 짧게 요약하겠습니다. 대표적으로 BeanFactory의 기능을 상속받았으며 ApplicationEventPublisher(이벤트),ResourcePatternResolver(설정 정보 처리) 등을 추가로 상속 받습니다.
결국 ApplicationContext의 역할은 BeanFactory가 담당하는 Bean을 생성하고 관계설정과 같은 제어역할 뿐만 아니라 설정 정보를 통해 제어까지 담당하는 것을 알 수 있습니다.
이는 ApplicationContext = Spring IOC Container의 역할을 수행하고 있음을 의미합니다. 실제로 클라이언트가 Spring Application에 요청을 할 경우 어떤 기능을 수행하는지 다음을 처리 과정을 통해 알아봅시다.
Bean 요청시 처리 과정
Spring에서는 빈의 생성과 관계설정 같은 제어를 담당하는 IoC(Inversion of Control) 컨테이너인 빈 팩토리(BeanFactory)가 존재합니다. 하지만 이것만으로는 서비스에서 요구하는 다양한 기능들을 수용하기에 다소 무리가 있습니다. 따라서 ApplicationContext라는 인터페이스를 만들어 개발자의 Bean을 생성하고 제어하는 것뿐만 아니라 설정 정보들을 이용한 Bean간의 관계 설정, 제어 작업 등 추가적인 기능을 수행할 수 있도록 하였습니다.
이로서 ApplicationContext가 어떤 기능을 수행하고 있는지 확인해보았습니다. 다음은 Spring AOP에 대해 알아보는 시간을 가지겠습니다.
[Spring] 애플리케이션 컨텍스트(Application Context)와 스프링의 싱글톤(Singleton)