본문 바로가기

공부 자료/Spring

[Spring Core] 빈(Bean)

빈(Bean)

: 스프링 컨테이너(Spring Container)에 의해 관리되는 재사용 소프트웨어 컴포넌트(자바 객체)

: 인스턴스화된 객체를 의미

: 스프링 컨테이너에 등록된 객체를 스프링 빈(Spring Bean)이라 하며, @Bean이 적힌 메서드를 모두 호출해 반환된 객체를 등록함

: 클래스의 등록정보, getter/setter 메서드를 포함

: 컨테이너에 사용되는 설정 메타데이터(XML, 자바 애너테이션, 자바 코드로 표현되며 컨테이너 명령과 인스턴스화, 설정, 조립할 객체를 정의)로 생성

 

 

Bean 접근 방법(Bean 검색 방법)

- ApplicationContext 사용을 통해 bean 정의를 읽고 엑세스가 가능함 (ApplicationContext에는 bean을 가져오는 몇가지 방법 존재)

: getBean() 메서드를 사용해 빈 인스턴스화가 가능하며, bean의 인스턴스를 가져올 수 있음

>>실제 응용 프로그램 코드에서는 getBean() 메서드를 호출하여 사용하면 안됨

제어의 역전으로 보았을 때 이름을 몰라도 사용이 가능해야 하지만 getBean 메서드는 이름과 타입 혹은 타입을 알아야 접든이 가능하기 때문에 제어권을 넘긴 이유가 사라져버리기 때문에 피해야 함

 

1) 빈 이름, 타입으로 조회 : getBean(빈이름, 타입)

 

2) 타입만으로 조회 : getBean(타입)

- 타입으로 조회할 경우 같은 타입의 스프링 빈이 둘 이상일 경우 오류가 발생함

: BeanNotOfRequiredTypeException 에러 발생할 수 있음 (빈 타입이 다를 경우 익셉션 발생)

 

2-1) 구체적 타입(구현체)로 조회

- 유연성이 떨어지며, 항상 역할에 의존하는 것이 좋기 때문에 좋지 못한 방법이 될 수 있음

 

* 존재하지 않는 빈을 조회했을 경우

: NoSuchBeanDefinitionException과 같은 에러 발생 (메서드 호출 시 존재하지 않는 빈 이름을 사용하면 익셉션 발생)

>> Throws를 통해 예외처리 필요

 

3) 동일한 타입이 둘 이상인 경우 : 빈 이름을 지정하거나 getBeansOfType으로 모든 결과 조회가 가능

 

 

빈 설정 메타정보( BeanDefinition)

: 스프링의 다양한 설정 형식을 지원하는 추상화

: Bean은 BeanDefinition에 의해 정의되고 BeanDefinition에 따라 활용방법이 달라짐

 

빈 설정 메타정보의 역할

- 속성에 따라 컨테이너가 Bean을 어떻게 생성하고 관리할지 결정

- @Bean or <bean> 당 각 1개씩 메타 정보가 생성됨

- Spring이 설정 메타정보를 BeanDefinition 인터페이스를 통해 관리하기 떄문에 컨테이너 설정을 XML, Java로 가능

 

빈 설정 메타정보 개체가 포함하는 메타데이터

1. 패키지 수식 클래스 이름 : 일반적으로 정의되는 빈의 실제 구현 클래스

2. Bean 동작 구성 요소 : 컨테이너에서 Bean이 어떻게 동작해야 하는지 설명

3. Bean이 작업을 수행하는 데 필요한 다른 Bean에 대한 참조

4. 새로 만든 개체에 설정할 기타 구성 설정

5. 빈 정의를 구성하는 속성 집합으로 변환

- BeanClassName : 생성할 빈의 클래스 명

- factoryBeanName : 팩토리 역할의 빈을 사용할 경우 이름

- factoryMethodName : 빈을 생성할 팩토리 메서드 지정

- Scope : 싱글톤(기본값)

- lazylnit : 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아닌 실제 빈을 사용할 때까지 최대한 생성을 지연처리하는지 여부

- InitMethodName : 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명

- DestoryMethodName : 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명

- Constructor arguments, Properties : 의존 관계 주입에서 사용 (팩터리 역할의 빈을 사용하면 없음)