Basic#7 Bean LifeCycle Callback

6237 단어 SpringSpring

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 최초 작성

좋은 웹페이지 즐겨찾기