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와 설정등을 활용해보자.
'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 |