본문 바로가기

[Spring] Bean 생명주기와 콜백

@xuv22025. 5. 19. 16:38

스프링 빈의 이벤트 라이프 사이클

스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백 -> 빈 사용 -> 소멸 전 콜백 -> 스프링 셧다운

초기화 콜백 : 빈이 생성 되고, 빈의 의존 관계 주입이 완료된 후에 호출

소멸 전 콜백 : 빈이 소멸되기 직전에 호출


스프링의 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 방식이 주로 사용된다고 하니, 다음 포스팅에선 해당 방법에 대해 따로 다루겠다.

xuv2
@xuv2 :: xuvlog

폭싹 늙었수다

목차