본문 바로가기
Programming/Spring

Spring Bean Lifecycle

by d-e-v-j 2024. 11. 20.
반응형

Spring Framework의 IoC(Inversion of Control) 컨테이너는 Bean의 생성, 초기화, 소멸 등 생명주기를 관리한다. 

Spring Bean 생명 주기의 각 단계를 알아보자.

 

1. Spring Bean Lifecycle 이란?

Spring Bean Lifecycle 은 Spring IoC 컨테이너에 의해 관리되는 객체의 생명주기를 뜻한다. Bean은 ApplicationContext 에 등록되고, 초기화 및 솜려 과정에서 다양한 Callback method 가 호출된다.

단계

  • 객체 생성 (Instantiation): Bean 정의에 따라 객체가 생성된다.
  • 의존성 주입 (Dependency Injection) : 필요한 의존성이 주입된다.
  • 초기화 (Initialization) : @PostConstruct, InitializingBean, 또는 사용자 저즹 초기화 메서드가 호출된다.
  • 사용 (Ready for Use): Bean이 애플리케이션 로직에서 사용된다.
  • 소멸 (Destruction): 애플리케이션 종료 시 Bean의 @PreDestroy, DisposableBean, 또는 사용자 정의 소멸 메서드가 호출 된다.

 

2. Bean Lifecycle의 주요단계

객체생성

컨테이너는 Bean 정의를 읽고 Read 객체를 생성한다. 이 과정은 XML 또는 Java Config 기반이다.

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

 

의존성 주입

Spring 의존성을 Setter 또는 Constructor를 통해 주입한다.

public class MyBean {
    private Dependency dependency;

    @Autowired // 의존성 주입
    public void setDependency(Dependency dependency) {
        this.dependency = dependency;
    }
}

 

초기화

Bean이 초기화 되기 위해 @PostConstruct , InitializingBean 인터페이스의 afterPropertiesSet() , initMethod 중 하나를 사용한다.

public class MyBean implements InitializingBean {
    @PostConstruct // 가장 권장되는 방식
    public void initUsingAnnotation() {
        System.out.println("Bean 초기화 - @PostConstruct");
    }

    @Override
    public void afterPropertiesSet() {
        System.out.println("Bean 초기화 - InitializingBean 인터페이스");
    }
}

Java Config 에서 초기화 메서드 지정

@Bean(initMethod = "customInitMethod")
public MyBean myBean() {
    return new MyBean();
}

 

사용

초기화가 완료되면 애플리케이션에서 Bean을 사용할 준비가 된다.

@Service
public class MyService {
    @Autowired
    private MyBean myBean;

    public void doSomething() {
        myBean.performTask();
    }
}

 

소멸

애플리케이션 종료시 Spring은 Bean의 소멸 작업을 수행한다. 이때 @PreDestroy, DisposableBean의 destroy(), destroyMethod가 사용된다.

public class MyBean implements DisposableBean {
    @PreDestroy // 가장 권장되는 방식
    public void destroyUsingAnnotation() {
        System.out.println("Bean 소멸 - @PreDestroy");
    }

    @Override
    public void destroy() {
        System.out.println("Bean 소멸 - DisposableBean 인터페이스");
    }
}

Java Config에서 소멸 메서드 지정

@Bean(destroyMethod = "customDestroyMethod")
public MyBean myBean() {
    return new MyBean();
}

 

3. Spring Bean Lifecycle 과 관련된 인터페이스와 어노테이션

기능 방법 설명
초기화 @PostConstructor Java 표준 어노테이션
초기화 InitializingBean.afterPropertiesSet() 초기화 로직 수행
초기화 @Bean(initMethod=" ") Bean 생성 시 초기화 메서드 지정
소멸 @PreDestroy Java 표준 어노테이션
소멸 DisposableBean.destroy() 소멸 로직 수행
소멸 @Bean(destroyMethod = " ") Bean 소멸 시 메서드 지정

 

4. 사용 팁

  • @PostConstruct 와 @PreDestroy 선호: 인터페이스를 사용하는 방식보다 Java 표준 어노테이션을 사용하는 것이 유연하고 가독성이 더 좋다.
  • initMethod 와 destroyMethod 를 통한 커스터마이징: Third-party 라이브러리 Bean 초기화와 소멸 로직을 관리할 때 유용.
  • ApplicationContextAware 활용: 필요시 컨텍스트를 직접 참조하여 동적으로  Bean 관리 가능.

 

Spring Bean Lifecycle을 잘 다룬다면 Application의 성능과 안정성을 높일 수 있다. Lifecycle 각 단계에서 제공되는 다양한 callback method와 설정등을 활용해보자.

 

728x90
반응형
LIST

'Programming > Spring' 카테고리의 다른 글

Spring 동시성 제어를 위한 트랜잭션 관리  (1) 2024.11.26
Spring Batch  (0) 2024.11.23
[Spring] Swagger에 대해서  (1) 2024.09.05
Cron을 이용한 Scheduling 방법  (0) 2024.08.19
Maven 과 Gradle  (0) 2024.07.21