본문 바로가기

back-end/spring

spring/ 빈 생명주기 콜백

 

스프링 컨테이너가 생성되면 @Component나 @Bean이 붙은 것들을 찾아 스프링 빈을 생성하고, 의존 관계를 주입한다. 이후 초기화 콜백이 이루어지고 사용이 끝난 후에 소멸 전 콜백을 주고 스프링이 종료된다.

 

1. InitializingBean, DisposableBean 인터페이스

클래스 생성 시 InitializingBean, DisposableBean 인터페이스를 구현하게 한다.

 

  • 스프링 전용 인터페이스로, 스프링에 의존한다
  • 초기화, 소멸 메서드의 이름을 변경할 수 없다
  • 코드 수정이 불가한 외부 라이브러리에 적용할 수 없다.
  • 현재는 거의 사용하지 않는 방법

 

public class BeanCallback implements InitializingBean, DisposableBean {
	...
    
    @Override
    public void afterPropertiesSet() throws Exceoption {...}
    
    @Override
    public void destroy() throws Exception {...}      
}

 


2. 설정 정보에 초기화 메서드와 종료 메서드 지정

@Bean(initMethod="init", destoryMethod="close")처럼 빈 등록 시 옵션으로 초기화, 소멸 메서드를 지정한다.

  • 메서드 이름을 직접 지정 가능하다
  • 생성된 스프링 빈은 스프링 코드에 의존적이지 않다
  • 코드 내부가 아닌 @Bean의 설정 정보를 사용하기 때문에 코드 수정이 불가능한 외부 라이브러리에도 적용 가능하다

 

public class BeanCallback2 {
	...
    
    public void init() {...}
    
    public void close() {...}
}

 

아래와 같이 빈으로 등록할 때 옵션으로 initMethod, destoryMethod에 BeanCallback2 클래스의 임의의 메서드를 지정할 수 있다.

@Configuration
public class BeanLifeCycleConfig {
    @Bean(initMethod="init", destoryMethod="close")
    public BeanCallback2 beanCallback2() {...}
}

 

@Bean의 destoryMethod

라이브러리의 대부분이 close나 shutdown이라는 이름의 종료 메서드를 사용하기 때문에 @Bean은 따로 destroyMethod를 지정하지 않아도 기본값(inferred)에 따라 close나 shutdown의 이름을 가진 메서드를 자동으로 호출한다.

 


3. @PostConstruct, @PreDestroy

javax.annotationPostConstructPreDestroy를 import해 어노테이션을 사용한다.

  • 스프링에 종속적이지 않은 자바 표준으로, 스프링이 아닌 다른 컨테이너에서도 작동한다.
  • 외부 라이브러리에는 적용할 수 없다
  • 가장 편리하며 권장되는 방법이다

 

public class BeanCallback3 {
	...
    
    @PostConstruct
    public void init() {...}
    
    @PreDestroy
    public void close() {...}
}

 

 

@Configuration
public class BeanLifeCycleConfig {
    @Bean
    public BeanCallback3 beanCallback3() {...}
}