Spring Container (1)

 

 

 

 

❑ Spring Container

 

 

 

스프링 프레임워크의 핵심 컴포넌트

스프링 컨테이너는 내부에 존재하는 애플리케이션 빈의 생명주기(생성, 관리, 제거 등)를 관리한다.

 

 

▶️ 스프링 컨테이너가 무엇일까?

 

Spring Container

 

ApplicationContext를 스프링 컨테이너라고 한다.

인터페이스로 구현되어있다. (다형성 적용)

 

스프링 컨테이너는 XML, 애너테이션 기반의 자바 설정 클래스로 만들 수 있다.

예전에는 xml을 통해 모두 설정해줬지만 복잡한 설정들을 Spring Boot를 사용하면서 거의 사용하지 않게되었다.

빈의 인스턴스화, 구성, 전체 생명주기, 제거까지 처리한다.

컨테이너는 개발자가 정의한 Bean을 객체로 만들어 관리하고 개발자가 필요할 때 제공한다.

원하는 만큼 많은 객체를 가질 수 있다.

의존성 주입을 통해 애플리케이션의 컴포넌트를 관리한다.

  • 스프링 컨테이너는 서로 다른 빈을 연결해 애플리케이션의 빈을 연결하는 역할을 한다.
  • 개발자는 모듈 간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로울 수 있다.
  • 메서드가 언제, 어디서 호출되어야하는지, 메서드 호출에 필요한 매개변수를 준비해서 전달하지 않는다.

 

 

▶️ 왜 스프링 컨테이너를 사용할까?

 

new 생성자를 사용해서 객체를 생성할 필요가 없다. -> 낮은 결합도

객체간의 참조가 많을수록 의존성이 높아진다.

높은 의존성은 객체지향 프로그래밍의 핵심 중 하나인 낮은 결합도를 지키지 못하게 한다.

그래서 의존성을 낮추기 위해 스프링컨테이너가 필요하다.

 

 

▶️ 기존 방식 vs Spring Container

 

  • 기존의 방식 : 새로운 정책이 생길 때 마다 변경 사항을 일일이 수정해야 했다. 작업 초반부는 하나하나 수정할 수 있지만 코드가 거대해질 경우 의존도가 높아져있고 그에 따른 코드 변경 시간이 많이 들어간다.
  • Spring Container : 구현 클래스에 있는 의존을 제거하여 인터페이스에만 의존하도록 설계한다. 거대한 코드를 수정할 때도 일부분만 수정하면된다.

 

 

▶️ 스프링 컨테이너의 생성 과정은 어떻게 될까?

 

주로 사용하게 되는 설정방식은 Java 기반의 애너테이션 기반 설정이다.

(하지만 XML 방식에 대해서도 이해를 하고 있어야 한다.)

 

참고) XML 이란 무엇인가?

XML(eXtensible Markup Language) W3C에서 개발된, 다른 특수한 목적을 갖는 마크업 언어를 만드는데 사용하도록 권장하는 다목적 마크업 언어

다른 많은 종류의 데이터를 기술하는데 사용할 수 있다.

주로 다른 종류의 시스템, 특히 인터넷에 연결된 시스템끼리 데이터를 쉽게 주고 받을 수 있게하여 HTML의 한계를 극복

텍스트 데이터 형식으로 유니코드를 사용(전 세계 언어 지원)

지금은 임의의 자료구조를 나타내는데 널리 사용됨 (대표적인 예가 웹 서비스)

- 위키백과 -

 

 

Configuration Metadata 사용

※ Configuration Metadata 가 무엇일까?

⬇️ 공식문서

https://docs.spring.io/spring-boot/docs/current/reference/html/configuration-metadata.html

 

Configuration Metadata

Configuration metadata files are located inside jars under META-INF/spring-configuration-metadata.json. They use a JSON format with items categorized under either “groups” or “properties” and additional values hints categorized under "hints", as sh

docs.spring.io

 

스프링 컨테이너는 매개변수로 넘어온 설정 클래스 정보를 사용하여 스프링 빈을 등록한다.

new AnnotationConfigApplicationContext(구성정보.class) 로 스프링에 있는 @Bean의 메서드를 등록

애너테이션 기반의 자바 설정 클래스로 Spring을 만드는 것을 의미한다.

 

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 id=“...”> : 빈 정의를 식별하는데 사용되는 문자열

<beans class=“...”> : 빈의 유형을 정의하고 클래스 이름을 사용

 

 

 

➤ 스프링 컨테이너의 종류

 

▶️ BeanFactory

스프링 컨테이너의 최상위 인터페이스

빈을 등록하고 생성, 조회하고 돌려주는 등 빈을 관리하는 역할

getBean() 메서드를 통해 빈을 인스턴스화 할 수 있음

@Bean이 붙은 메서드 명을 스프링 빈의 이름으로 사용하여 빈 등록

 

 

▶️ ApplicationContext

BeanFactory의 기능을 상속함

BeanFactory 기능 + 부가기능 제공

참고) 부가기능

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

 

 

※ 컨테이너 인스턴스화

ApplicationContext 생성자에 제공된 위치 경로는 컨테이너가 로컬 파일 시스템, Java CLASSPATH 등과 같은 다양한 외부 리소스로부터 구성 메타데이터를 로드할 수 있도록 하는 리소스 문자열

 

 

➤ new와 생성자 주입 코드 차이점

 

new를 사용하는 대신 생성자를 통해 의존 객체가 주입되고 느슨한 의존 관계가 이루어짐 -> 객체지향적 프로그래밍 가능

구현 클래스는 Bean 설정에 따라 유연하게 변하게

생성자가 주입된 객체 입장에서는 어떤 구현 객체가 주입될 지 알 수 없고 알 필요도 없음

어떤 객체가 주입될 지는 외부에서 결정

생성자가 주입된 객체는 오로지 실행에만 집중하게 됨

 

 

 

❑ Bean(빈)

 

➤ 빈이란?

 

스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트이다.

 

Spring 컨테이너가 관리하는 자바 객체를 의미하며 하나 이상의 빈을 관리한다.

빈은 인스턴스화된 객체를 의미함

스프링 컨테이너에 등록된 객체를 스프링 빈이라고 함

 

참고) Spring Bean != Java Bean

자바 빈

  • private로 선언된 필드와 Getter/Setter로만 이루어져 있다
  • 생성자가 없는 no-Argument 생성자만 존재한다
  • java.io.Serializable을 구현한다

스프링 빈은 스프링 컨테이너에 등록된 객체를 의미한다.

 

@Bean이 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록함

빈은 클래스의 등록정보, Getter/Setter 메서드를 포함

빈은 컨테이너에 사용되는 설정 메타데이터로 생성됨

설정 메타데이터

  • XML / 자바 애너테이션, 자바코드로 표현함
  • 컨테이너의 명령과 인스턴스화, 설정, 조립할 객체를 정의함

 

 

➤ Bean 접근방법

 

ApplicationContext를 사용하여 bean 정의를 읽고 액세스할 수 있음

  • getBean을 사용하여 bean의 인스턴스를 가져올 수 있음
  • ApplicationContext 인터페이스는 bean을 가져오는 몇 가지 방법들이 있음
  • 응용프로그램 코드에서는 getBean() 메서드로 호출하여 사용하면 안된다. (IoC/DI)

 

 

➤ BeanDefinition

 

스프링은 다양한 설정 형식을 BeanDefinition이라는 추상화 덕분에 지원할 수 있음

빈은 BeanDefinition(빈 설정 메타정보)으로 정의되고 BeanDefinition에 따라서 활용하는 방법이 달라짐

BeanDefinition(빈 설정 메타정보)

  • 속성에 따라 컨테이너가 Bean을 어떻게 생성하고 관리할지 결정함
  • @Bean / <bean> 당 1개씩 메타 정보가 생성됨
  • Spring이 설정 메타정보를 BeanDefinition 인터페이스를 통해 관리하기 때문에 컨테이너 설정을 XML이나 Java코드로 설정할 수 있음(스프링 컨테이너는 설정 형식이 무엇인지 모르고 BeanDefinition만 알면 됨)

 

 

 

 

읽어주셔서 감사합니다. 좋은하루 되세요 🤗

오개념에 대한 지적은 언제나 환영입니다.

 

1