본문 바로가기

Spring

[Spring] 스프링 컨테이너(Spring Container)


스프링 컨테이너(Spring Container)


스프링 컨테이너(Spring Container)란 스프링 프레임워크의 핵심 컴포넌트입니다.

스프링 컨테이너는 내부에 존재하는 애플리케이션 bean의 생명주기를 관리합니다.

Bean의 생성, 관리, 제거 등의 역할을 담당합니다.

 

 

ApplicationContext를 스프링 컨테이너라고 하고 인터페이스로 구현되어 있습니다.

 

 

 

 

  • 스프링 컨테이너는 XML, 애너테이션 기반의 자바 설정 클래스로 만들 수 있습니다.
  • Spring Boot 이전엔 개발자가 xml을 통해 모두 설정하여 주었지만, Spring Boot 이후 거의 사용하지 않게 되었습니다.
  • 빈의 인스턴스화, 구성, 전체 생명 주기 및 제거까지 처리합니다.
    • 컨테이너는 개발자가 정의한 Bean을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공합니다.
  • 스프링 컨테이너를 통해 원하는 만큼 많은 객체를 가질 수 있습니다.
  • 의존성 주입을 통해 애플리케이션의 컴포넌트를 관리합니다.
    • 스프링 컨테이너는 서로 다른 빈을 연결해 애플리케이션의 빈을 연결하는 역할을 합니다.
    • 개발자는 모듈 간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로울 수 있습니다.
    • 메서드가 언제, 어디서 호출되어야 하는지, 메서드를 호출하기 위해 필요한 매개 변수를 준비해서 전달하지 않습니다.

 

 

스프링 컨테이너는 왜 사용할까?


스프링 컨테이너를 사용하는 이유는 아래와 같습니다.

  • 애플리케이션에서 new 생성자를 사용한 객체가 무수히 많고, 서로 참조하게 되어 있었습니다.
    • 참조가 많이 되어있다면 의존성이 높다 할 수 있습니다.
    • 높은 의존성은 객체 지향프로그래밍의 낮은 결합도와 높은 캡슐화에 위반되는 방법입니다.
  • 객체 간 의존성을 낮추기 위해 Spring 컨테이너가 사용됩니다.

스프링 컨테이너가 해결법이 되는 이유

  • 기존의 방식일 때 새로운 변경사항들을 수작업으로 수정이 필요했습니다.
  • 서비스의 볼륨이 커져 의존도가 높을 때 그에 따른 코드의 변경도 많이 필요해질 것입니다.
  • 하지만 스프링 컨테이너를 사용하면서 구현 클래스에 있는 의존을 제거하고 인터페이스에만 의존하도록 설계할 수 있습니다.

 

 

스프링 컨테이너의 생성 과정


  • 스프링 컨테이너는 Configuration Metadata를 사용합니다.
  • 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해 스프링 빈을 등록합니다.
  • new AnnotationConfigApplicationContext(구성정보. class)로 스프링에 있는 @Bean의 메서드를 등록합니다.

 

// 스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(DependencyConfig.class);

 

  • XML 기반으로 만드는 ClassPathXmlApplicationContext도 있습니다.
  • XML 기반 구성 메타데이터의 기본 구조
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
        
    <bean id="..." class="...">  
        <!-- collaborators and configuration for this bean go here -->
     </bean>
        
     <bean id="..." class="...">
         <!-- collaborators and configuration for this bean go here -->
     </bean>
        
     <!-- more bean definitions go here -->
        
</beans>

위의 예제 코드를 간략히 설명한다면

  • <beans />: 필요한 값들을 설정합니다.
  • <bean id= "...">: bean 정의를 식별하는 데 사용되는 문자열입니다.
  • <bean class="...">: bean의 유형을 정의하고 클래스 이름을 사용합니다.

 

스프링 컨테이너를 만드는 다양한 방법은 ApplicationContext 인터페이스의 구현체입니다.

  • DependencyConfig.class 등의 구성 정보를 지정해 줘서 스프링 컨테이너를 생성해야 합니다.
  • DependencyConfig에 있는 구성 정보를 통해서 스프링 컨테이너는 필요한 객체들을 생성하게 됩니다.
  • 애플리케이션 클래스는 구성메타데이터와 결합되어 Application Context 생성 및 초기화된 후 완전히 구성되고 실행 가능한 시스템 또는 애플리케이션을 갖게 됩니다.

스프링 빈 조회에서 상속관계가 있을 시 부모타입으로 조회하면 자식 타입도 함께 조회됩니다.

  • 모든 자바 객체의 최고 부모인 object타입으로 조회하면 모든 스프링 빈을 조회합니다.

 

ApllcationContext 인터페이스 구현체 확인법


  1. IntelliJ에서 Ctrl + N을 누른 뒤 class에서 ApplicationContext로 검색
  2. 화면에서 가장 첫 번째 파일인 ApplicationContext 인터페이스를 구현한 하위 클래스들을 확인할 수 있습니다.

 

스프링 컨테이너의 종류


BeanFactory

  • 스프링 컨테이너의 최상위 인터페이스입니다.
  • BeanFactory는 bean을 등록하고 생성하고 조회하고 돌려주는 등 bean을 관리하는 역할을 합니다.
  • getBean() 메서드를 통해 빈을 인스턴스화할 수 있습니다.
  • @Bean이 붙은 메서드의 명을 스프링 bean의 이름으로 사용해 bean 등록을 합니다.

 

ApplicationContext

  • BeanFactory의 기능을 상속받아 제공합니다.
  • 빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고 그 외에 부가기능을 제공합니다.
  • 부가 기능
    • MessageSource: 메시지 다국화를 위한 인터페이스
    • EnvironmentCapable: 개발, 운영 등 환경변수 등으로 나눠 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리하기 위한 인터페이스
    • ApplicationEventPublisher: 이벤트 관련 기능을 제공하는 인터페이스
    • ResourceLoader: 파일, 클래스 패스, 외부 등 리소스를 편리하게 조회

 

컨테이너 인스턴스화


ApplicationContext context = new AnnotationConfigApplicationContext(DependencyConfig.class);
// Annotation

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

 

'Spring' 카테고리의 다른 글

[Spring] 빈 스코프(Bean Scope)  (0) 2023.04.05
[Spring] 빈(Bean)  (0) 2023.04.04
[Spring] DI(Dependency Injection)란?  (0) 2023.04.02
[Spring] 간단한 서비스 생성 및 테스트  (0) 2023.04.01
[Spring] Spring 환경 구성  (0) 2023.03.31