728x90
반응형
[스프링 Core] 스프링 빈 초기화(@PostConstruct, @PreDestroy)
우리는 스프링 빈을 등록하고 초기화 해야하는 작업을 해야할 때가 있습니다.
객체를 생성할 때 초기화하면 되지 않나? 🤔 라고 생각할 수 있습니다.
하지만, 객체를 생성하는 생성자와 초기화 작업은 분리하는 것이 좋습니다.
그렇다면 어떻게 스프링 빈을 초기화할 수 있을까요?
참고
생성자 안에서 상대적으로 무거운 초기화 작업을 함께 하는 것보다는 객체를 생성하는 부분과 초기화 하는 부분을 명확하게 나누어 관리하는 것이 유지보수에도 좋습니다.
스프링 빈 생명주기 🌱
먼저 스프링 빈의 생명주기에 대해서 알아야 합니다.
스프링 빈은 아래와 같은 생명주기를 갖고 있습니다.
객체 생성 -> 의존관계 주입 -> (데이터 사용 가능)
스프링 빈은 객체를 생성하고, 의존관계 주입이 다 끝난 다음에야
필요한 데이터를 사용할 수 있는 준비가 완료됩니다.
그런데 개발자가 의존관계 주입이 완료된 시점을 어떻게 알 수 있을까요?
스프링은 의존관계 주입이 완료되면 스프링 빈 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공합니다.
싱글톤 전략일 경우 스프링 빈의 이벤트 생명주기
1. 스프링 컨테이너 생성
2. 스프링 빈 생성
3. 의존관계 주입
4. 초기화 콜백
5. 사용
6. 소멸전 콜백
7. 스프링 종료
초기화 콜백은 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출 됩니다.
소멸전 콜백은 빈이 소멸되기 직전에 호출 됩니다.
스프링 빈 초기화 콜백, 소멸전 콜백 예제(@PostConstruct, @PreDestroy)
Restaurant
public class Restaurant {
private String status;
public Restaurant() {
System.out.println("생성자 호출.. 가게상태="+status);
}
@PostConstruct
public void init() {
System.out.println("초기화 콜백.. 가게상태="+getStatus());
}
@PreDestroy
public void close() {
setStatus("가게 마감");
System.out.println("소멸전 콜백.. 가게상태="+getStatus());
}
public void setStatus(String message) {
this.status = message;
}
public String getStatus() {
return status;
}
}
BeanLifeCycleTest
public class BeanLifeCycleTest {
@Test
@DisplayName("빈 라이프사이클")
void beanLifeCycle() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(LifCycleConfig.class);
Restaurant client = ac.getBean(Restaurant.class);
ac.close();
}
@Configuration
static class LifCycleConfig {
@Bean
public Restaurant restaurant() {
Restaurant restaurant = new Restaurant();
restaurant.setStatus("가게 오픈");
return restaurant;
}
}
}
결과
참고
728x90
반응형
'0+ 스프링 > 0+ 스프링 Core' 카테고리의 다른 글
[스프링 Core] 도대체 DI(Dependency Injection) 란 무엇인가? (0) | 2023.06.17 |
---|---|
[스프링 Core] @Configuration를 사용하면 싱글톤을 유지할 수 있는 이유(CGLIB) (0) | 2023.06.02 |