✔ Inflearn 강의 수강 내용 정리글입니다!
객체의 초기화와 종료 작업이 필요할 때가 있다.
ex) 네트워크 소켓처럼 애플리케이션 시작 전에 필요한 연결을 미리 해두고, 종교 시점에 모든 연결 종료
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url = " + url);
connect();
call("초기화 연결 메시지");
}
public void setUrl(String url) {
this.url = url;
}
//서비스 시작시 호출
public void connect() {
}
public void call(String message) {
}
//서비스 종료시 호출
public void disconnect() {
}
}
public class BeanLifeCycleTest {
@Test
public void lifeCycleTest() {
ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
NetworkClient client = ac.getBean(NetworkClient.class);
ac.close(); //스프링 컨테이너를 종료, ConfigurableApplicationContext 필요
}
@Configuration
static class Life**텍스트**CycleConfig {
@Bean
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
}
객체 생성 ➡ 의존관계 주입
스프링은 의존관계 주입이 끝난 후 콜백 메서드를 통해 스프링 빈에게 초기화 시점을 알려준다
스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준 다.
📍 스프링 빈의 이벤트 라이프 사이클
스프링 컨테이너 생성 ➡ 스프링 빈 생성 ➡ 의존관계 주입
➡ 초기화 콜백 ➡ 사용 ➡ 소멸 전 콜백 ➡ 스프링 종료
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
...
@Override
public void afterPropertiesSet() throws Exception {
connect();
call();
}
@Override
public void destroy() throws Exception {
disConnect();
}
InitializingBean
은 afterPropertiesSet() 메서드로 초기화 지원DisposableBean
은 destroy() 메서드로 소멸 지원지금은 거의 사용하지 않는 방법들!
설정 정보에 @Bean(initMethod = "init", destroyMethod = "close")
처럼 지정 가능
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
public void init() {
connect();
call("초기화 연결 메시지");
}
public void close() {
disConnect();
}
@PostConstruct
public void init() {
connect();
call("초기화 연결 메시지");
}
@PreDestroy
public void close() {
disConnect();
}
📍 @PostConstruct, @PreDestroy 어노테이션을 사용하자
📍 외부 라이브러리 초기화, 종료 필요 시 @Bean의 initMethod
, destroyMethod
를 사용하자
[출처 - Inflearn : 스프링 핵심 원리 - 기본편]
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard