Basic#7 Bean LifeCycle Callback
7. Bean LifeCycle Callback
1. Bean LifeCycle callback
DB 연결 또는 Network socket처럼 application 시작 시점에 필요한 연결을 미리 해둔다. 따라서 Bean이 생성되고 종료되는 시점을 알아야 이러한 연결을 미리 준비하거나 해제할 수 있다.
Spring Bean은 다음과 같은 life cycle을 가진다.
Spring container → Spring Bean 생성 → DI → 초기화 callback → 사용 → 소멸전 callback → Spring 종료
따라서, DI 후 필요한 data를 사용할 준비가 완료되기 때문에 해당 시점을 callback을 통해 알려주는 기능을 spring에서 제공하고 있다.
객체의 생성과 초기화는 분리하자!
생성자는 parameter를 받아 메모리를 할당해서 객체를 생성한다. (대체로 가벼운 로직)
반면, 초기화 및 연결 작업은 무거운 동작을 수행하므로 이를 분리해서 관리하는 것이 유지보수 관점에서 유리하다.
2. Interface
Spring에서 제공하는 interface를 이용하여 callback을 사용할 수 있다.
- InitializingBean
- DisposableBean
해당 interface를 상속받고 afterPropertiesSet()
과 destory()
method를 override해서 각각 시작/종료 시점에 수행하고 싶은 로직을 호출하면 된다.
public class NetworkClient implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet(){
// DB 연결
}
@Override
public void destory() throws Exception {
// DB 연결 해제
}
}
해당 interface는 spring 전용 interface로 spring에 의존성을 가진다는 문제가 있으며 외부 라이브러리에 적용이 불가하다. 따라서 현재는 자주 사용되지 않는 방법이다.
3. Bean 등록 초기화
앞서 사용된 방법은 interface에서 선언한 method를 override하여 구현하였기 때문에 method 명을 수정할 수 없고 외부 라이브러리에 적용이 불가했다. 또한 spring 전용 interface를 상속받았기 때문에 코드에 의존된다.
이를 해결하기 위해서 Bean 객체에 초기화/종료 메소드를 개발자 임의대로 작성하고 이를 설정 정보로 불러와서 사용하는 방법이 있다. 코드가 아닌 설정 정보를 이용하기 때문에 spring에 의존하지 않으며 외부 라이브러리에도 적용이 가능하다.
public class NetworkClient {
public void init(){
// DB 연결
}
public void close(){
// DB 연결 해제
}
}
@Bean
annotation에 init method와 destroy method를 method 명으로 mapping 시켜주면 된다.
@Configuration
public class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient(){ return new NetowkrClient(); }
대부분의 method 들이 close
또는 shutdown
이라는 이름으로 종료 method를 naming한다. detroyMethod의 default값은 (inferred)
로 되어 있는데, 종료 method의 이름이 close 또는 shutdown일 경우 명시하지 않아도 바로 호출하여 사용할 수 있도록 되어 있다.
4. Annotation 이용
위와 같은 과정을 annotation만으로도 더욱 단축시킬 수 있다. 단순히 init method와 destroy method에 각각 @PostContrcut
, @PreDestroy
를 표기하면 된다.
@PostConstruct
public void init(){
// DB 연결
}
@PreDestroy
public void close(){
// DB 연결 해제
}
🛠 계속 업데이트 필요
2022.04.15 최초 작성
Author And Source
이 문제에 관하여(Basic#7 Bean LifeCycle Callback), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dev2danis/Spring-Basic7-Bean-LifeCycle-Callback저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)