빈 생명주기 콜백

Seyeong·2022년 10월 25일
0

스프링

목록 보기
4/7

스프링 빈의 이벤트 라이프사이클 (싱글톤)

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

초기화 콜백 : 빈이 생성되고, 의존관계까지 모두 주입됐을 때 실행
소멸 전 콜백 : 빈이 소멸되기 직전에 호출

빈 생명주기 콜백의 종류

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

1. 인터페이스(InitializingBean, DisposableBean)

InitializingBean 인터페이스를 Implements 하면 추상메서드인 afterPropertiesSet()를 상속받을 수 있고, 여기에 빈 초기화시 동작할 로직을 작성하면 된다.

DisposableBean 인터페이스를 Implements 하면 추상 메서드인 destroy()를 상속받을 수 있고, 여기에 빈 소멸 전에 동작할 로직을 작성하면 된다.

인터페이스 초기화, 소멸 방식의 단점

  • 이러한 인터페이스는 스프링 전용 인터페이스로, 스프링에 의존적이다.
  • 초기화, 소멸 메서드명을 변경할 수가 없다
  • 내가 코드를 고칠 수 없는 외부 라이브러리의 경우엔 인터페이스를 상속 받는 코드를 적을수조차 없다.

이러한 치명적인 단점들로 인해 인터페이스 방식은 잘 사용하지 않는다. (2003년에 나온 기능이라 그런지 더 구리네)

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

@Bean(initMethod="initMethodName", destroyMethod="asdf")
식으로 @Bean에 초기화와 소멸 메서드를 지정해 줄 수 있다. 이렇게 하면 해당 스프링 빈 객체 내부에 있는 메서드를 호출하게 되므로 당연히 객체 내부엔 위와 같은 이름의 메서드를 가지고 있어야 한다.

설정 정보 특징

  • 메서드 이름을 자유롭게 지정가능
  • 스프링 빈이 스프링 코드에 의존하지 않음 (스프링을 import 하지 않음)
  • 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.

종료 메서드 추론 (inferred)

@Bean의 destroyMethod() 기능에는 아주 특별한 기능이 있다. 외부 라이브러리의 경우 대부분 종료하는 메서드의 이름은 close(), shutdown() 의 이름을 가지게 되는데 @Bean의 destroyMethod()의 기본값은 inferred(추론)로 지정되어 있다. 이 추론 기능은 외부 라이브러리에 위와 같은 종료 메서드를 추론하여 찾아 실행시킨다. 따라서 외부 라이브러리를 스프링 빈으로 등록 시 따로 종료 메서드를 적어주지 않아도 정상 동작한다.
만약, 추론 기능을 사용하기 싫으면 destroyMethod="" 로 공백을 넘겨주면 된다.

이 방법도 쓰긴 하지만 마지막 방법이 굉장히 유용하게 사용된다.

3. @PostConstruct, @PreDestroy 어노테이션 지원

초기화 및 소멸 시 실행할 로직 메서드 위에 @PostConstruct나 @PreDestroy를 적어주면 된다.

@PostConstruct, @PreDestroy 특징

  • 최신 스프링에서 가장 권장하는 방식이다.
  • 어노테이션만 붙이므로 매우 편리하다.
  • javax 진영에서 지원하는 어노테이션으로, 추후에 스프링에서 다른것으로 바꾸어도 크게 상관없다.
  • @ComponentScan과 잘 어울린다. @Component로 등록한 빈에도 무리없이 초기화 및 소멸 메서드를 적을 수 있다.
  • 유일한 단점은 외부 라이브러리에는 적용하지 못한다는 것이다. 그러니 외부 라이브러리에 초기화 및 종료 작업을 하려면 @Bean 기능을 사용하자.

0개의 댓글