TIL [0616] Spring Container와 Bean
스프링 컨테이너(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 : 스프링 컨테이너에 자동으로 등록될 빈을 나타내는 애너테이션이며, 반환되는 객체가 있는 메서드에만 붙인다.