Spring/공부

[Spring Core] 스프링 컨테이너와 스프링 빈

오잎 클로버 2023. 1. 11. 21:00
728x90

🛒 스프링 컨테이너란?

스프링에서 사용할 객체들을 담아두고 있는 것
등록된 스프링 빈을 생성하고 의존 관계를 주입하고 생명주기를 관리해 주는 장치이다.

@Configuration 어노테이션을 설정 클래스에 붙여 설정 파일을 구성할 수 있으며,

해당 설정 파일에 있는 메소드들에 @Bean 어노테이션을 붙여 스프링 컨테이너을 등록시킬 수 있다.

@Configuration
public class AppConfig {

    @Bean
    public void DiscountPolicy discountPolicy() {
        return new MemberShipDiscountPolicy();
    }
}

위와 같은 예시처럼 사용할 수 있다.

 

스프링은 애플리케이션 컨텍스트로 시작하며, 이를 편하게 "스프링 컨테이너"라고 칭한다.

스프링 애플리케이션 컨텍스트 = 스프링 컨테이너

기존에는 @Configuration 어노테이션이 있는 설정 클래스들을 통해 직접 인스턴스화한 것을 DI 해주고, 관리해 주어야

  했지만, Spring이 버전이 올라감에 따라 Spring Container를 통해 @Configuration 설정 클래스들을 설정(구성) 정보로

 사용되어, @Bean 어노테이션이 있는 메소드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.

이렇게 등록된 객체들을 스프링 빈이라고 한다.

스프링 빈은 기본적으로 메소드명을 스프링 빈의 이름으로 등록한다. @Beanname 을 통해 따로 명명할 수도 있다.

 

이전에는 프로그래머가 필요한 객체를 @Configuration 설정 클래스를 사용하여, 직접 조회를 거쳐야 했으나,

 현재는 Spring Container를 통해 필요한 스프링 빈을 찾아야 하며, getBean 메소드를 통해 손쉽게 조회가 가능하다.

 

📕 정리

  • 스프링 컨테이너는 스프링 빈을 관리하고, 보관하는 것
  • 프로그래머가 일일이 해야 하던 작업을 스프링 컨테이너 하나에서 손쉽게 사용할 수 있다.

 

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

스프링 컨테이너 생성 요청 -(@Configuration 구성 클래스들 로드)-> 스프링 컨테이너 안에 있는 

  스프링 빈 저장소에 빈 이름과 빈 객체를 저장한다.

스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입해 주는 데, POJO를 통해 호출하는 것이 아닌

싱글톤을 통해 빈 객체에 저장된 것을 참조하도록 하며, bytecode를 수정하여, 싱글톤으로 유지하도록 해준다.

(참고로 기본 설정이 싱글톤인 것이지, 싱글톤만 지원하는 것이 아니라, 요청할 때마다 새로운 객체를 생성해서

  반환하는 기능 역시 제공한다.)

(조금은 deep 한 내용이지만, 싱글톤 패턴은 동시성 문제, 공유성 문제 등의 문제 때문에, CGLIB 등을 통해

  바이트 코드를 수정하여, 싱글톤처럼 유지시키도록 한다.)

(또한 @Bean만 사용한다면, 스프링 빈으로 등록은 되나, 스프링 컨테이너가 관리 대상에 포함되지 않을 수 있다.

    해당 빈의 의존성이 필요한 거나, 빈이 의존성이 필요한 경우, 메소드를 직접 호출하는 경우, 싱글톤이 보장되지 않는다.)

(싱글톤 패턴과 같이 스프링 컨테이너의 관리 대상으로 등록시키고, 동시에 스프링 빈에도 등록시키고 싶다면,

    반드시 @Configuration 클래스에 @Bean 메소드를 작성하자.)

더 자세한 내용은 컴포넌트 스캔과 의존성 주입 글에 다룰 예정이다.

 

 

이상입니다.