관리 메뉴

제뉴어리의 모든것

[Section2] [Spring Core] Spring Framework의 핵심 개념 - 스프링 컨테이너와 빈 본문

코드스테이츠/정리 블로깅

[Section2] [Spring Core] Spring Framework의 핵심 개념 - 스프링 컨테이너와 빈

제뉴어리맨 2022. 8. 13. 00:34

스프링빈이란? (간략 설명)

자바 객체인데, 스프링에서 인식하고 있는 자바객체를 말하며 스프링 컨테이너가 관리하고 있다. 

 

스프링 컨테이너란?

스프링빈을 생성하고 관리하는 객체.
스프링 컨테이너가 관리하고 있다라는것은 빈을 생성하고, 가지고 있으며, 빈이 필요한 부분에서 빈을 제공, 소멸까지 담당한다고 할 수 있다.

 

  • 스프링 컨테이너의 역할
    1. 빈 생성
    2. 빈을 가지고 있음
    3. 의존성 주입
    4. 빈 소멸


왜 스프링을 써야하나?

가장 근본적인 이유는 개발을 편하고 쉽게 하기 위해서다.
그럼 편하고 쉬운것이란?
수정사항이 생겨도 코드를 최대한 조금만 수정하는것이 편한것이다.
그리고 만들때도 복잡하지 않고 단순하고 직관적이게 만드는게 쉬운것이다.
개발을 편하고 쉽게 하려면 IoC,DI,AOP 와 같은 여러 기법들이 적용되어야 하는데, 그것을 개발자가 일일히 적용하기에는 무리가 있고, 그런 기법에 지키는데 집중하다보면 정작 비즈니스 로직에 신경을 쓸 수가없다. 그렇기 때문에, 이미 해당 기법들을 사용할 수 있게 만들어 놓은 스프링 프레임워크를 사용하는것이다.

 

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

스프링 컨테이너는 ApplicationContext라는 인터페이스로 정의 되어있다.
그리고 ApplicationContext를 실제로 구현한 객체는 다양한데, 각각의 구현체들은 생성시에 넘겨받을 구성정보가 무엇이냐에 따라 구분된다.

 

  • 애노테이션 방식의 구성정보를 인식하는 스프링 컨테이너
    AnnotationConfigApplicationContext 클래스

  • xml 방식의 구성정보를 인식하는 스프링 컨테이너
    GenericXmlApplicationContext 클래스

 

스프링 컨테이너의 종류

  • BeanFactory
    - 스프링 컨테이너의 최상위 인터페이스입니다.

    - BeanFactory는 빈을 등록하고 생성하고 조회하고 돌려주는 등 빈을 관리하는 역할을 합니다.

    - getBean() 메소드를 통해 빈을 인스턴스화할 수 있습니다.

    - @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용해 빈 등록을 합니다.

  • ApplicationContext
    -  BeanFactory의 기능을 상속받아 제공합니다.

    - 빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고 그 외에 부가기능을 제공합니다.

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


+ 빈팩토리와 팩토리빈 차이
빈 팩토리 (BeanFactory)리는 앞서서 말했듯이, 스프링 컨테이너의 최상위 클래스. 스프링에서 제공하는 인터페이스이다.
그러나 팩토리빈(FactoryBean)은 스프링컨테이너를 만들때, 제공되는 구성정보 클래스를, 빈들을 만드는 공장이라고 하여 팩토리빈이라고 한다.
즉, @Configuration이 붙은 클래스.

그리고 내부 메소드들 중  @Bean이 붙어서 등록할 빈 정보를 가지 있는 클래스를 말한다.

 

 

스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트이다.
쉽게말해, 스프링이 인식하고 있고 스프링컨테이너에 의해 관리되는 자바객체이다.

 

  • 빈(bean)은 인스턴스화된 객체를 의미합니다.
  • 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 합니다.
  • @Bean이 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록합니다.
  • 빈은 클래스의 등록정보, 게터/세터 메서드를 포함합니다.
  • 빈은 컨테이너에 사용되는 설정 메타데이터로 생성됩니다.
  • 설정 메타데이터
    - XML 또는 자바 애너테이션, 자바 코드로 표현한다
    - 컨테이너의 명령과 인스턴스화, 설정, 조립할 객체를 정의한다.

BeanDefinition

Bean의 정의 내용이 담긴 인터페이스이다.

각각의 Bean을 나타내는 것이라고 할 수 있다.

해당 빈을 나타내는 여러 속성들이 존재한다.

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

@Bean or  당 각 1개씩 메타 정보가 생성됩니다.

BeanDefinition의 존재 이유

  •  속성에 따라 컨테이너가 Bean을 어떻게 생성하고 관리할지 결정합니다.
  •  Spring이 설정 메타정보를 BeanDefinition 인터페이스를 통해 관리하기 때문에 컨테이너 설정을 XML, Java로 할 수 있는 것입니다.
    스프링 컨테이너는 설정 형식이 XML인지 Java 코드인지 모르고 BeanDefinition만 알면 된다.
    쉽게 말해, ApplicationContext의 구현체가 어떤것이든지,

    그리고 그 구현체에 따라 어떤 구성정보가 들어오던지 결국 스프링은
    각각의 빈 정보를 읽어서 각각의 BeanDefinition을 만든다는것이다.

 

BeanDefinition의 필드값(속성)

  • BeanClassName : 생성할 빈의 클래스 명(자바 설정처럼 팩토리 역할의 빈을 사용하면 없음)
  • factoryBeanName : 팩토리 역할의 빈을 사용할 경우 이름, 예) appConfig
  •  factoryMethodName : 빈을 생성할 팩토리 메서드 지정, 예) userService
  • Scope : 싱글톤(기본값)
  • lazyInit : 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때까지 최대한 생성을 지연처리 하는지 여부
  • InitMethodName : 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
  • DestoryMethodName : 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
  • Constructor arguments, Properties : 의존관계 주입에서 사용한다. (자바 설정처럼 팩터리 역할의 빈을 사용하면 없음)