회사에서 아래와 같은 에러 메세지를 종종 보곤 했는데
Error creating bean with name 'XXX'
에러는 해결했지만, 문득 Bean이 무엇인지 궁금해져서 알아보다가 Spring Bean에 대해서 기록해보려고 한다.
빈(Bean)은 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트이다. 즉, 스프링 컨테이너가 관리하는 자바 객체를 뜻하며, 하나 이상의 빈을 관리한다.
빈은 인스턴스화된 객체를 의미하며, 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다. @Bean 어노테이션을 통해 메소드로부터 반환된 객체를 스프링 컨테이너에 등록한다.
빈은 클래스 등록 정보, Getter/Setter 메소드를 포함하며, 컨테이너에 사용되는 설정 메타데이터로 생성된다.
설정 메타데이터 : xml or Java Annotation, Java code로 표현하며, 컨테이너의 명령과 인스턴스화, 설정, 조립할 객체 등을 정의한다.
우리가 기존에 알던 Java Programming에서는 Class를 생성하고
new를 입력해 원하는 객체를 직접 생성할 수 있었다.
하지만 스프링에서는 직접new를 이용해 생성한 객체가 아니라 스프링에 의해 관리 당하는 자바 객체를 사용한다. 이렇게 스프링에 의해 생성되고 관리되는 자바 객체를 Bean 이라고 한다.
이렇듯,
Spring framework에서는 Spring Bean을 얻기 위해 ApplicationContext.getBean()와 같은 메소드를 사용해 스프링에서 직접 자바 객체를 얻어서 사용한다.
먼저 아래와 같이 ApplicationContext(스프링 컨테이너)를 사용하여 bean의 정의를 읽고 엑세스할 수 있다.
public final class BeanUtil {
public static Object getBean(String beanName) {
ApplicationContext applicationContext = ApplicationContextProvider.getApplicationContext();
return applicationContext.getBean(beanName);
}
}
스프링의 다양한 설정 형식(Java, xml 등)은 BeanDefinition이라는 추상화 덕분에 할 수 있다.
Bean은 BeanDefinition(빈 설정 메타정보)으로 정의 되고 BeanDefinition에 따라 활용하는 방법 또한 달라진다.
BeanDefinition은 속성에 따라 컨테이너가 Bean을 어떻게 생성하고 관리할지를 결정한다. @Bean 어노테이션 또는 bean 태그당 1개씩 메타 정보가 생성된다.
Spring이 설정 메타정보를 BeanDefinition 인터페이스를 통해 관리하기 때문에 컨테이너 설정을 xml, Java로 할 수 있는 것이다.
스프링 컨테이너는 설정형식이 xml인지 Java 코드인지 모르며, BeanDefinition만 알면 된다.