본문 바로가기
Spring

Bean Overview - 스프링 공식문서가 말하는 빈

by irerin07 2024. 1. 22.
728x90
  • 스프링 IoC 컨테이너는 하나 이상의 빈을 관리합니다.
  • 빈은 컨테이너에 전달된 Configuration Metadata를 기반으로 생성됩니다.
  • 컨테이너 내부에서 Bean의 정의는 BeanDefinition 객체를 통해 표시되고 다음과 같은 metadata를 가지고 있습니다.
    • 클래스 이름(A Package-qualified class name) : 빈으로 정의하고자 하는 클래스
    •  Bean 동작 구성 요소. : 컨테이너에서 빈이 어떻게 동작할것인지를 나타낸다. ( Bean Scope, LifeCycle callback등)
    • 빈이 작업을 수행하기 위해 필요한 다른 빈들로의 참조. 이러한 참조를 의존성(Dependencies)라 한다.
    • 새로 생성된 객체에 설정한 기타 구성 정보. Connection Pool을 관리하는 빈에서 사용할 Pool의 크기제한 등의 설정 정보.
  • 이 Metadata들은 각각의 빈 정의를 구성하는 설정들로 변환됩니다.
    • Class : 인스턴스화할 객체의 타입이나 클래스를 지정합니다. 보통 필수값이긴 하지만 예외인 경우도 있습니다.
    • Name : 빈의 이름을 지정합니다. 필수값이 아니며, 값을 지정하지 않는 경우, 컨테이너가 알아서 유니크한 이름을 지정해줍니다. 하지만 빈의 name 값을 사용하여  ref 를 사용하거나 Service Locator Style Lookup을 사용하기 위해선 반드시 name을 지정해줘야 합니다.
    • Scope : 특정 빈 정의로부터 생성된 객체의 범위를 지정합니다.
    • Constructor arguments : Dependency Injection에 사용되기 위한 설정입니다.
    • Properties : Dependency Injection에 사용되기 위한 설정입니다.
    • Autowiring mode : 오토와이어 방식을 설정합니다.
    • Lazy Initialization mode : 빈 생성 시점을 설정합니다. ApplicationContext의 구현체들은 기본적으로 초기화 작업시 모든 싱글턴 빈을 생성하고 설정합니다. Lazy Initialization Mode에서는 IoC 컨테이너에게 해당 빈이 처음 요청 되었을때 생성하라고 알려줍니다.
    • Initialization method : 빈이 초기화되고 실행할 메서드를 명시합니다
    • Destruction method : 빈이 소멸되고 실행할 메서드를 명시합니다.
  • ApplicationContext 구현체들은 컨테이너 외부에서 생성된 객체들을 빈으로 등록할 수도 있습니다.
    • ApplicationContext의 getBeanFactory()메서드를 통해 얻은 DefaultListableBeanfactory 구현체를 사용해 등록할 수 있습니다.
    • DefaultListableBeanFactory는 registerSingleton(..)과 registerBeanDefinition(..) 메서드를 사용해 해당 객체들을 등록합니다.
    • 하지만 대다수의 경우 Metadata를 통해 빈을 등록합니다.
  • 빈 Metadata 혹은 수동으로 제공된 싱글턴 객체들의 등록은 최대한 빨리 이루어져야 하는데, 이는 컨테이너가 오토와이어링 시점 혹은 기타 내부 검사단계에서  정상적으로 동작할 수 있도록 하기 위함입니다.
  • 이미 존재하는 metadata나 이미 존재하는 싱글턴 객체의 오버라이딩(Overriding)은 어느정도 지원은 되지만 런타임 시점에 완전히 새로운 빈의 등록(Factory에 실시간 접근과 동시에)은 공식적으로 지원되지 않습니다.
    • 이는 Concurrent Access Exceptions(동시 접근 예외, 아마 동시성 오류관련 예외일 듯 함) 혹은 빈 컨테이너의 일관되지 않은 상태를 발생시킬 수 있습니다.
728x90