스프링 프레임워크(Spring Framework)는 자바 플랫폼을 위한 애플리케이션 프레임워크로, 의존성 주입(Dependency Injection)과 제어의 역전(Inversion of Control, IoC)을 통해 애플리케이션 개발을 단순화하고 유연성을 높입니다. 스프링의 핵심 기능 중 하나는 빈(Bean) 라이프 사이클을 관리하는 것입니다. 이번 포스트에서는 스프링 빈의 라이프 사이클을 단계별로 살펴보겠습니다.
스프링 컨테이너는 애플리케이션 컨텍스트(ApplicationContext)를 로드하면서 정의된 빈을 인스턴스화합니다. 빈은 XML 설정 파일이나 자바 설정 클래스에서 정의될 수 있습니다. 빈 인스턴스화 단계에서는 빈의 생성자가 호출됩니다.
public class MyBean {
public MyBean() {
System.out.println("MyBean 인스턴스화");
}
}
빈이 인스턴스화된 후, 스프링 컨테이너는 빈의 프로퍼티나 생성자를 통해 의존성을 주입합니다. 이는 빈 정의에서 설정된 의존성에 따라 수행됩니다.
public class MyBean {
private DependencyBean dependency;
public void setDependency(DependencyBean dependency) {
this.dependency = dependency;
}
}
빈 이름이 설정됩니다. 빈 이름은 스프링 컨테이너에 의해 설정되며, 빈 이름을 설정하기 위해 BeanNameAware
인터페이스를 구현할 수 있습니다.
public class MyBean implements BeanNameAware {
@Override
public void setBeanName(String name) {
System.out.println("빈 이름 설정: " + name);
}
}
빈 팩토리가 설정됩니다. 빈 팩토리를 설정하기 위해 BeanFactoryAware
인터페이스를 구현할 수 있습니다.
public class MyBean implements BeanFactoryAware {
@Override
public void setBeanFactory(BeanFactory beanFactory) {
System.out.println("빈 팩토리 설정");
}
}
애플리케이션 컨텍스트가 설정됩니다. 애플리케이션 컨텍스트를 설정하기 위해 ApplicationContextAware
인터페이스를 구현할 수 있습니다.
public class MyBean implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
System.out.println("애플리케이션 컨텍스트 설정");
}
}
스프링 컨테이너는 빈이 초기화되기 전에 빈 후처리기(BeanPostProcessor)를 통해 초기화 전 콜백을 호출합니다. 이를 통해 개발자는 초기화 전에 특정 작업을 수행할 수 있습니다.
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("초기화 전 콜백: " + beanName);
return bean;
}
}
빈의 초기화 메서드가 호출됩니다. 이는 빈 정의에서 명시적으로 설정된 초기화 메서드이거나 InitializingBean
인터페이스의 afterPropertiesSet
메서드입니다.
public class MyBean implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("초기화 메서드 호출");
}
}
빈이 초기화된 후, 빈 후처리기(BeanPostProcessor)를 통해 초기화 후 콜백이 호출됩니다.
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("초기화 후 콜백: " + beanName);
return bean;
}
}
빈이 초기화된 후, 애플리케이션 로직에서 빈을 사용합니다. 이 단계에서는 빈의 비즈니스 로직이 수행됩니다.
public class MyBean {
public void performTask() {
System.out.println("빈 사용: 작업 수행");
}
}
빈이 소멸되기 전에 소멸 전 콜백이 호출됩니다. 이는 DisposableBean
인터페이스의 destroy
메서드이거나 빈 정의에서 명시적으로 설정된 소멸 메서드입니다.
public class MyBean implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("소멸 전 콜백 호출");
}
}
빈이 소멸됩니다. 이 단계에서 스프링 컨테이너는 빈을 메모리에서 제거하고 모든 자원을 해제합니다.