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

신수정·2024년 5월 17일
0

스프링 프레임워크(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개의 댓글