[10분 테코톡] 모루의 Spring Bean의 생명주기 들여다보기
- 스프링 빈 생명주기 개요: 스프링 컨테이너 초기화부터 빈 생성, 의존성 주입, 초기화, 사용, 그리고 애플리케이션 종료 전 소멸까지의 일련의 과정을 거칩니다. 🔄
- BeanDefinition의 역할: 빈의 클래스명, 스코프 등 메타데이터를 담고 있어, 다양한 빈 등록 방식에도 불구하고 일관된 빈 생성 및 관리를 가능하게 하는 추상화 계층입니다. 📄
- 빈 등록 방식 (컴포넌트 스캔):
@Component 어노테이션이 붙은 클래스를 스캔하여 BeanDefinition을 등록하고, 이를 기반으로 빈 인스턴스를 생성하며 의존성을 주입합니다. 🔍
- 빈 등록 방식 (Java Config):
@Configuration 클래스를 스캔하고, 그 안의 @Bean 메서드를 분석하여 BeanDefinition을 등록한 후 빈 인스턴스를 생성하고 의존성을 주입합니다. ☕
- 빈 인스턴스 생성 순서 결정 요인:
BeanDefinition 등록 순서, 생성자 파라미터 순서, 그리고 빈 간의 의존성 관계가 복합적으로 작용하여 빈의 생성 순서를 결정합니다. 🏗️
- 컴포넌트 스캔과 Java Config의 의존성 주입 로그 차이: 컴포넌트 스캔은 스프링 내부의
registerDependentBeans 메서드를 통해 리플렉션으로 의존성 주입 로그를 명시적으로 보여주지만, Java Config는 @Configuration 프록싱으로 인해 명시적인 주입 로그가 나타나지 않습니다. 🕵️♀️
- 초기화 단계 (
@PostConstruct): 의존성 주입 완료 후 빈 사용 직전에 DB 연결, 외부 API 연동 등 최종 준비 작업을 수행하며, 메서드 위에 @PostConstruct를 붙여 한 번만 호출되도록 합니다. 🚀
- 소멸 단계 (
@PreDestroy): 애플리케이션 종료 직전에 DB 연결 해제, 외부 API 연결 종료 등 정리 작업을 수행하며, 메서드 위에 @PreDestroy를 붙여 한 번만 호출되도록 합니다. 🗑️
@PostConstruct와 @PreDestroy의 동작 원리: BeanPostProcessor가 이 어노테이션들을 탐색하여 lifecycleMetadataCache에 등록하고 관리함으로써 생명주기 콜백을 처리합니다. 🧠