스프링 컨테이너와 스프링 빈

스프링 컨테이너

스프링 컨테이너는 스프링 앱의 구성요소를 생성하고 관리하는 역할을 한다. 스프링 컨테이너는 XML, 어노테이션 기반의 자바 설정 클래스로 만들수 있다.

ApplicationContext는 스프링 컨테이너 인터페이스 이다.

🚨

참고

더 정확히는 스프링 컨테이너는 BeanFactory, ApplicationContext로 구분한다.

스프링 빈

컨테이너가 관리하는 객체를 의미한다. 컨테이너에 의해 생명주기가 관리된다.

  • 빈 이름
    • 빈 이름은 메서드 이름을 사용한다.
    • 사용자가 직접 부여할 수 있다. @Bean(name="memberService2")
🚨

참고

빈 이름은 항상 유일해야 한다.

  • 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입한다.

스프링 빈의 생명 주기

빈의 생명주기는 크게 세가지 단계로 나눌 수 있다.

  • Bean 인스턴스 생성 단계 : 스프링 컨테이너에서 빈으로 등록되면, 해당 빈의 클래스 인스턴스를 생성한다. 이 때, 스프링 컨테이너는 Bean의 클래스를 찾아서 인스턴스를 생성한다.
  • Bean 의존성 주입 단계 : Bean 생성이 완료되면, 해당 Bean이 의존하는 다른 Bean들이 주입된다. 이 때, 스프링은 설정 파일에서 Bean간 의존 관계를 확인하고, 해당 빈이 의존하는 다른 빈을 찾아 주입한다.
  • Bean 초기화, 소멸 : Bean의 인스턴스 생성과 DI가 완료된 후, 스프링 컨테이너는 빈을 초기화 하고, 필요에 따라 소멸한다. 이때 빈 초기화 작업은 InitializingBean 인터페이스의 afterPropertiesSet() 메서드 혹은  @PostConstruct 어노테이션을 이용해 구현 가능하다. 또한 빈의 소멸작업은 DisposableBean 인터페이스의 destroy()메서드 혹은 @PreDestroy 어노테이션을 이용해 구현할 수 있다.

스프링 빈의 메타 정보 - BeanDefinition

스프링이 다양한 설정 형식을 지원할 수 있는 이유는 BeanDefinition이라는 추상화가 있기 때문이다.

  • BeanDefinition을 빈 설정 메타 정보라고 한다.
    • @Bean , <bean> 당 각각 하나씩 메타 정보가 생성된다.
  • 스프링 컨테이너는 이 메타 정보를 기반으로 스프링 빈을 생성한다.

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