1 분 소요

본 포스트는 Inflearn의 김영한님 강의를 바탕으로 작성했습니다.

빈 생명주기 콜백

콜백의 필요성

  • DB, network 커넥션들을 애플리케이션 시작 시점에 미리 연결해둬야 빠르게 사용할 수 있다.
  • 이를 위해서는 객체의 초기화와 종료 작업이 필요하다.

스프링 빈의 라이프사이클

  1. 객체 생성
  2. 의존관계 주입
  • 스프링 빈은 객체가 생성되고, 의존관계 주입이 다 끝나야 사용할 수 있다.
  • 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다.
  • 뿐만 아니라 스프링 컨테이너가 종료되기 직전에 소멸 콜백도 해준다.

스프링 빈의 이벤트 라이프사이클

  1. 스프링 컨테이너 생성
  2. 스프링 빈 생성
  3. 의존관계 주입
  4. 초기화 콜백
  5. 사용
  6. 소멸전 콜백
  7. 스프링 종료

스프링이 빈 생명주기 콜백을 해주는 방식

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

태그:

카테고리:

업데이트: