콜백이란 어떤 이벤트가 발생했거나 특정 시점에 도달했을 때 시스템에서 호출하는 함수를 말해요.
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의 기능을 사용
질문
콜백이라는 단어를 어떻게 정의할 수 있을까 ?
댓글