본문 바로가기
Study/SpringBoot

[Spring] Bean 생명주기 콜백

by 검프 2021. 8. 20.

콜백이란 어떤 이벤트가 발생했거나 특정 시점에 도달했을 때 시스템에서 호출하는 함수를 말해요.

Bean 생명주기 콜백(Bean LifeCycle Callback)이란 단어를 들으면, 머릿속에 딱 와닿는 느낌이 없는듯해요. 각 단어에 많은 의미가 있기 때문이라 생각해요.
생명주기 콜백을 알아보기 전 각 용어에 대해 짚고 가볼 필요가 있어요.


스프링 빈 (Spring bean)

또는 빈 객체스프링이 IoC 방식으로 관리하는 오브젝트라는 뜻이에요. 주의할 점은 스프링을 사용하는 애플리케이션에서 만들어지는 모든 객체가 다 빈은 아니라는 사실이에요. 그중에서 스프링이 직접 생성과 제어를 담당하는 객체만을 빈이라고 불러요.


Bean 생명주기

Bean 객체가 생성되어 소멸하기 전까지의 모든 과정을 이르는 말이에요.
스프링이 관리하는 객체인 빈은 그 생성과 다른 빈에 대한 의존관계 주입, 초기화(메소드 호출), DI와 DL을 통한 사용, 제거(메소드 호출)에 이르기까지 모든 객체의 생명주기를 스프링 컨테이너가 관리해요.


빈 생명주기 콜백 메소드(Bean LifeCycle Callback Method)

스프링 컨테이너는 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화, 종료 시점을 알려주는 다양한 기능을 제공해요.
콜백이란 어떤 이벤트가 발생했거나 특정 시점에 도달했을 때 시스템에서 호출하는 함수를 말해요.
스프링 빈의 이벤트 라이프사이클은 이래와 같아요
[스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료]

초기화 콜백 메소드 & 제거 콜백 메서드

초기화 콜백 메소드는 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출돼요.
제거 콜백 메소드는 빈이 소멸하기 직전에 호출돼요

스프링에서는 이를 어떻게 지원하는지 알아보죠.

InitializingBean, DisposableBean

  • afterPropertiesSet() 메서드로 초기화를, DisposableBean은 destroy() 메서드로 소멸을 지원
  • 스프링 전용 인터페이스. 해당 코드가 스프링 전용 인터페이스에 의존
  • 초기화, 소멸 메서드의 이름을 변경할 수 없음
  • 인터페이스를 사용하는 초기화, 종료 방법은 스프링 초창기에 나온 방법들이고, 지금은 다음의 더 나은 방법들이 있어서 거의 사용하지 않음

@Bean(init-method), @Bean(destroyMethod)

  • @Bean(initMethod = "init", destroyMethod = "close")처럼 지정
  • 메서드 이름을 자유롭게 줄 수 있음
  • 스프링 빈이 스프링 코드에 의존하지 않음
  • 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있음
  • @Bean의 destroyMethod는 기본값이 (inferred)(추론) 으로 등록되어 있기에 close, shutdown이라는 이름의 메서드를 자동으로 호출해줌. 이름 그대로 종료 메서드를 추론해서 호출

@PostConstruct, @PreDestory 애노테이션 지원

  • 최신 스프링에서 가장 권장하는 방법
  • 애노테이션 하나만 붙이면 되므로 매우 편리함
  • 패키지를 잘 보면 javax.annotation.PostConstruct 임. 스프링에 종속적인 기술이 아니라JSR-250이라는 자바 표준이다. 따라서 스프링이 아닌 다른 컨테이너에서도 동작함
  • 컴포넌트 스캔과 잘 어울림
  • 유일한 단점은 외부 라이브러리에는 적용하지 못한다는 것. 외부 라이브러리를 초기화, 종료해야 하면 @Bean의 기능을 사용

질문

콜백이라는 단어를 어떻게 정의할 수 있을까 ?

댓글