당니의 개발자 스토리

빈 등록 초기화, 소멸 메서드 본문

스프링/스프링 핵심 원리 - 기본편

빈 등록 초기화, 소멸 메서드

clainy 2024. 1. 26. 19:02

빈 등록 초기화, 소멸 메서드 지정

이번 시간에는 빈을 등록하는 시점에서 "얘가 초기화야, 얘가 소멸이야" 라고 딱 지정해주는 방법이 있어요. 간단하게 @Bean에다가 initMethoddestroyMethod로 이름을 주면 됩니다.

코드로 바로 해보겠습니다.

implements 부분이랑 import 한 부분 지워주고요.

이름도 맘에 안드니까 바꾸겠습니다.

직관적으로 init()close()로 바꿨습니다. 그 다음에 이제 BeanLifeCycleTest로 가서, 빈을 등록해주면 됩니다.

'networkClient를 빈으로 등록할 건데, 얘의 초기화 메서드는 init이고, 소멸 메서드는 close야' 하고 알려주는 겁니다. 다시 테스트를 돌려보겠습니다.

아까와 마찬가지로 잘 호출됐습니다. 간단하죠.


이제 특징을 말씀드리면,

메서드 이름을 자유롭게 줄 수 있는게 장점이죠. 그리고 스프링 빈이 스프링 코드에 의존하지도 않아요.

현재 스프링 빈인 NetworkClient를 보면,

스프링이 전혀 의존하지 않고있죠.

그리고 이게 제일 큰 장점인데, 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있습니다. 은근 외부 라이브러리 중에 초기화, 종료 메서드를 호출해 줘야되는 게 많거든요. 걔네도 설정 정보에서 스프링 빈으로 등록하면서 이름을 딱 지정을 해주면 되는 거예요. "초기화는 이 메서드를 쓰세요, 종료 할 때는 이 메서드를 쓰세요." 이렇게 할 수 있습니다.

그런데 한 가지가 더 있어요.

다른 때는 발생하지 않고,

@Bean으로 등록할 때만 발생하는 건데요. @Bean의 destroyMethod 속성에는 아주 특별한 기능이 있습니다.

destroyMethod의 디폴트 값이 뭐냐면,

INFER_METHOD = (inferred) 라고 되어있죠. 추측하다, 추론하다 이런 뜻인데요.

정말 destroyMethod가 디폴트로 저 문자 그대로 잡혀있는 거예요. 아까 외부 라이브러리를 갔다쓴다고 했잖아요. 외부 라이브러리가 대부분 종료하는 메서드 이름이 뭐냐면 closeshutdown이에요. 이 이름의 종료 메서드를 일반적으로 많이 사용합니다.

그래서 @Bean의 destroyMethod는 기본값이 (inferred) (추론)으로 등록되어 있어요. 그래서 이 추론 기능은 close , shutdown 라는 이름의 메서드가 있으면, 그냥 얘를 찾아가지고 종료 시점에 자동으로 호출해줘요. 이름 그대로 종료 메서드를 추론해서 호출해줍니다.

따라서 직접 스프링 빈으로 등록하면, 종료 메서드는 따로 적어주지 않아도 잘 동작해요.

요즘에는 @Bean으로 외부 라이브러리를 많이 등록하니까, 이렇게 했는데 "어? 이상하다. 왜 내가 종료 메세드를 호출 해주지도 않았는데 자동으로 호출이 되지?" 라고 생각이 들면, 이 장점을 떠올리시면 됩니다.

그런데 추론 기능을 사용하기 싫으면 destroyMethod="" 처럼 아무 이름 없이 공백을 지정하면 추론 기능이 동작하지 않습니다.

그리고 최근에 java 버전이 올라가면서,

기본 메서드 이름이 close로 많이 되어있어요. AutoCloseable은 한 번 공부하시면 좋습니다. 일반적으로 종료 할 때 close 라는 이름을 많이 쓰다보니까 이 이름을 추론하도록 스프링에서 기능을 넣었습니다.


아직 한 가지가 남았죠. 결론은 3가지 중에서 다음 시간에 설명드리는 걸 쓰면 됩니다.

다음 시간에는 Annotation을 하는 걸 말씀드리겠습니다.