ApplicationContext와 빈 요청시 처리과정

개발하는 구황작물·2024년 1월 25일
0

Spring

목록 보기
5/6

ApplicationContext

ApplicationContext는 Spring의 IoC컨테이너를 나타내며, 빈의 인스턴스화 구성, 조립을 담당한다.

Spring IoC컨테이너는 다음과 같이 동작한다.

Application Class(POJOs)는 구성 메타데이터와 결합하여 IoC 컨테이너에서 읽어 Bean을 생성하고 초기화 된 이후 시스템을 사용할 수 있도록 구성한다.

ApplicationContext는 IoC 컨테이너를 나타내며, 다양한 Bean을 인스턴스화 하며 구성하고 조립하는 역할을 수행한다.

ApplicationContext는 BeanFactory를 상속받아 구현되었다.

ApplicationContext 코드를 자세히 살펴보면 상속받은 인터페이스들이 많은 것을 알 수 있다.

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;

}
  • EnvironmentCapable : instanceof 검사를 통해 객체가 ApplicationContext 인지 확인하고 맞다면 외부 환경변수와 상호작용을 할 수 있도록 해준다.
  • ListableBeanFactory : BeanFactory를 상속하였으며, 모든 빈 목록을 조회하거나 특정 조건에 맞는 빈들을 조회할 수 있다.
  • HierarchicalBeanFactory : BeanFactory를 상속하였으며, 계층 구조로 빈팩토리를 관리할 수 있도록 도와주는 기능이다. 부모 자식 간의 빈 검색 및 상속을 처리한다.
  • MessageSource : 다국어를 지원하는 역할을 한다.
  • ApplicationEventPublisher : 이벤트를 발행하고 리스너한테 전달하는 역할을 한다. 이를 통해 느슨한 결합을 지원한다.
  • ResourcePatternResolver : 스프링에서 리소스를 찾고 해석하는 역할을 한다. classpath 등 다양한 위치에 있는 리소스들을 찾고 로드할 수 있다.

이를 통해 ApplicationContext는 빈 관리 뿐만이 아닌 설정정보 제어 등 다양한 역할을 한다는 것을 알 수 있다.


Bean 요청시 처리과정

클라이언트에서 빈을 요청하면 다음과 같은 과정을 거쳐 빈을 반환한다.

  1. ApplicationContext는 @Configuration가 붙은 클래스들을 설정 정보로 등록해두고 @Bean이 붙은 메소드의 이름으로 빈 목록을 생성한다.
  2. 클라이언트가 해당 빈을 요청한다.
  3. ApplicationContext는 자신의 빈 목록에서 요청한 이름이 있는지 확인한다.
  4. ApplicationContext는 설정 클래스로부터 빈 생성을 요청하고, 생성된 빈을 돌려준다.

ApplicationContext는 @Configuration가 붙은 클래스들을 설정 정보에 등록해두고 @Bean이 붙은 메소드의 이름, ComponentScan을 통해 @Component가 붙은 클래스들을 빈으로 등록하고 빈 목록을 생성한다.

이후 클라이언트가 빈을 요청하면 ApplicationContext에서는 자신의 빈 목록에서 요청한 이름이 있는지 확인한다. 만약 있다면 해당 빈을 호출하여 객체를 생성하고 돌려준다.


싱글톤 레지스트리

그러나 만약 모든 빈들을 일일히 생성하고 클라이언트에게 돌려줄 수는 없다.

하나의 클라이언트가 1초에 1개의 요청을 하는데 클라이언트 수가 10000명이 넘어간다면 서버가 터질 것이기 때문이다.

이를 위해 스프링은 싱글톤 방식으로 빈을 생성하고 관리한다.


Reference

https://docs.spring.io/spring-framework/reference/core/beans/basics.html
https://mangkyu.tistory.com/151

profile
어쩌다보니 개발하게 된 구황작물

0개의 댓글