Spring Boot - ApplicationContext에 대해 알아보자.

겔로그·2022년 8월 6일
2

Spring Boot

목록 보기
8/21
post-thumbnail

개요

오늘은 ApplicationContext에 대해 알아보는 시간을 가지겠다. ApplicationContext가 무엇이며 어떠한 역할을 하는지 알아보겠습니다.

ApplicationContext의 역할을 안다면 정말 이 친구가 서비스 개발시 이해하기 가장 빡센 놈이겠거니 싶습니다. 들어가기 이전에 ApplicationContext는 Spring IOC랑 관련있으니 Spring IOC란?을 한 번 읽고 오시는걸 추천드립니다.

ApplicationContext란?

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는 다음과 같이 구현되어져 있으며 그냥 봐도 상속받은 인터페이스가 꽤나 된다는 것을 알 수 있습니다.

상속받는 인터페이스 목록

  • EnvironmentCapable
  • ListableBeanFactory
  • HierarchicalBeanFactory
  • MessageSource
  • ApplicationEventPublisher
  • ResourcePatternResolver

하나하나씩 설명하면 매우 길어지니 짧게 요약하겠습니다. 대표적으로 BeanFactory의 기능을 상속받았으며 ApplicationEventPublisher(이벤트),ResourcePatternResolver(설정 정보 처리) 등을 추가로 상속 받습니다.

결국 ApplicationContext의 역할은 BeanFactory가 담당하는 Bean을 생성하고 관계설정과 같은 제어역할 뿐만 아니라 설정 정보를 통해 제어까지 담당하는 것을 알 수 있습니다.

이는 ApplicationContext = Spring IOC Container의 역할을 수행하고 있음을 의미합니다. 실제로 클라이언트가 Spring Application에 요청을 할 경우 어떤 기능을 수행하는지 다음을 처리 과정을 통해 알아봅시다.

Bean 요청시 처리 과정

  1. ApplicationContext는 @Configuration이 붙은 클래스들을 설정 정보로 등록해두고, @Bean이 붙은 메소드의 이름으로 빈 목록을 생성합니다.(서비스 실행)
  2. 클라이언트가 해당 Bean을 요청합니다.
  3. ApplicationContext는 자신의 빈 목록에서 요청한 이름이 있는지 찾습니다.
  4. ApplicationContext는 설정 클래스로부터 빈 생성을 요청하고, 생성된 빈을 반환해줍니다.

결론

Spring에서는 빈의 생성과 관계설정 같은 제어를 담당하는 IoC(Inversion of Control) 컨테이너인 빈 팩토리(BeanFactory)가 존재합니다. 하지만 이것만으로는 서비스에서 요구하는 다양한 기능들을 수용하기에 다소 무리가 있습니다. 따라서 ApplicationContext라는 인터페이스를 만들어 개발자의 Bean을 생성하고 제어하는 것뿐만 아니라 설정 정보들을 이용한 Bean간의 관계 설정, 제어 작업 등 추가적인 기능을 수행할 수 있도록 하였습니다.

이로서 ApplicationContext가 어떤 기능을 수행하고 있는지 확인해보았습니다. 다음은 Spring AOP에 대해 알아보는 시간을 가지겠습니다.

Reference

[Spring] 애플리케이션 컨텍스트(Application Context)와 스프링의 싱글톤(Singleton)

스프링 컨테이너(BeanFactory, ApplicationContext)

profile
Gelog 나쁜 것만 드려요~

0개의 댓글