Spring

[SPRING] Bean Life cycle, call back

chanyoun 2023. 3. 5. 20:58

📌 커넥션풀, 소켓같은 애플리케이션 시작시점에 필요한 연결을 미리 해둔뒤, 애플리케이션 종료시점에 모든 연결을 종료하는 작업을 하기위해선 객체의 초기화 작업 및 종료 작업이 필요하다. 이를 Spring을 통해 할수 있는 방법을 알아본다.

✔ Spring Bean Life Cycle

스프링 빈은 다음과 같은 라이프 사이클을 가진다.

  • 객체생성 ▶ 의존관계 주입

따라서 의존관계를 주입한뒤 개발자가 필요한 초기화 작업을 진행해야한다. 이때 Spring은 개발자에게 의존관계 주입이 완료되었다는것을 알려주기위한 초기화 콜백 을 제공하며, bean이 소멸되기 직전 즉 스프링 컨테이너가 종료되기 직전에 소멸전 콜백 을 알려주는 기능을 제공한다.

 

 

✔ Spring의 call back

  1. 인터페이스를 통한 콜백
    • InitializingBean 인터페이스를 implements하면 아래 코드와같은 메서드를 오버라이드 할수있다.
      @Override
          public void afterPropertiesSet() throws Exception {
             ...
          }
    이 메서드를 통해 의존관계가 끝난시점에 수행할 동작을 지정해 줄수 있다.
    • DisposableBean 인터페이스를 implements하면 아래 코드와같은 메서드를 오버라이드 할수있다.
      @Override
          public void destroy() throws Exception {
              ...
          }
    이 메서드를 통해 스프링 컨테이너가 종료되기 직전 수행할 동작을 지정해 줄수 있다.

❗ 하지만 인터페이스를 통한 콜백은 메서드의 이름을 변경할수 없으며, 스프링 전용 인터페이스에 의존하며 내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다 이러한 여러 단점들로 현재는 거의 사용하지 않는다.

  1. 빈 등록 초기화, 소멸 메서드 지정
    • 설정정보에 @Bean(initMethod = "init", destroyMethod = "close") 을 추가해주면 초기화메서드는 init(사용자가 만든 메서드 이름), 소멸 메서드는 close(사용자가 만든 메서드 이름)로 간편하게 지정할수있다.
    • 빈 등록을통해 메서드를 지정하면 인터페이스를 통한 콜백에서의 단점들을 극복할수 있으며 추가적으로 destroyMethod의 default 값은 inferred 인데 이렇게 default값으로 놓으면 알아서 close, shutdown이라는 이름의 메서드를 호출해준다.
    • 이기능은 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할때 대부분의 외부 라이브러리들의 종료 메서드의 이름이 close 나 shutdown 이기때문에 유용하게 사용될수 있다.
  1. 애노테이션 @PostConstruct, @PreDestroy
    • 의존관계 주입후에 실행시킬 메서드에 @PostConstruct 소멸직전에 실행시킬 메서드에 @PreDestroy를 적어주면 끝난다.
    • 매우 편리하게 사용할수 있지만 단점이있다면 외부 라이브러리에서 사용할수 없다는 점이다.

📌결론적으로 평소에는 @PostConstruct, @PreDestroy 애노테이션 을 사용하고 외부라이브러리를 초기화 또는 종료해야 한다면 빈 등록 초기화, 소멸 메서드 지정을 사용하자.

 

 

🙏Reference

'Spring' 카테고리의 다른 글

[SpringMVC] addViewController사용할때 주의할점  (0) 2023.04.09
[SPRING] Bean Scope  (0) 2023.03.05
[SPRING] 의존관계 자동 주입  (1) 2023.03.05
[SPRING] Component scan  (0) 2023.03.03
[SPRING] Singleton  (0) 2023.02.26