Kim Jinung

Spring Bean 본문

Web/Spring

Spring Bean

Kim Jinung 2023. 4. 18. 14:49

스프링 프레임워크가 제공하는 스프링 컨테이너와 서블릿 컨테이너 모두 컨테이너라는 명칭을 사용하기 때문에, 비슷한 일을 하는 것으로 예상할 수 있다. 두 컨테이너는 객체를 관리하는 측면에서 비슷하지만 목적은 다르다. 스프링 컨테이너는 싱글톤 형태로, 의존성 객체의 라이프 사이클을 관리하는 DI 컨테이너다. 반면에 서블릿 컨테이너는 HTTP 요청과 응답을 처리하기 위한 서블릿 인스턴스의 라이프 사이클을 관리하는 컨테이너다. 

1. Servlet container

서블릿 컨테이너는 서블릿의 라이프 사이클을 담당한다. 웹 서버가 HTTP 요청을 받았을 때, 적절한 서블릿을 초기화하고 요청을 전달한다. 서블릿 인스턴스가 작업을 마친 뒤에는 서블릿 컨테이너가 서블릿 인스턴스를 파괴하고 자원을 회수한다. 

 

 


2. DI Container(Dependency Injection Container)

DI 컨테이너는 애플리케이션에서 필요로 하는 객체를 생성하고 관리하는 컴포넌트다. 의존성이 존재하는 객체를 DI 컨테이너 한 군데에서 관리하므로 객체 간 결합도를 낮추고 유연한 애플리케이션 아키텍처를 구현할 수 있다. 클린 아키텍처에서 설명하는 DIP를 직접적으로 실현하는 컴포넌트다.

Spring Container

스프링 컨테이너는 스프링 프레임워크가 제공하는 DI컨테이너다. 스프링은 객체를 관리함에 있어서 기본적으로 싱글톤 패턴으로 관리한다. 객체간 동시성 문제를 핸들링 하기 위해서 내부적으로 ConcurrentHashMap 타입을 사용하여 Key-Value 형태로 객체를 저장한다.

Spring Bean

스프링 컨테이너에서 관리하는 의존성 객체를 특별히 스프링 빈이라고 칭한다. 스프링 컨테이너는 빈을 싱글톤으로 관리한다. (빈에 대한 정보를 확인하고 싶다면 ApplicationConext 인스턴스에서 bean 관련 필드를 까보면 된다.)

 

그런데 스프링 빈은 어떻게 관리되는 걸까? 

Bean Factory interface

BeanFactory interface

빈 팩토리 클래스는 빈(Bean) 생성과 관리를 담당하는 최상위 인터페이스다. 빈 팩토리에서는 getBean, isSingleton 메서드를 구현할 것을 명세하고 있다. 즉 빈과 직접적으로 관련된 메서드를 정의하고 있다. 


Application Context interface

ApplictionContext interface

다음으로 ApplicationContext 인터페이스는 BeanFactory 인터페이스를 상속해서 추가 기능을 제공한다. ApplicationContext 인터페이스는 애플리케이션 정보에 대한 메서드를 명시하고 있다.

 

스프링 프레임워크는 ApplicationConext의 구현체를 제공한다.

AnnotationConfigAppApplicationContext, XmlWebApplicationContext, ClassPathXmlApplicationContext 등이 존재한다.

 

스프링 부트를 사용하면 일반적으로 AnnotationConfigAppApplicationContext 구현체를 사용한다.


Annotation Config App Application Context

AnnotationConfigAppApplicationContext Implementation

애노테이션 컨피그 앱 애플리케이션 컨텍스트 클래스는 위 ApplicationContext 인터페이스의 구현체다. 스프링 프레임워크 사용 시 빈에 대한 정보를 작성하는 AppConfig.class 파일을 읽어서 빈을 초기화한다. 그런데 실제로 빈을 저장하는 ConcurrentHashMap 타입 필드는 해당 클래스에 존재하지 않는다.


Generic Application Context

GenericApplicationContext Implementation

AnnotationConfigAppApplicationContext가 상속하고 있는 GenericApplicationConext 클래스로 거슬러 올라가보면, DefaultListableBeanBfactory 타입을 확인할 수 있다. 해당 클래스를 상속하는 AnnotationConfigAppApplicationContext는 해당 필드에 빈을 저장한다.


Default Listable Bean Factory

DefaultListableBeanFactory implentation

164 라인에 위치하고 있는, ConcurrentHashMap 타입 필드인 beanDefinitionMap이 실제로 스프링 빈을 저장하는 객체다. 초기화 시 맵의 사이즈는 256개인 것을 확인할 수 있다.

조금 더 살펴보면 모든 빈의 이름, 필드 타입 등을 확인할 수 있는 필드가 해당 클래스에 같이 위치한다. 추가적으로 BeanFactory 클래스에서 먼저 발견했던 getBean 등의 메서드가 해당 클래스에서 오버라이드 되어 구현되어 있다.


 

'Web > Spring' 카테고리의 다른 글

Spring Security  (0) 2023.06.12
Spring MVC  (0) 2023.04.17