당니의 개발자 스토리

인터페이스 InitializingBean, DisposableBean 본문

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

인터페이스 InitializingBean, DisposableBean

clainy 2024. 1. 26. 18:49

인터페이스 InitializingBean, DisposableBean

먼저 인터페이스로 초기화소멸 전 콜백받는 방법에 대해서 알아보겠습니다.

InitializingBean, DisposableBean 두 가지를 사용하면 되는데요. 바로 코드로 보여드릴게요.

우리가 만들었던 NetworkClient 에 들어가서, implements 해서 InitializingBean을 받습니다. 이름 그대로 초기화 빈이에요.

option + enter 해서 메서드를 구현하면 됩니다.

InitializingBean에 들어가보면, afterPropertiesSet() 메서드가 있죠. 프로퍼티들이 세팅이 끝나면, 그러니까 의존관계 주입이 끝나면 호출 해주겠다는 의미입니다.

여기에다가 뭘 호출해주면 될까요?

이 부분을 복사하고 지운 다음에,

여기에다가 붙여넣습니다. 이렇게 두면, 스프링이 의존관계 주입을 다 끝내고, 알아서 connect랑 call을 그때 호출해줍니다.

그 다음에 DisposableBean 이라는 게 있어요.

DisposableBean 안에는 destroy() 메서드가 있죠.

그래서 implements 하고 메서드를 구현해주면,

destroy가 들어오면, 우리가 기존에 만들었던 disconnect()를 호출해주는 거예요.

이렇게 하면 싱글톤 빈이기 때문에 스프링 컨테이너가 올라올 때 빈들이 생성이 되고, 의존관계 주입이 다 끝나고 나면,

얘가 호출되고, 빈이 종료될 때는

destroy가 호출 됩니다.

이제 테스트를 돌려볼게요.

돌려보면,

생성자를 호출 하는 단계에서는 당연히 url에 정보가 없죠. 그리고 생성이 다 끝나고 의존관계 주입이 다 끝난 다음에,

afterPropertiesSet()가 호출되면서, 그 안에 있는 connect가 호출될 겁니다.

그냥 여기에다가 soutm 해서 찍어볼게요.

이렇게 찍어보고 테스트를 다시 돌려보겠습니다.

그래서 다시 객체의 생성이 끝난 다음에, 의존관계 주입을 하고 afterPropertiesSet() 안에 있는 connect와 call이 호출 되면서 메시지를 보내줍니다.

그리고나서, 디버그 로그에 보면

Closing이 호출 됐죠. 스프링 컨테이너가 내려가는 거예요.

그러면 컨테이너가 내려가서 종료하기 에, 싱글톤 빈들이 하나씩 죽거든요. 그 때 NetworkClient.destroy()가 호출된 겁니다. 그 속에 있는 disconnect()를 안전하게 호출해주면서, 컨테이너의 close()까지 안전하게 된 걸 볼 수 있습니다.

이렇게 안전하게 호출이 되고나면 스프링이 내려가겠죠.

우리가 그전까지는 초기화 메서드를 직접 호출했어요. 그런데 이제는 스프링이 그 기능을 제공해서 알아서 초기화 메서드와 종료 메서드를 적절한 시기에 호출해주고 있죠.


그래서 정리를 해보면,

초기화, 소멸 인터페이스가 가진 단점이 있습니다.

일단 이 인터페이스는 스프링 전용 인터페이스예요. 해당 코드가 전부 스프링 전용 인터페이스에 의존적으로 설계를 해야돼요. afterPropertiesSet()destroy() 메서드 이름 조차도 스프링이 주는 대로 그대로 가져다 써야되는 거죠.

그리고 당연히 import스프링으로 해줘야되구요. 애노테이션까지는 괜찮은데, 이렇게 코드 레벨import 해서 인터페이스까지 가져오는 건 부담되긴 합니다.

그래서 초기화, 소멸 메서드의 이름을 변경할 수 없구요.

내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없습니다. 예를 들어서 다운 받은 어떤 라이브러리가 있어요. 그런데 내가 이거를 코드를 못 고치는 거예요.

지금 빈의 초기화 종료 메서드를 무조건 호출해줘야 되는 거예요. implements 해서 인터페이스 상속받고, afterPropertiesSet()destroy() 메서드를 써줘야하는데, 코드를 고칠 방법이 없겠죠.

그래서 참고로 인터페이스를 사용하는 초기화, 종료 방법은 스프링 초창기에 나온 방법들이고, 지금은 더 나은 방법들이 있어서 거의 사용하지 않습니다.

그래서 이 방법보다는 훨씬 나은, 이름도 내가 지정할 수 있고, 빈을 등록할 때 초기화 하고, 소멸하는 메서드에 대해서 다음 시간에 알아보겠습니다.