스프링 라이프 사이클에 대한 이해

신수정·2024년 5월 17일

스프링 프레임워크(Spring Framework)는 자바 플랫폼을 위한 애플리케이션 프레임워크로, 의존성 주입(Dependency Injection)과 제어의 역전(Inversion of Control, IoC)을 통해 애플리케이션 개발을 단순화하고 유연성을 높입니다. 스프링의 핵심 기능 중 하나는 빈(Bean) 라이프 사이클을 관리하는 것입니다. 이번 포스트에서는 스프링 빈의 라이프 사이클을 단계별로 살펴보겠습니다.

1. 빈 인스턴스화 (Instantiation)

스프링 컨테이너는 애플리케이션 컨텍스트(ApplicationContext)를 로드하면서 정의된 빈을 인스턴스화합니다. 빈은 XML 설정 파일이나 자바 설정 클래스에서 정의될 수 있습니다. 빈 인스턴스화 단계에서는 빈의 생성자가 호출됩니다.

public class MyBean {
    public MyBean() {
        System.out.println("MyBean 인스턴스화");
    }
}

2. 의존성 주입 (Dependency Injection)

빈이 인스턴스화된 후, 스프링 컨테이너는 빈의 프로퍼티나 생성자를 통해 의존성을 주입합니다. 이는 빈 정의에서 설정된 의존성에 따라 수행됩니다.

public class MyBean {
    private DependencyBean dependency;

    public void setDependency(DependencyBean dependency) {
        this.dependency = dependency;
    }
}

3. 빈 이름 설정 (Setting Bean Name)

빈 이름이 설정됩니다. 빈 이름은 스프링 컨테이너에 의해 설정되며, 빈 이름을 설정하기 위해 BeanNameAware 인터페이스를 구현할 수 있습니다.

public class MyBean implements BeanNameAware {
    @Override
    public void setBeanName(String name) {
        System.out.println("빈 이름 설정: " + name);
    }
}

4. 빈 팩토리 설정 (Setting Bean Factory)

빈 팩토리가 설정됩니다. 빈 팩토리를 설정하기 위해 BeanFactoryAware 인터페이스를 구현할 수 있습니다.

public class MyBean implements BeanFactoryAware {
    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
        System.out.println("빈 팩토리 설정");
    }
}

5. 어플리케이션 컨텍스트 설정 (Setting Application Context)

애플리케이션 컨텍스트가 설정됩니다. 애플리케이션 컨텍스트를 설정하기 위해 ApplicationContextAware 인터페이스를 구현할 수 있습니다.

public class MyBean implements ApplicationContextAware {
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        System.out.println("애플리케이션 컨텍스트 설정");
    }
}

6. 초기화 전 콜백 (Pre-Initialization Callback)

스프링 컨테이너는 빈이 초기화되기 전에 빈 후처리기(BeanPostProcessor)를 통해 초기화 전 콜백을 호출합니다. 이를 통해 개발자는 초기화 전에 특정 작업을 수행할 수 있습니다.

public class CustomBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("초기화 전 콜백: " + beanName);
        return bean;
    }
}

7. 초기화 (Initialization)

빈의 초기화 메서드가 호출됩니다. 이는 빈 정의에서 명시적으로 설정된 초기화 메서드이거나 InitializingBean 인터페이스의 afterPropertiesSet 메서드입니다.

public class MyBean implements InitializingBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("초기화 메서드 호출");
    }
}

8. 초기화 후 콜백 (Post-Initialization Callback)

빈이 초기화된 후, 빈 후처리기(BeanPostProcessor)를 통해 초기화 후 콜백이 호출됩니다.

public class CustomBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("초기화 후 콜백: " + beanName);
        return bean;
    }
}

9. 빈 사용 (Bean in Use)

빈이 초기화된 후, 애플리케이션 로직에서 빈을 사용합니다. 이 단계에서는 빈의 비즈니스 로직이 수행됩니다.

public class MyBean {
    public void performTask() {
        System.out.println("빈 사용: 작업 수행");
    }
}

10. 소멸 전 콜백 (Pre-Destroy Callback)

빈이 소멸되기 전에 소멸 전 콜백이 호출됩니다. 이는 DisposableBean 인터페이스의 destroy 메서드이거나 빈 정의에서 명시적으로 설정된 소멸 메서드입니다.

public class MyBean implements DisposableBean {
    @Override
    public void destroy() throws Exception {
        System.out.println("소멸 전 콜백 호출");
    }
}

11. 빈 소멸 (Bean Destruction)

빈이 소멸됩니다. 이 단계에서 스프링 컨테이너는 빈을 메모리에서 제거하고 모든 자원을 해제합니다.

profile
안녕하세요:)

0개의 댓글