실무 중에는 sdk를 이용하여 외부시스템에 접속해 api콜해야하는 경우가 종종 (혹은 자주) 있는데
이전에는 외부시스템에 api콜 할 때마다 connect와 disconnect를 반복했다.
그러다 Connection객체를 어플리케이션 생명주기 내내 살려두고 필요할 때마다 갖다 써야 하는 경우가 있었는데
Connection객체 생성이야 @PostConstruct 어노테이션을 이용해 어플리케이션 시작 시 미리 잘 생성해주었지만
어플리케이션 종료 시 disconnect를 해줘야 하는데, 그런 코드가 어디에도 없었다.
이렇게 두면 어플리케이션 종료 시 자원반납이 이뤄지지 않아 누수가 일어난다.
해결책은 간단하다.
@PreDestroy 어노테이션을 사용하여 어플리케이션 종료 시 disconnect될 수 있도록 하면 된다.
@PreDestroy
public void disconnect(){
...
}
이 밖에도, 어플리케이션 시작과 종료 시 메소드가 자동으로 실행되도록 할 수 있는 방법들이 있다.
InitializingBean, DisposableBean 인터페이스를 구현하여 afterPropertiesSet메소드와 destroy를 Overriding한다. (상황에 맞게 필요한 인터페이스만 구현)
public class ConnectManager implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
}
@Override
public void destroy() throws Exception {
}
}
단 springframework에서 제공하는 인터페이스이기 때문에 코드가 스프링 의존적일 수 밖에 없다는 문제가 있어 사용은 권장되지 않는다.
Bean등록 시 초기화, 종료 메소드 지정
@Configuration
public class AppConfig {
@Bean(initMethod = "connect", destroyMethod = "disConnect")
public ConnectManager connectManager(){
return new ConnectManager();
}
}
수동 빈 등록 시 위와 같이 대상 클래스의 메소드 명을 입력하여 초기화와 종료 메소드를 지정해줄 수 있다.
코드를 직접 수정하지 않아도 초기화, 종료 메소드를 지정할 수 있으므로 코드 수정이 불가한 라이브러리의 초기화 , 종료 메소들르 지정해주고 싶은 경우 사용할 수 있다.
<추가>
@PostConstruct 와 @PreDestroy는 Java에서 제공하는 기능이다. Spring이 아닌 다른 컨테이너 환경에서도 동일하게 적용된다.