CallBack이라는 용어는 특정 상태나 작업이 완료된 후 호출되는 함수나 메서드를 의미한다. 스프링의 빈 생명주기 콜백은 빈의 특정 상태 변화(예: 초기화 완료 후, 소멸 전)에 호출되는 메서드를 말하며, 이는 빈의 생명주기 동안 특정 작업이 완료된 뒤 호출되기 때문에 "콜백"이라고 불린다.
결론적으로, 생명주기 콜백은 빈의 여러 생명주기 상태(초기화, 소멸 등)에 따라 실행되는 메서드를 의미한다.

스프링 빈의 이벤트 라이프 사이클은 다음과 같다.
스프링 컨테이너 생성 -> 스프링 빈 생성(생성자 주입) -> 의존관계 주입(수정자 주입) -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 소멸 -> 스프링 종료
객체의 생성과 초기화 분리
생성자는 객체를 생성하는 책임을 가지며, 필수 정보를 받고 메모리를 할당하여 객체를 만드는 작업을 수행한다. 반면, 초기화는 생성된 객체의 값들을 활용하여, 초기에 필요한 동작을 수행하는 것이다.
둘 다 개념적으로는 초기화에 해당하지만, 생성자는 객체 생성 시점의 로직이고, 초기화는 객체 생성 후의 첫 설정 작업이라고 생각할 수 있다. 즉, 객체가 생성되어야 할 수 있는 작업과, 객체가 생성되기 위해 필요한 작업을 구분할 수 있다는 뜻이다.
초기화 작업이 가벼운 작업이라면 생성자에서 모두 처리할 수도 있지만, 초기화 작업이 무겁거나 복잡한 경우에는 생성과 초기화를 명확히 분리하는 것이 좋다.
InitializingBean 은 afterPropertiesSet() 메서드로 초기화를 지원한다. DisposableBean 은 destroy() 메서드로 소멸을 지원한다.하지만 이는 스프링 전용 인터페이스이므로 이렇게 사용한 코드 구성은 스프링 인터페이스에 의존한다.
설정 정보에 @Bean(initMethod = "init", destroyMethod = "close") 처럼 초기화, 소멸 메서드를 지정할 수 있다.
이렇게 사용할 경우 메서드 이름을 자유롭게 줄 수 있으며, 코드가 아니라 설정 정보를 활용하기 때문에 외부라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.
@PostConstruct, @PreDestroy실제로 인터페이스를 활용한 생명주기 콜백 정의는 거의 사용되지 않는 사장된 방법이다. 또한, @Bean의 파라미터에 initMethod, destroyMethod를 제공하는 방식은 가끔 사용되긴 하지만, 일반적이지 않다.
가장 권장되고 일반적인 사용법은 @PostConstruct와 @PreDestroy 애노테이션을 사용하여 초기화 콜백과 종료 콜백을 정의하는 것이다. 이 방법은 코드가 간결하고 가독성이 좋으며, 표준적인 방식으로 널리 사용된다.
@PostConstruct
public void init() {
connect();
call("초기화 연결 메세지");
}
@PreDestroy
public void close() {
disconnect();
}
@PostConstruct와 @PreDestroy는 이름에서 사용 용도가 바로 느껴질 만큼 직관적이다. 스프링의 공식 문서에서도 이 애노테이션 사용을 권장하며, 이는 자바 표준으로 작성된 방식이기 때문에 스프링에 의존적이지 않아 다른 컨테이너에서도 사용 가능하다. 또한, 코드의 가독성도 뛰어나다.
이 방식의 유일한 단점은 직접 애노테이션을 붙여야 하기 때문에 외부 라이브러리(클래스)를 빈으로 등록할 경우 적용이 불가능하다는 점이다. 만약 라이브러리 코드에 초기화 콜백과 종료 콜백 메서드가 존재하더라도, 이를 수정할 수 없으므로 사용할 수 없다. 이러한 경우에는 @Bean 파라미터 방식을 사용해야 한다. 그러나 이러한 특수한 경우를 제외하면, 기본적으로는 @PostConstruct와 @PreDestroy 애노테이션 방식을 사용하는 것이 가장 권장된다.
빈의 생명주기에 대해 이해하자
스프링이 시작되면 컨테이너가 생성되고, 빈들이 구축된다. 이 과정에서 생성자 주입(Constructor DI)이 있다면, 빈이 구축되는 시점에 의존관계 주입이 이루어진다. 반면, 수정자 주입(Setter DI)은 객체 생성 이후에 이루어진다. 그다음으로 초기화가 진행되며, 초기화는 생성자 주입보다 뒤에, 수정자 주입보다 더 뒤에 일어난다. 또한, 빈의 종료 직전에 종료 콜백 메서드가 실행되므로, 종료 시점에 처리해야 할 작업을 수행할 수 있다.
생명주기 콜백 방식은 3가지
@Bean 파라미터 방식: 외부 라이브러리를 빈으로 등록하면서 초기화 및 종료 메서드가 필요할 경우 사용. @PostConstruct, @PreDestroy를 사용하는 방식으로, 가장 권장되며 기본적으로 사용하는 방법.