스프링 빈 생명주기 콜백

Red Culture·2021년 9월 9일
0

스프링 빈은 객체를 생성하고, 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료되기 때문에 초기화 작업은 의존관계 주입이 모두 완료되고 난 이후에 호출해야 한다.

의존관계 주입이 모두 완료되는 시점을 알기 위해 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 3가지 방법이 있다.

  • 스프링 빈의 이벤트 라이프 사이클
    스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 (빈이 생성되고 의존관계 주입 완료 후 호출) -> 사용 -> 소멸 전 콜백 (빈이 소멸되기 직전에 호출) -> 스프링 종료

스프링 빈 생명주기 콜백을 지원하는 3가지 방법

  • InitializingBean, DisposableBean 인터페이스를 사용하는 방법
    afterPropertiesSet(), destroy() 메서드를 통해 의존관계 주입 후 호출하고, 스프링 컨테이너의 종료가 호출되자 소멸 메서드가 호출된다. 이 방식의 단점은 스프링 전용 인터페이스이기 때문에 의존적이고, 메서드의 이름을 변경할 수 없다. 변경할 수 없는 외부 라이브러리에 적용할 수 없다. 거의 사용하지 않는 방식이다.
    // 스프링 의존관계 주입 후 호출
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("NetworkClient.afterPropertiesSet");
        connect();
        call("초기화 연결 메세지");
    }

    // 빈이 종료될 때 호출
    @Override
    public void destroy() throws Exception {
        System.out.println("NetworkClient.destroy");
        disconnect();
    }
  • 빈 등록 시 초기화, 소멸 메서드를 지정해주는 방법
    빈 등록 시에 초기화 메서드명, 소멸 메서드명 지정하면 된다. 위 방식의 단점을 보완한다.
    destroyMethod는 기본값이 추론으로 등록이 되어 있어서 close, shutdown라는 이름의 메서드를 자동으로 호출해준다. 직접 스프링 빈으로 등록하면 종료 메서드는 따로 적어주지 않아도 잘 동작한다. 추론 기능을 사용하기 싫으면 destroyMethod="" 설정하면 된다.
@Bean(initMethod = "init", destroyMethod = "close")
  • @PostConstruct, @PreDestroy 어노테이션 사용하기
    외부 라이브러리에는 적용하지 못하지만, 최신 스프링에서 권장하는 이 방법을 사용하는 것이 제일 좋다. 외부 라이브러리를 초기화, 종료해야한다면 위 방법의 @Bean 기능을 사용하면 된다.
@PostConstruct
public void init() {
    System.out.println("NetworkClient.init");
    connect();
    call("초기화 연결 메세지");
}

@PreDestroy
public void close() {
    System.out.println("NetworkClient.close");
    disconnect();
}

*참고 자료
스프링 핵심 원리 - 기본편 (김영한님)

profile
자기 개발, 학습 정리를 위한 블로그

0개의 댓글