▶CodeStates Back-End/Section 2

TIL [0616] Spring Container와 Bean

휴학생감자 2022. 6. 20. 16:19

 

스프링 컨테이너(Spring Container)

 

내부에 존재하는 애플리케이션 빈의 생명주기를 관리하는 역할을 담당한다. 

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

(BeanFactory를 상속받아 ApplicationContext가 구현되어 있다.)

 

구현방법

☞ XML 또는 애너테이션 기반의 자바 설정 클래스

 

역할

☞ 빈의 인스턴스화, 구성, 전체 생명주기 및 제거를 처리함

☞ 의존성 주입(DI)를 통해 애플리케이션의 컴포넌트를 관리함

 

사용 이유

☞ 객체를 사용하기 위해서는 new를 사용해야 하나, 이 경우 상호 참조에 의한 의존성이 높아진다.

객체지향 프로그래밍에서는 낮은 결합도와 높은 캡슐화를 지향하기 때문에 객체 간의 의존성을 낮추기 위해 이를 사용한다.

 

 

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

  • 매개변수로 받은 클래스의 정보(Bean Definition)를 이용해서 스프링 빈을 생성한다. 
  • 스프링 컨테이너는 Bean Definition에만 의존하는데, 이는 매개변수로 들어오는 정보가 xml, class 등 어떤 형식이든 스프링 컨테이너는 알 필요가 없기 때문이다.

    Ex) ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class)

            → AppConfig 클래스의 정보를 바탕으로 Bean Definition 인터페이스의 구현체 중 하나인 객체를 생성한다.

                 (애너테이션 기반의 생성 방법)

 

 

# 스프링 컨테이너의 종류

- BeanFactory

스프링 컨테이너의 최상위 인터페이스이며, 빈을 등록/생성/조회/반환 등 빈을 관리하는 역할

getBean( ) 메소드를 통해 빈을 인스턴스화 함.

@Bean이 붙은 메서드 이름을 빈 등록시 스프링 빈의 이름으로 사용함.

 

- ApplicationContext

BeanFactory의 기능을 상속받았으며 그 외 부가기능을 제공

MessageSource, EnvironmentCapable, ApplicationEventPublisher 등의 역할을 함.

 

 


 

 

빈 (Bean)

 

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

@Bean이 적힌 메서드를 모두 호출하여 반환된 객체가 스프링 컨테이너에 등록된다.

컨테이너에 사용되는 설정 메타데이터로 빈이 생성되며, 클래스의 등록정보, getter/setter 메서드를 포함한다.

 

※ getBean( ) 메서드로 bean 인스턴스를 가져올 수는 있지만, 직접적으로 호출하지 말아야 한다.

    (객체 간의 결합도를 낮추고, 캡슐화를 위해 의존성 주입(DI)을 이용하는 것이 좋다.)

 

 

# Java Bean vs. Spring Bean

자바 빈은 오직 getter와 setter만 가지는 클래스이며, 생성자가 없어야 한다.

스프링 빈은 getter/setter/생성자 어떤 것이든 상관없으나, 반드시 반환되는 객체가 있어야 한다.

 

 

스프링 컨테이너에 빈을 등록하기 위해...

@ Configuration : 구성정보를 담당하는 것을 설정하기 위해 붙여주는 애너테이션이며, 클래스 앞에 붙인다.

@ Bean : 스프링 컨테이너에 자동으로 등록될 빈을 나타내는 애너테이션이며, 반환되는 객체가 있는 메서드에만 붙인다.