스프링

빈 생명주기 콜백

salmon16 2023. 7. 24. 21:46

데이터베이스 커넥션 풀, 네트워크 소켓처럼 애플리케이션시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다.

 

스프링 빈은 객체를 생성하고 의존관계를 주입한 다음 필요한 데이터를 사용할 수 있는 준비가 된다. 

그러므로 초기화 작업은 읜존관계주입이 끝난 다음에 해야 한다. 

 

이를 위해서는 개발자는 의존관계 주입이 완료된 시점을 알아야 하는데 스프링은 의존관계 주입이 완료되거나 스프링 컨테이너가 종료되기 직전에 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 여러 가지 기능을 제공한다.

요약하자면 

스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 빈 사용 -> 소멸 전 콜백 -> 스프링 종료.

 

이제 여러가지 콜백 방법을 알아보자

  • 인터페이스 (initializingBean, DisposableBean)
  • 설정 정보에 초기화 메서드, 종료 메서드 지정
  • @PostConstruct, @PreDestory 애노테이션 지원

인터페이스 InitializingBean, DisposableBean 사용

사용할 클래스에 아래 두 가지 인터페이스를 implements를 한다.

implements InitializingBean, DisposableBean

 

그러면 2가지 함수를 Override하게 된다.

@Override
public void afterPropertiesSet() throws Exception {
    //초기화 코드
}

@Override
public void destroy() throws Exception {
    //소멸 코드
}

InitializingBean은 afterPropertiesSet() 메서드로 초기화를 지원하고 저 함수에 초기화 코드를 작성하면 된다.

DisposableBean은 destroy() 메서드로 소멸을 지원하고 함수 코드로 소멸 시 원하는 코드를 작성하면 된다.

빈 등록 초기화, 소멸 메서드 지정

설정 정보에 @Bean(initMethod = "초기화 메소드메서드 이름" , destroyMethod = "소멸 메서드 이름")를 이용하여 메서드를 지정할 수 있다.

아래 예시를 통해 알아 보자.

@Configuration
static class LifeCycleConfig {
    @Bean(initMethod = "init", destroyMethod = "close")
    public NetworkClient networkClient() {
        NetworkClient networkClient = new NetworkClient();
        networkClient.setUrl("http://hello-spring.dev");
        return networkClient;
    }
}
public void init(){
    connect();
    call("초기화 연결 메세지");
}

public void close(){
    disconnect();
}

이렇게 등록하면 된다.

애노테이션 @PostConstruct, @PreDestroy 사용

가장 간단하고 많이 사용하는 방법이다

@PostConstruct
public void init(){
    connect();
    call("초기화 연결 메세지");
}
@PreDestroy
public void close(){
    disconnect();
}

그냥 @PostConstruct(초기화), @PreDestroy(소멸) 이 두 애노테이션만 사용하면 된다.

하지만 이 방식은 외부 라이브러리에는 적용하지 못한다는 단점이 있다 이런 경우 2번째 방법인 @Bean의 기능을 사용하자.

 

출처 : 인프런 스프링 핵심 원리 - 기본 편  김영한