Spring

[스프링] 빈 생명주기 콜백에 관하여

Tommy__Kim 2023. 5. 25. 12:03

애플리케이션이 시작되었을 때 초기화 작업, 종료되기 전에 종료 작업이 필요한 경우가 있습니다. 

스프링 빈은 객체가 생성되고, 의존관계 주입이 끝나야 사용가능한 상태가 됩니다.

개발자들은 어떻게 그 시기를 알 수 있으며, 종료 전에 종료작업을 진행 할 수 있을까요? 

=> 콜백메서드를 통해 초기화 작업 및 종료 작업을 진행할 수 있습니다. 

 

스프링 빈의 생명주기 

스프링 빈의 경우 두가지 등록 과정을 거칩니다. 

  • 스프링 빈 생성 
  • 의존관계 주입 

두가지 등록 과정을 마쳤을 때, 사용가능한 상태가 됩니다. 이 때, 스프링이 초기화 콜백메서드를 호출해 줍니다. 

또한 스프링은 스프링이 종료되기 전에 소멸전 콜백메서드를 호출해 줍니다.


빈 생명주기 콜백 방식

빈 생명주기 콜백 방식은 크게 3가지로 나뉩니다.

  • 인터페이스 (InitializingBean, DisposableBean) 구현
  • @Bean 설정 정보에 초기화 메서드 및 종료 메서드 지정
  • @PostConstruct, @PreDestory 사용 

본문부터 말하자면 @PostConstruct, @PreDestroy 어노테이션을 사용하는 것을 권장합니다. 

인터페이스 구현 

스프링은 InitializingBean, DisposableBean 인터페이스를 제공합니다. 

초기화 및 소멸전 콜백을 하고자 하는 클래스에서 초기화 작업의 경우 InitializingBean을, 종료 전 작업의 경우 DisposableBean을 구현하면 됩니다. 

이 방식에는 다음과 같은 단점이 존재합니다. 

  • 스프링에서 제공하는 인터페이스 
    • 코드가 스프링 전용 인터페이스에 의존
  • 초기화, 소멸 메서드의 이름을 변경 할 수 없다. 
  • 수정이 불가능한 외부 라이브러리에 적용 불가 

@Bean 설정 정보에 초기화 메서드 및 종료 메서드 지정

@Configuration이 붙은 클래스에서 초기화 및 종료 메서드를 지정하고자 하는 클래스를 스프링 빈에 등록할 때 @Bean에 메서드를 지정할 수 있습니다. 

@Bean을 등록할 시에 사용가능한 옵션 값들 중 initMethod, destroyMethod가 있습니다. 

초기화 하고자 하는 메서드를 initMethod에 등록, 종료 전 실행하고자 하는 메서드를 destroyMethod에 등록하면 됩니다. 

destroyMethod에 default 값은 "(inferred)" 입니다.

만약 destroyMethod 이름이 close 혹은 shutdown과 같다면 destroyMethod를 지정해주지 않아도 알아서 호출됩니다. 

 

@Bean 설정 정보에 지정하는 방식의 특징은 다음과 같습니다. 

  • 메서드 이름 지정이 자유롭다.
  • 스프링 코드에 의존적이지 않다. 
  • 수정이 불가능한 외부라이브러리에도 적용이 가능하다. 

@PostConstruct, @PreDestory

초기화 과정을 하는 메서드에는 @PostConsturct, 종료 작업을 하는 메서드에는 @PreDestroy를 붙여주면 됩니다. 

메서드명은 개발자가 원하는 메서드명을 지정해주면 됩니다. 

어노테이션을 사용하는 방식의 특징은 다음과 같습니다. 

  • 어노테이션만 붙이면 되므로 비교적 편리하다. 
  • javax.annotation package에 해당한다. 
    • 스프링이 아닌 다른 컨테이너에서도 동작한다.
  • 외부라이브러리에 적용이 불가하다. 

정리

이렇게 초기화 및 종료 작업을 지정할 수 있는 방법들을 알아보았습니다. 

  • 개발자가 수정 가능한 코드
    • @PostConstruct, @PreDestory 어노테이션 활용 
  • 개발자가 수정 불가능한 코드 
    • @Configuration 관련 설정을 할 때 @Bean을 활용해 initMethod, destoryMethod 지정

'Spring' 카테고리의 다른 글

JdbcTemplate 사용 방법에 대해서  (0) 2023.07.01
프론트 컨트롤러 패턴은 무엇인가요?  (0) 2023.06.01
Spring의 핵심 Concept는 무엇인가  (0) 2023.05.23
Enum Validation  (0) 2023.04.24
Spring Bean의 생명주기  (0) 2023.04.21