반응형
소개
빈(Bean)은 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트이다.
즉, 스프링 컨테이너가 관리하는 자바 객체를 뜻하며, 하나 이상의 빈(Bean)을 관리한다.
빈은 인스턴스화된 객체를 의미하며, 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
@Bean 어노테이션을 통해 메서드로부터 반환된 객체를 스프링 컨테이너에 등록한다.
빈은 클래스의 등록 정보, Getter/Setter 메서드를 포함하며, 컨테이너에 사용되는 설정 메타데이터로 생성된다.
설정 메타데이터 : XML 또는 자바 어노테이션, 자바 코드로 표현하며, 컨테이너의 명령과 인스턴스화, 설정, 조립할 객체 등을 정의한다.
LifeCycle
1.Bean 정의
- 빈의 생명주기는 먼저 빈을 정의하는 단계로 시작합니다. 빈은 XML 파일, JavaConfig 설정 또는 Annotation을 통해 정의될 수 있습니다.
2.빈 생성
- Spring 컨테이너는 빈을 생성합니다. 빈 객체가 생성되고 해당 빈의 클래스를 인스턴스화합니다.
3.의존성 주입
- 생성된 빈에 의존성이 주입됩니다. 이는 프로퍼티 주입, 생성자 주입 또는 메서드 주입을 통해 수행됩니다.
4.빈 초기화
- 빈 초기화 메서드가 호출됩니다. 초기화 메서드는 빈 클래스에 정의된 @PostConstruct 애노테이션 또는 XML 설정에서 init-method로 지정한 메서드일 수 있습니다.
5.빈 사용
- 빈은 Spring 애플리케이션에서 사용됩니다. 이때 빈은 애플리케이션의 다른 구성 요소와 상호 작용할 수 있습니다.
6.빈 소멸
- 빈의 생명주기가 끝날 때, 빈 소멸 메서드가 호출됩니다. 소멸 메서드는 빈 클래스에 정의된 @PreDestroy 애노테이션 또는 XML 설정에서 destroy-method로 지정한 메서드일 수 있습니다.
7.빈 제거
- 빈 객체가 메모리에서 제거됩니다. 이 과정은 Spring 컨테이너가 빈 객체를 가비지 컬렉션의 대상으로 표시하고 나중에 가비지 컬렉터가 해당 객체를 수집하여 메모리에서 해제하는 방식으로 수행됩니다.
BeanDefinition
- 스프링의 다양한 설정 형식(Java, XML 등)은 BeanDefinition이라는 추상화 덕분에 할 수 있는 것이다.
- Bean은 BeanDefinition(빈 설정 메타정보)으로 정의되고, BeanDefinition에 따라 활용하는 방법이 달라진다.
- BeanDefinition은 속성에 따라 컨테이너가 Bean을 어떻게 생성하고 관리할지를 결정한다.
- @Bean 어노테이션 또는 태그당 1개씩 메타 정보가 생성된다.
- Spring이 설정 메타정보를 BeanDefinition 인터페이스를 통해 관리하기 때문에 컨테이너 설정을 XML, Java로 할 수 있는 것이다.
- 스프링 컨테이너는 설정 형식이 XML인지 Java 코드인지 모르며, BeanDefinition만 알면 된다.
BeanDefinition 정보
- BeanClassName : 생성할 빈의 클래스 이름
- factoryBeanName : 팩토리 역할의 빈을 사용할 경우의 이름 (appConfig, … 등)
- factoryMethodName : 빈을 생성할 팩토리 메서드 지정 (memberService, … 등)
- Scope : 싱글톤(기본값)
- lazyInit: 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때까지 최대한 생성을 지연 처리하는지 여부
- InitMethodName: 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
- DestroyMethodName: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
- Constructor arguments, Properties: 의존관계 주입에서 사용한다. (자바 설정처럼 팩토리 역할의 빈을 사용하면 없음
반응형
'개발 > Spring Boot' 카테고리의 다른 글
[Spring Boot] Spring Security란? (0) | 2023.11.10 |
---|---|
[Spring Boot] Spring Boot란 (0) | 2023.11.08 |
[ Spring Boot ] Resource 파일 읽기 (0) | 2023.11.01 |
[Spring Boot] Spring Boot Actuator란 (0) | 2023.11.01 |
[Spring Boot] ThreadPoolTaskExecutor란 (0) | 2023.10.24 |