빈(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 : 의존 관계 주입에서 사용 (팩터리 역할의 빈을 사용하면 없음)
'공부 자료 > Spring' 카테고리의 다른 글
[Spring Core] Java 기반 컨테이너 설정 (0) | 2022.10.14 |
---|---|
[Spring Core] 빈 스코프(Bean Scope) (0) | 2022.10.13 |
[Spring Core] 스프링 컨테이너(Spring Container), 스프링 컨텍스트(Spring Context) (0) | 2022.10.13 |
[Spring Core] Spring Boot (0) | 2022.10.12 |
[Spring Core] 아키텍처로 보는 Spring Framework Module 구성 (0) | 2022.10.12 |