스프링 빈의 이벤트 라이프 사이클
스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백 -> 빈 사용 -> 소멸 전 콜백 -> 스프링 셧다운
초기화 콜백 : 빈이 생성 되고, 빈의 의존 관계 주입이 완료된 후에 호출
소멸 전 콜백 : 빈이 소멸되기 직전에 호출
스프링의 Bean 생명 주기 콜백 지원
1. InitializingBean 인터페이스와 DisposableBean 인터페이스 구현
각각 afterPropertiesSet(), destory() 메서드를 지원하여 초기화와 소멸을 지원하는 스프링의 초창기 방식
-> 이 방식은 스프링 전용 인터페이스에 의존하여 개발자가 직접 초기화 및 소멸 메서드 이름 변경 불가
+ 본인이 직접 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다 -> 뭔소린지 몰라서 요건 맨 마지막에 정리
해당 방법은 너무 하드코딩이라 현재는 잘사용하지 않는다.
2. Bean 초기화 , 소멸 메서드 지정
@Bean(initMethod = "초기화 메서드 명" , destroyMethod = "소멸 메서드 명") 형태로 에노테이션 옵션 지정
초기화 메서드 명을 init(), 소멸 메서드명을 close() 라고 가정하고 해당 클래스에 이 메서드를 다음과 같이 구현 했을 때, 해당 메서드들이 초기화, 소멸 메서드로 지정 된다.

이 방식은 메서드 이름을 유동적으로 변경가능하고, 스프링 빈이 스프링 코드에 의존하지 않는다.
+ 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다. -> 이것도 뭔소린지 몰라서 마지막에 정리
+ @Bean의 destroyMethod 옵션에는 특별한 기능이 있는데, 종료 메서드 추론 기능이 존재한다.
1번 방법 : 본인이 직접 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다
vs
2번 방법 : 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.
인터페이스 구현 필요성: InitializingBean은 afterPropertiesSet(), DisposableBean은 `destroy()` 메서드를 반드시 구현해야 한다. 하지만 외부 라이브러리는 바이트 코드가 아닌 컴파일이 완료된 클래스 파일로써 수정이 불가한 경우가 많다. 즉 -> 해당 인터페이스를 직접 구현 할 수 없기 때문에 초기화, 소멸 메서드를 구현할 수 없다.
이를 위해 @Bean 에노테이션의 옵션들을 사용하면 외부 라이브러리(라이브러이 안에 초기화 소멸 메서드가 이미 구현되어 있는 경우가 많다)에 존재하는 메서드명을 입력해주기면하면 스프링이 해당 메서드를 초기화와 소멸에 사용해준다.
즉 정리하자면, 코드 수정이 반드시 필요한가 + 외부 라이브러리에 적용이 가능한가 + 유연성이 높은가를 따졌을 때 두번째 방법 @Bean(옵션) 방법이 압살이다.
하지만 요새는 위 두가지 방법 보다는 @PostConstruct 와 @PreDestroy 방식이 주로 사용된다고 하니, 다음 포스팅에선 해당 방법에 대해 따로 다루겠다.
'Spring > Core' 카테고리의 다른 글
| [Spring] @ComponentScan , @AutoWired - 자동 Bean 등록 (0) | 2025.06.16 |
|---|---|
| [Spring] Singleton 패턴 : 인스턴스 아나바다 운동 (0) | 2025.06.16 |
| [Spring] 스프링 컨테이너 - ApplicationContext, Bean 조회 (0) | 2025.06.16 |
| [Spring] BeanFactory와 ApplicationContext (0) | 2025.05.25 |
| [Spring] @PostConstruct, @PreDestroy 와 컴포넌트 스캔의 궁합 (0) | 2025.05.19 |