[Spring] 빈 생명주기 콜백
본 포스트는 Inflearn
의 김영한님 강의를 바탕으로 작성했습니다.
빈 생명주기 콜백
콜백의 필요성
- DB, network 커넥션들을 애플리케이션 시작 시점에 미리 연결해둬야 빠르게 사용할 수 있다.
- 이를 위해서는 객체의 초기화와 종료 작업이 필요하다.
스프링 빈의 라이프사이클
- 객체 생성
- 의존관계 주입
- 스프링 빈은 객체가 생성되고, 의존관계 주입이 다 끝나야 사용할 수 있다.
- 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다.
- 뿐만 아니라 스프링 컨테이너가 종료되기 직전에 소멸 콜백도 해준다.
스프링 빈의 이벤트 라이프사이클
- 스프링 컨테이너 생성
- 스프링 빈 생성
- 의존관계 주입
- 초기화 콜백
- 사용
- 소멸전 콜백
- 스프링 종료
스프링이 빈 생명주기 콜백을 해주는 방식
InitializingBean, DisposableBean 인터페이스 사용 (이제 거의 사용되지 않는다.)
public class NetworkClient implements InitializingBean, DisposableBean {
...
@Override
public void afterPropertiesSet() throws Exception {
connect();
call("초기화 연결 메시지");
}
@Override
public void destroy() throws Exception {
disConnect();
}
}
- 빈으로 등록할 클래스에서 afterPropertiesSet(), destroy() 메서드를 구현하면 된다.
- 단점
- 스프링 전용 인터페이스이기 때문에 해당 코드가 스프링 전용 인터페이스에 의존하게 된다.
- 초기화, 소멸 메서드의 이름을 변경하지 못한다.
- 내가 코드를 손볼 수 없는 외부 라이브러리에 적용할 수 없다.
초기화, 소멸 메서드 직접 지정
@Configuration
static class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
- 빈으로 등록할 때, initMethod와 destroyMethod를 직접 등록할 수 있다.
- 그리고 아래 코드와 같이 빈으로 등록할 객체 클래스 안에 함수를 초기화, 소멸 함수를 구현하면 된다.
public class NetworkClient {
...
public void init() {
System.out.println("NetworkClient.init"); connect();
call("초기화 연결 메시지");
}
public void close() {
System.out.println("NetworkClient.close");
disConnect();
}
}
- 메서드 이름을 자유롭게 지을 수 있다.
- 스프링 빈이 스프링 코드에 의존하지 않는다.
- 설정 정보를 사용하는 것이기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.
- destroyMethod는 기본값이 있다.(close, shutdown) -> 따로 종료 메서드를 적어주지 않아도 잘 작동한다.
@PostConstruct, @PreDestroy 사용
public class NetworkClient {
@PostConstruct
public void init() {
System.out.println("NetworkClient.init"); connect();
call("초기화 연결 메시지");
}
@PreDestroy
public void close() {
System.out.println("NetworkClient.close");
disConnect();
}
}
- 에노테이션만 붙이면 되기 때문에 사용하기 굉장히 편하다. (스프링이 밀고 있는 방식)
- 스프링 종속 기술이 아니라 자바 표준이기 때문에 스프링이 아닌 다른 컨테이너에서도 잘 작동한다.
- 외부 라이브러리에는 적용하지 못하기 때문에 외부 라이브러리에 적용하고 싶으면 @Bean에 초기화, 소멸 메서드를 지정하는 방식을 사용하면 된다.
출처
- 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