보통 애플리케이션 서버를 올리고 DB커넥션을 연결하면 시간이 오래걸리기 때문에 DB커넥션 풀이나 네트워크 소켓을 이용하여 애플리케이션 시작 지점에 필요한 연결을 미리 준비하여 빠른 응대를 한다. 또 한 종료 시점에는 연결을 모두 안전하게 종료할 필요가 있는데 이를 도와주는 것이 콜백 메서드이다.
스프링 빈의 라이프사이클
스프링 빈은 기본적으로 객체를 모두 생성한 후에 의존 관계 주입을 시작한다. (생성자 주입은 제외) 그렇다면 스프링 빈의 등록 완료 시점을 어떻게 알 수 있을까?
-> 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주며, 스프링 컨테이너가 죵로되기 직전에 소멸 콜백도 준다.
스프링컨테이너생성 → 스프링빈생성 → 의존관계주입 → 초기화콜백 사용 → 소멸전콜백 → 스프링 종료
스프링 빈의 3가지 생명주기 콜백
인터페이스
InitializingBean과 afterPropertiesSet() 메서드로 초기화를 지원하고, DisposableBean은 destory() 메서드로 소멸을 지원한다. 이 방법은 초기화와 소멸 메서드의 이름을 변경할 수 없기 때문에 코드를 고칠 수 없는 외부 라이브러리를 사용하는 경우 적용할 수 없다는 단점이 있다.
public class InterfaceCallback implements InitializingBean, DisposableBean {
...
@Override
public void afterPropertiesSet() throws Exception {
connect();
call("초기화 연결 메세지");
}
@Override
public void destroy() throws Exception {
disConnect();
}
}
빈 등록 초기화, 소멸 메서드 지정
설정 정보에 @Bean(initMethod ="초기화 메서드 이름", destoryMethod = "소멸 메서드 이름") 처럼 초기화 소멸 메서드를 지정하는 방법.
스프링 빈이 스프링 코드에 의존하지 않으며, 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부라이브러리에도 적용할 수 있다.
이 방법은 destoryMethod 속성을 통해 종료 메서드를 추론하는 기능을 제공하기도 한다. 대부분의 라이브러리는 close, shutdown이라는 이름의 종료 메서드를 사용하는데 @Bean의 destoryMethod는 기본값이 (inferred)로 등록되어 있어 close, shutdown이라는 이름의 메서드를 자동으로 호출하도록 도와준다.
어노테이션 @PostConstruct, @PreDestory
스프링에서 가장 권하는 방법으로 애노테이션 하나만 붙이면 되므로 매우 편리하다. 이 어노테이션은 javax.annotion 패키지에 있다. 즉 자바 표준이라 스프링이 아닌 다른 컨테이너에서도 동작한다. 하지만 외부 라이브러리에는 적용하지 못한다는 단점이 있다.
@PostConstruct
public void init() {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메세지");
}
@PreDestroy
public void close() {
System.out.println("NetworkClient.close");
disconnect();
}